2015-07-13 154 views
2

我正在使用PureLayout在UIView中实现子视图的AutoLayout。但我不知道组织代码的最佳做法。我应该在哪里放AutoLayout代码?

我应该把自动版式相关的代码中的UIView的初始化,或覆盖的方法,如updateConstraintslayoutSubviews

+0

在'设置init'是确定 – Leo

回答

0

希望通过了解控制器的视图层次结构这可以帮助你 视图控制器中的视图控制器的观点是调整到新的大小视图布局过程

  1. 如何参与。
  2. 如果未使用自动布局,则会根据视图的自动调整掩码调整视图的大小。
  3. 调用视图控制器的viewWillLayoutSubviews方法。
  4. 调用视图的layoutSubviews方法。如果自动布局用于配置视图层次,它通过执行以下步骤来更新布局约束:

    答。视图控制器的updateViewConstraints方法被调用。 b。UIViewController类的updateViewConstraints方法实现调用视图的updateConstraints方法。

    c。布局约束更新后,计算新布局并重新定位视图。

  5. 调用视图控制器的viewDidLayoutSubviews方法。

refer this更多细节

1

您应该添加constraints当你确信view已被添加到其superview。基本上,你应该在之后的任何一点在superview的班级中完成。

回答您的问题:

init方法,你可以肯定的是view已经为subview添加到superview?假设这是不安全的。也许你可以在init方法添加constraintssuperview

2-layoutSubviews是在autolayout代码实际工作。您不能在layoutSubviews中添加constraints。已经玩autolayoutconstraints并不便宜,因此您应该尽可能少地添加/删除它们,这样用一种称为多次的方法(即layoutSubviews)不是最佳做法。

autolayout机制从外view去内view,所以subviews实际上并不关心有关constraints。它是superview的责任

+0

但我通常是在自定义单元格作出限制在'layoutSubviews'和它的作品。 – vulgur

+0

它可能会导致一个布局通过,这不是最佳实践。如果你关心的是表视图单元格,你可以考虑在awakeFromNib中添加约束。因为在那种情况下,你的超级视图是在awakeFromNib中的单元格 –

1

例如,我想创建一个名为PHView的UIView的子类,并且对于任何phview,都有一个名为centerView的子视图,它始终位于phview的中心,而width/height是0.3 * phview的宽度/高度。 https://www.dropbox.com/s/jaljggnymxliu1e/IMG_3178.jpg

#import "PHView.h" 
#import "Masonry.h" 
@interface PHView() 
@property (nonatomic, assign) BOOL didUpdateConstraints; 
@property (nonatomic, strong) UIView *centerView; 
@end 
@implementation PHView 
- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     self.backgroundColor = [UIColor redColor]; 
     self.translatesAutoresizingMaskIntoConstraints = NO; 
    } 
    return self; 
} 
- (UIView *)centerView { 
    if (!_centerView) { 
     _centerView = [UIView new]; 
     _centerView.backgroundColor = [UIColor yellowColor]; 
     [self addSubview:_centerView]; 
    } 
    return _centerView; 
} 

-(void)updateConstraints { 
    if (!_didUpdateConstraints) { 
     _didUpdateConstraints = YES; 
     [self.centerView mas_makeConstraints:^(MASConstraintMaker *make) { 
      make.centerX.equalTo(self.mas_centerX); 
      make.centerY.equalTo(self.mas_centerY); 
      make.width.equalTo(self.mas_width).multipliedBy(0.3); 
      make.height.equalTo(self.mas_height).multipliedBy(0.3); 
     }]; 
    } 
    [super updateConstraints]; 
} 
@end 

“didUpdateConstraints”旨在表明您已经添加的限制,所以你只会增加一次的限制。在UIViewController中:

:使phview顶部左下角20到边距。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor greenColor]; 
    PHView *myView = [PHView new]; 
    [self.view addSubview:myView]; 
    [myView mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(20, 20, 20, 20)); 
    }]; 

}