何时获得正确的帧大小
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
问题:假设我有一个图像和一个不断触发 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