2011-08-05 3 views
5

में लेआउटसब्यूव का उपयोग कब करें I iPad के लिए आईओएस एप्लिकेशन लिख रहा हूं जिसके लिए कस्टम लेआउट की आवश्यकता है।आईओएस

पोर्ट्रेट और परिदृश्य से लेआउट पूरी तरह से अंतर है, इसलिए इसे UIAutoResizingMask का उपयोग करके हल नहीं किया जा सकता है।

मैं लेआउट सबव्यूव विधि का उपयोग करने का प्रयास करता हूं, लेकिन मुझे पता चला कि लेआउट सबव्यू को बहुत कुछ कहा जाता है (UIScrollView से)। मैं कोड को अनुकूलित करने के लिए लेआउटसब्यूव कॉल को कैसे कम कर सकता हूं, या डिवाइस को घुमाए जाने पर मुझे इसे स्वयं से कॉल करना चाहिए।

धन्यवाद।

उत्तर

3

तथ्य layoutSubviews एक बच्चेUIScrollView से बुलाया जाता है कि बहुत दुर्भाग्यपूर्ण है, लेकिन वहाँ एक (बदसूरत) वैकल्पिक हल है:

@interface MyClass : UIView { 
    BOOL reallyNeedsLayout_; 
} 
@end 

@implementation MyClass 

- (void)setNeedsLayout 
{ 
    [super setNeedLayout]; 
    reallyNeedsLayout_ = YES; 
} 

- (void)setFrame:(CGRect)rect 
{ 
    [super setFrame:rect]; 
    reallyNeedsLayout_ = YES; 
} 

- (void)layoutSubviews 
{ 
    if (!reallyNeedsLayout_) return; 
    reallyNeedsLayout_ = NO; 

    // Do layouting. 
} 
@end 

नहीं सबसे अच्छा समाधान है, लेकिन काफी अच्छी तरह से काम करने लगता है।

+0

अब तक, इस सर के लिए सबसे अच्छा समाधान है क्या ? –

0

अनुभव से बात करते हुए मैं व्यक्तिगत रूप से डिवाइसडिडोटेट चयनकर्ता अधिसूचनाओं के आधार पर अपना लेआउट समायोजित करता हूं। मेरे पास एक अद्यतन पोर्ट्रेट विधि और एक अद्यतन लैंडस्केप विधि है और जो भी आवश्यक है उसे कॉल करें।

4
अलग परिदृश्य और चित्र डिजाइन उपयोग दृश्य नियंत्रक तरीकों ऐसे

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 

के रूप में आप वर्तमान अभिविन्यास के आधार पर अपने कस्टम दृश्य बनाते हैं, तो UIDeviceOrientationDidChangeNotification अधिसूचना द्वारा इस उन्मुखीकरण की जांच और उचित कोड लिखने के लिए

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangedOrientation:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

और कार्रवाई

- (void) didChangedOrientation:(NSNotification *)sender{ 
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
if (UIDeviceOrientationIsPortrait(orientation)){}} 
1

आप layoutSubviews में महंगा गणना नहीं करना चाहिए:

init~ तरीकों में से एक में