使用autolayout我想了解为什么会发生以下情况:创建一个简单的UIButton并设置其标题。但是,即使我希望设置视图的内在内容大小并因此正确地获得其框架 - 按钮的框架显示(0,0,0,0)。我该怎么做才能获得按钮的帧值?
-(void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [[UIButton alloc] init];
[button.titleLabel setText:@"My button"];
//button frame is zero
}
然而,如果我这样做,那么事情就会按预期发挥作用:
-(void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc] init];
[label setText:@"My label"];
[label sizeToFit];
//label frame has the expected width and height
}
答案 0 :(得分:3)
Autolayout仅在布局传递后设置视图框架,它是具有周期的东西,并且不会被称为evertytime,您添加视图或修改约束,这就是为什么有时您需要在特定视图上调用-setNeedsLayout
。 />
另一点是,如果不使用界面构建器或以编程方式创建约束,autolayout会自动将视图自动调整掩码转换为约束(-translatesAutoresizingMaskIntoConstraints
属性)。
在这种情况下,如果设置文本,则强制视图表示其内在内容大小,基本上是标签的大小,如果内在内容大小与其赢得的其他约束不冲突,但您只能询问布局通过后的按钮大小。在向超类
.viewDidLayout
内的按钮大小
答案 1 :(得分:1)
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.translatesAutoresizingMaskIntoConstraints = NO;
[button setTitle:@"My button" forState:UIControlStateNormal];
[self.view addSubview:button];
}
- (void)viewDidLayoutSubviews {
//check frame of button
}
答案 2 :(得分:1)
就像@Andrea所说:因为你还没有在IB中添加按钮,它默认使用autoResizingMask,它将保持按钮初始化的零大小的帧。
如果您希望自动布局工作,则需要设置
button.translatesAutoresizingMaskIntoConstraints = NO;
在致电-addSubview:
之前。
此外,您必须添加至少1个水平约束和1个垂直约束来定位按钮。即使您这样做,按钮的框架也只会在下一个布局通过后设置,您可以通过调用-layoutIfNeeded
手动启动。
答案 3 :(得分:0)
将按钮添加为子视图,并在子视图上调用layoutIfNeeded
。之后访问它的框架。
还要确保为前导和顶部添加约束,以便在超级视图中定位按钮。