【问题标题】:layoutSubview resetting properties of UILabellayoutSubview 重置UILabel的属性
【发布时间】:2013-02-11 10:03:13
【问题描述】:

我有一个带有 UIScrollView 的 ViewController。在这个 VC 上,我以编程方式调整滚动视图内的 UILabel 的框架。这是在 viewDidLoad 上完成的。这个 UILabel 来自 VC 的 xib 文件,它不是以编程方式创建的,只是它的框架发生了变化。

当我从这个 VC 转换到另一个,然后返回时,UILabel 的帧被重置为 XIB 的状态。但是它的文本没有重置,它保持我之前设置的相同文本。

我的调查告诉我这发生在 layoutSubviews 上,因为 UILabel 的属性在 willLayoutSubviews 上是正确的,然后在移回 VC 时在 didLayoutSubviews 上重置。

这是预期的行为吗?标签的文本仍然存在但框架被重置是否有原因?这是因为 UIScrollView 在滚动时调用其父视图上的 layoutSubviews 吗?

谢谢

【问题讨论】:

  • 您的 xib 是否启用了自动布局?请参阅 this answer 以获取有关查找该设置的帮助。
  • 是的,但我希望这样,为 3.5 和 4 英寸 iPhone 格式化我的视图。它不应该只布局一次吗?

标签: ios objective-c uiscrollview layoutsubviews


【解决方案1】:

我在您的描述中发现了两个问题。首先,你是这么说的:

在这个 VC 上,我以编程方式调整滚动视图内的 UILabel 的框架。这是在 viewDidLoad 上完成的。

viewDidLoad 中修改视图框架通常是个坏主意,因为系统的布局阶段(在此期间发送layoutSubviews 消息)尚未发生。在viewDidLoad 中,您的视图框架尚未针对当前设备的屏幕尺寸和界面方向进行调整。

其次,您说您正在使用自动布局。自动布局系统在布局阶段设置视图框架。布局阶段可以由许多不同的事件触发,包括(如您所见)视图的出现和消失。

为了对标签的框架“粘”进行调整,您需要修改控制标签框架的约束。一种方法是在视图控制器上为需要修改的每个约束创建NSLayoutConstraint 类型的出口,并将这些出口连接到 xib 中的约束。然后在视图控制器的viewWillLayoutSubviews 中,您可以根据需要修改每个约束的constant 属性。 (具有讽刺意味的是,constantNSLayoutConstraint 的唯一可修改属性。)

【讨论】:

  • 虽然这并没有真正解决我的问题,但 Rob 的观察是正确的,通过这些发现我解决了我的问题。我不会分享我的解决方案,因为它非常与众不同,但简而言之,我最终以编程方式创建了控件,而不是使用 autoLayout。
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 2011-01-26
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
相关资源
最近更新 更多