使用AutoLayout在viewDidAppear之前获取UIButton宽度

时间:2015-09-04 16:49:47

标签: ios objective-c uibutton autolayout

我有一个UIButton(在界面构建器中创建),我通过设置button.layer.borderRadius = button.frame.size.width / 2.0;(以编程方式,在viewDidAppear :)中变成一个圆圈。但是,它所属的viewController以模态方式呈现动画。由于在转换动画完成之后才调用viewDidAppear,因此按钮在此之前是方形的,这使得突然变化非常刺耳。

我无法在viewDidLoad中设置半径,因为按钮属性不正确(宽度太大),我认为这是因为自动布局约束还没有得到妥善解决。我试图通过调用[self.view setNeedsLayout]中的viewDidLoad然后设置cornerRadius来解决这个问题,但按钮宽度仍然是错误的。我不明白的是,在动画期间,其他一切都正确呈现,表明自动布局约束/已经/已经解决,或者iOS以快速动画的名义做了其他事情(比如存储快照预览以便使用)为了动画)。

有什么建议吗?

尝试在viewDidLoad中设置角半径的结果:

The result of trying to set the corner radius in viewDidLoad

5 个答案:

答案 0 :(得分:6)

您可以在函数 - viewDidLayoutSubviews中获取宽度。

Apple Documentation此处。

答案 1 :(得分:3)

覆盖UIButton并使其layoutSubviews方法如下:

- (void)layoutSubviews {
    [super layoutSubviews];
    self.layer.cornerRadius = self.bounds.size.width/2.f;
}

然后,只要按钮的大小发生变化,它就会调整其值。 还要在buttonWithType:initWithFrame:中添加,因为我不确定在初始化后是否调用了layoutSubviews

答案 2 :(得分:0)

抱歉,我没有把你弄好。正如您的屏幕截图所示,您的图像不是圆形的。为此,您可以尝试:(1)layer.cornerRadius = btn.frame.size.width / 2;或layer.CornerRadius = 50(如果宽度为100)

 layer.masksToBounds = YES;

 layer.borderWidth = 1.5; or whatever you want

 layer.borderColor = [UIColor whiteColor];

如果问题仍然存在,请分享您在按钮上添加的约束以及您执行此操作的代码。

答案 3 :(得分:0)

你的控件在viewDidLoad之后得到约束和框架设置在viewDidLoad之后你可以在viewwilllayoutsubviews或viewdidlayupubviews中获取你的要求viewDidAppear

答案 4 :(得分:0)

怎么样

-(void) viewWillAppear:(BOOL)animated