iOS:UIButton Autolayout大小为零

时间:2015-06-24 08:28:41

标签: ios objective-c uibutton autolayout

使用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

}

4 个答案:

答案 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。之后访问它的框架。

还要确保为前导和顶部添加约束,以便在超级视图中定位按钮。