我应该在哪里放置AutoLayout代码?

时间:2015-07-13 06:38:52

标签: ios objective-c uiview autolayout

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

我应该将AutoLayout相关代码放在UIView的 init 中,还是覆盖updateConstraintslayoutSubviews等方法?

3 个答案:

答案 0 :(得分:1)

如果您确定constraints已添加到view,则应添加superview。基本上,您应该在调用superview后的任何时间点addSubview:的课程中进行此操作。

回答您的问题:

init方法中的

1 - ,您能确定viewsubview添加到superview吗?假设这样做是不安全的。也许您可以在constraints

init方法中添加superview

2 - layoutSubviews位于autolayout代码实际工作的位置。您无法在constraints中添加layoutSubviews。已经在使用autolayout constraints并不便宜,因此您应该尽可能少地添加/删除它们,这样做的方法多次被调用(即layoutSubviews)不是最佳实践。

autolayout的机制来自外部view的内部view,因此subviews实际上并不关心constraints。这是superview的责任

答案 1 :(得分:1)

例如,我想创建一个名为PHView的UIView的子类,对于任何phview,都有一个名为centerView的子视图,它始终位于phview的中心,宽度/高度为0.3 * phview' s宽度/高度。 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));
    }];

}

答案 2 :(得分:0)

希望通过了解控制器的视图层次结构来帮助您 视图控制器如何参与视图布局过程

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

      

    a。调用视图控制器的updateViewConstraints方法。

         

    b.UIViewController类的updateViewConstraints方法实现调用了view的updateConstraints方法。

         

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

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

  6. refer this了解更多详情