何时获得正确的帧大小

Posted

技术标签:

【中文标题】何时获得正确的帧大小【英文标题】:When to obtain the right frame size 【发布时间】:2015-11-10 13:19:32 【问题描述】:

问题:假设我有一个图像和一个元素,它不断地触发 viewDidLayoutSubviews(一个滚动视图......这样在每次滚动时都会调用 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】:

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

【讨论】:

以上是关于何时获得正确的帧大小的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:ViewDidAppear 中的帧大小不正确

Swift SpriteKit 获得可见的帧大小

容器视图中的 UIScrollView 的帧大小不正确

UITableviewCell 中的 UIStackview 按比例填充需要不正确的帧

如何获得正确大小的 UIView?

UIViewController 中的帧大小问题