使用Autolayout在自定义UITableViewCell中获取UIButton的大小

时间:2015-06-30 10:18:51

标签: ios objective-c uitableview autolayout calayer

我在Interface Builder中创建的自定义UITableViewCell中有一个UIButton,高度和宽度由Autolayout约束定义。

我需要在autolayout定义最终大小后获得UIButton的大小。

UITableViewCell with Autolayout

我的尝试:

在我的自定义UITableViewCell

 - (void)layoutSubviews
 {
    [super layoutSubviews];

  NSLog(@"%f", self.infoButton.bounds.size.width);

    self.infoButton.layer.cornerRadius   = self.infoButton.bounds.size.width/2;
    self.infoButton.clipsToBounds        = YES;
    self.infoButton.layer.borderColor    = [UIColor whiteColor].CGColor;
    self.infoButton.layer.borderWidth    = 4.0f;
}

问题是我有不同的价值观:

2015-06-30 03:01:47.578 MYPROJ[3596:34092] 48.000000
2015-06-30 03:01:47.581 MYPROJ[3596:34092] 48.000000
2015-06-30 03:01:47.583 MYPROJ[3596:34092] 48.000000
2015-06-30 03:01:47.585 MYPROJ[3596:34092] 56.000000
2015-06-30 03:01:47.586 MYPROJ[3596:34092] 56.000000
2015-06-30 03:01:47.586 MYPROJ[3596:34092] 56.000000
2015-06-30 03:01:53.482 MYPROJ[3596:34092] 48.000000
2015-06-30 03:01:53.484 MYPROJ[3596:34092] 56.000000
2015-06-30 03:01:54.939 MYPROJ[3596:34092] 56.000000
2015-06-30 03:02:04.161 MYPROJ[3596:34092] 56.000000
2015-06-30 03:02:05.115 MYPROJ[3596:34092] 56.000000
2015-06-30 03:02:05.957 MYPROJ[3596:34092] 56.000000

我也试过- (void)awakeFromNib内的代码我试过了self.infoButton.bounds.size.widthself.infoButton.frame.size.width

它给了我Autolayout之前的静态宽度,在我的情况下是48.0 还

我担心将代码置于- (void)layoutSubviews内的解决方案会影响性能,因为它会被调用用户滚动的所有内容并且每次应用层转换,有没有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

在自定义UITableViewCell.m文件中,在awakeFromNib方法中添加以下行。

这里,因为您的按钮依赖于单元格,并且确实具有与设备屏幕相同的宽度。

- (void)awakeFromNib {
// Initialization code
self.infoButton.layer.cornerRadius   = [UIScreen mainScreen].bounds.size.width * 0.075f; // 0.15/2 = 0.075f (Half of the button's width)
self.infoButton.clipsToBounds        = YES;
self.infoButton.layer.borderColor    = [UIColor whiteColor].CGColor;
self.infoButton.layer.borderWidth    = 4.0f;
}

希望它有所帮助...

答案 1 :(得分:0)

尝试访问按钮的内在内容大小。

CGSize buttonSize = self.infoButton.intrinsicContentSize;