问题:我假设我有一个图像和一个不断触发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循环中我在哪里可以获得正确的帧大小而没有上面的问题?或者你通常如何解决这个问题?
答案 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