我应该在哪里放AutoLayout代码?
我正在使用PureLayout
在UIView中实现子视图的AutoLayout。但我不知道组织代码的最佳做法。我应该在哪里放AutoLayout代码?
我应该把自动版式相关的代码中的UIView的初始化,或覆盖的方法,如updateConstraints
和layoutSubviews
?
希望通过了解控制器的视图层次结构这可以帮助你 视图控制器中的视图控制器的观点是调整到新的大小视图布局过程
- 如何参与。
- 如果未使用自动布局,则会根据视图的自动调整掩码调整视图的大小。
- 调用视图控制器的viewWillLayoutSubviews方法。
-
调用视图的layoutSubviews方法。如果自动布局用于配置视图层次,它通过执行以下步骤来更新布局约束:
答。视图控制器的updateViewConstraints方法被调用。 b。UIViewController类的updateViewConstraints方法实现调用视图的updateConstraints方法。
c。布局约束更新后,计算新布局并重新定位视图。
调用视图控制器的viewDidLayoutSubviews方法。
请refer this更多细节
您应该添加constraints
当你确信view
已被添加到其superview
。基本上,你应该在之后的任何一点在superview
的班级中完成。
回答您的问题:
在init
方法,你可以肯定的是view
已经为subview
添加到superview
?假设这是不安全的。也许你可以在init
方法添加constraints
的superview
2-layoutSubviews
是在autolayout
代码实际工作。您不能在layoutSubviews
中添加constraints
。已经玩autolayout
constraints
并不便宜,因此您应该尽可能少地添加/删除它们,这样用一种称为多次的方法(即layoutSubviews
)不是最佳做法。
的autolayout
机制从外view
去内view
,所以subviews
实际上并不关心有关constraints
。它是superview
的责任
但我通常是在自定义单元格作出限制在'layoutSubviews'和它的作品。 – vulgur
它可能会导致一个布局通过,这不是最佳实践。如果你关心的是表视图单元格,你可以考虑在awakeFromNib中添加约束。因为在那种情况下,你的超级视图是在awakeFromNib中的单元格 –
例如,我想创建一个名为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));
}];
}
在'设置init'是确定 – Leo