我正在使用PureLayout
在UIView中实现子视图的AutoLayout。但我不知道组织代码的最佳做法。
我应该将AutoLayout相关代码放在UIView的 init 中,还是覆盖updateConstraints
和layoutSubviews
等方法?
答案 0 :(得分:1)
如果您确定constraints
已添加到view
,则应添加superview
。基本上,您应该在调用superview
后的任何时间点addSubview:
的课程中进行此操作。
回答您的问题:
init
方法中的 1 - ,您能确定view
已subview
添加到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)
希望通过了解控制器的视图层次结构来帮助您 视图控制器如何参与视图布局过程
调用视图的layoutSubviews方法。如果使用autolayout配置视图层次结构,则会通过执行以下步骤来更新布局约束:
a。调用视图控制器的updateViewConstraints方法。
b.UIViewController类的updateViewConstraints方法实现调用了view的updateConstraints方法。
℃。更新布局约束后,将计算新布局并重新定位视图。
调用视图控制器的viewDidLayoutSubviews方法。
请refer this了解更多详情