【问题标题】:What method is called on UIView when it's resized by autolayout?当 UIView 通过自动布局调整大小时,它会调用什么方法?
【发布时间】:2015-04-14 15:08:33
【问题描述】:

我有一个图像视图,我通过在我的子类中覆盖以下内容来实现圆角:

-(void)setFrame:(CGRect)frame {
  [super setFrame:frame];
  [self.layout setCornerRadius:frame.size.width/10.0];
}

这对于图像的初始显示非常有用,但是如果图像的大小由于设备旋转或其他机制而发生变化,则不会调用此方法来实现调整大小。

我正在使用自动布局,我想知道当我的约束调整视图大小时调用 UIView(以及 UIImageView)的什么方法,以便在发生这种调整大小时重新计算角半径。我的(显然是错误的)假设是自动布局系统调用setFrame: 来根据需要移动/调整视图大小。

【问题讨论】:

  • 试试把这个放到layoutSubviews
  • 把它放在 layoutSubviews 工作!谢谢罗伯。我看到的唯一问题是变化是突然的而不是平滑的动画,当图像从大到小调整大小时会产生“闪烁”效果,反之亦然。我试着把它放在 drawRect: 中,看看它是否给我一个调整角落大小的平滑动画,但似乎 drawRect: 甚至没有被调用(至少在模拟器中没有)!
  • 查看 UIView 类参考:developer.apple.com/library/ios/documentation/UIKit/Reference/… 有一个名为“Subclassing Notes”的特定块可能对您很有帮助。
  • 当做一个需要与旋转协调的动画时,例如,你可以使用animateAlongsideTransition和过渡协调器。当动画无法使用基于块的动画进行动画处理时,您可以将其与显示链接结合使用:: stackoverflow.com/a/28259619/1271826
  • 很高兴知道!我同意您在该线程中的评论,“坦率地说,我不确定这个圆角半径动画是否足以证明这个显示链接的合理性(我不得不用 command+T 减慢模拟器中的动画以欣赏差异),但是这说明了基本思想。”我可能会坚持使用 layoutSubviews 的原始建议。再次感谢!

标签: ios uiview resize autolayout frame


【解决方案1】:

来自updateConstraints 上的文档:

自己设置约束的自定义视图应该通过覆盖此方法来实现

....

在执行布局之前,您的 updateConstraints 实现将被调用,允许您在自定义视图的属性未更改时验证内容的所有必要约束是否到位。

或来自layoutSubviews 上的文档:

仅当子视图的自动调整大小和基于约束的行为不能提供您想要的行为时,您才应该重写此方法。您可以使用您的实现直接设置子视图的框架矩形。

但如果您需要在轮换更改时执行此操作,请查看 willTransitionToTraitCollection:withTransitionCoordinator:

此方法的实现者可以使用它来根据 newCollection 参数中的值调整接口。此方法的一个常见用途是在当前尺寸类发生变化时对高级表示样式进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多