我有一个带有UIScrollView的ViewController。在这个VC上,我以编程方式调整滚动视图内的UILabel的帧。这是在viewDidLoad上完成的。这个UILabel来自VC的xib文件,它不是以编程方式创建的,只是它的框架发生了变化。
当我从这个VC转换到另一个VC,然后返回时,UILabel的帧被重置为XIB的状态。然而,它的文本没有重置,它保持与我之前设置的文本相同。
我的调查告诉我,这发生在layoutSubviews上,因为UILabel的属性在willLayoutSubviews上是正确的,然后在回到VC时重置didLayoutSubviews。
这是预期的行为吗?有没有理由为什么标签的文本仍然存在,但框架被重置?这是因为UIScrollView在滚动时会在其父视图上调用layoutSubviews吗?
由于
答案 0 :(得分:2)
我在你的描述中看到两个问题。首先,你这样说:
在这个VC上,我以编程方式调整滚动视图内的UILabel的帧。这是在viewDidLoad上完成的。
修改viewDidLoad
中的视图帧通常是个坏主意,因为系统的布局阶段(发送layoutSubviews
消息期间)尚未发生。在viewDidLoad
中,您的视图框架尚未根据当前设备的屏幕尺寸和界面方向进行调整。
其次,你说你正在使用自动布局。自动布局系统在布局阶段设置视图帧。布局阶段可以由许多不同的事件触发,包括(如您所见)视图的外观和消失。
为了调整标签的框架“棒”,您需要修改控制标签框架的约束。一种方法是在视图控制器上为需要修改的每个约束创建类型为NSLayoutConstraint
的插座,并将这些插座连接到xib中的约束。然后在视图控制器的viewWillLayoutSubviews
中,您可以根据需要修改每个约束的constant
属性。 (具有讽刺意味的是,constant
是NSLayoutConstraint
唯一可修改的属性。)