何时在iOS中使用layoutSubview

时间:2011-08-05 08:19:14

标签: iphone ios ipad

我正在为iPad编写需要自定义布局的iOS应用程序。

纵向和横向的布局完全不同,因此使用UIAutoResizingMask无法解决。

我尝试使用layoutSubview方法,但我检测到布局子视图被调用很多(来自UIScrollView)。 如何减少layoutSubview调用以优化代码,或者我应该在旋转设备时自己调用它。

感谢。

4 个答案:

答案 0 :(得分:4)

对于不同的横向和纵向设计,请使用视图控制器方法,例如

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

如果您根据当前方向创建自定义视图,请通过UIDeviceOrientationDidChangeNotification通知检查此方向并编写相应的代码。

在其中一个init~方法中:

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

行动

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

答案 1 :(得分: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

不是最好的解决方案,但似乎运作得相当好。

答案 2 :(得分:1)

你不应该在layoutSubviews中进行昂贵的计算:

答案 3 :(得分:0)

根据经验,我个人只会根据deviceDidRotateSelector通知调整您的布局。 我有一个updatePortrait方法和updateLandscape方法,并调用任何必要的。