何时获得正确的框架尺寸

时间:2015-11-10 13:19:33

标签: ios uiviewcontroller autolayout frame

问题:我假设我有一个图像和一个不断触发viewDidLayoutSubviews的元素(一个scrollview ..所以在每个滚动viewDidLayout都会被调用...或者经常触发viewDidLayout的任何元素)。

此图片以及“viewDidLayout_element”都在故事板中设置好自动布局。

现在: 我需要使图像成为圆形图像。 使用典型的:layer.cornerRadius ..和layer.masksToBounds。这需要一个计算的imageView框架。

在什么视图中,控制器循环是以编程方式进行的?考虑到:

*除了viewDidLayoutSubviews我没有得到正确的框架

* viewDidLayoutSubviews甚至可以被调用数千次,具体取决于触发它的“viewDidLayout_element”。

*如果我在viewDidAppear中的imageView上调用layoutIfNeeded(因为它是帧已经可用的唯一情况,因此我们可以强制进行计算),用户已经可以看到从正方形图像到圆形图像的转换。换句话说,在viewDidAppear中,框架可用于我们的操作,但也可用于用户眼睛的毫秒。

*使用标志填充viewDidLayoutSubviews是没有意义的(特别是如果会有比圆形imageView转换更强大的性能),如下所示:

if !iDidChangedTheImage
{
    imageView.applyCornerRadius()
}

问题:

在viewController循环中我在哪里可以获得正确的帧大小而没有上面的问题?或者你通常如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

UIImageView子类添加到您的自定义类,并覆盖layoutSubviews。之后,您无需关心图像视图大小更改和更新角半径,只需将该类用于自定义图像视图

@implementation CustomImageView

- (void)awakeFromNib {
    [super awakeFromNib];
    self.layer.masksToBounds = YES;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    self.layer.cornerRadius = self.frame.size.height / 2.0;
}

@end