何时获得正确的帧大小

When to obtain the right frame size

问题:假设我有一个图像和一个不断触发 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 循环中哪里有正确的帧大小而没有上面的问题?或者你平时是怎么解决这个问题的?

Subclass UIImageView 到您的自定义 class,并覆盖 layoutSubviews。之后你不需要关心图像视图大小的变化和更新角半径,只需将 class 用于你的自定义图像视图

@implementation CustomImageView

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

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

@end