【问题标题】:In iOS 7, layoutSubviews method is called constantly on UIButton subclass在 iOS 7 中,UIButton 子类会不断调用 layoutSubviews 方法
【发布时间】:2013-09-24 20:02:50
【问题描述】:

我在视图上有一个 UIButton 的子类。在 iOS 6、5 等中运行良好。但在 iOS 7 中,当我尝试更改标题(使用 setTitle:forState:) 时,我注意到延迟。我发现这个问题是由于基金会不断在我的控件上调用 layoutSubviews,这导致 CPU 使用率在应用程序的生命周期内徘徊在 100% 左右。

在我的子类中,我覆盖了 layoutSubviews 并添加了一个断点来诊断问题。回溯只显示从基础中的 [UIView layoutSublayersOfLayer] 方法调用的方法。

请注意,如果我注释掉这一行:

[super layoutSubviews];

CPU 问题消失了,但当然会出现其他问题。

有人看过吗?为什么 iOS 7 不断调用 layoutSubviews?

【问题讨论】:

  • 你能提供一些代码吗?通常,您只会调用该方法,因为您正在继承 layoutSubviews。如果您需要强制布局,您通常会使用setNeedsLayout 来避免多次布局调用,因此您的代码中的其他地方可能会有问题。
  • 谢谢,布赖恩。我只对 layoutSubviews 进行子类化以诊断 CPU 挂在 100%。当我注释掉该方法时,问题并没有消失。
  • 同样,我也尝试继承 setNeedsLayout,并发现(带有断点)它是从 [UIButton _beginTitleAnimation](私有方法)调用的。我会满足于禁用按钮的动画,但我不知道如何做到这一点。
  • 这并不能解释为什么你会经常看到layoutSubviews。动画只会调用一次。当您查看 Instruments 时,您是否看到 layoutSubviews 经常递归的任何地方(可能在您的类中触发一个方法然后返回)?没有代码就无法回答这个问题。
  • 对于在 layoutsubviews 内无限循环中具有 100% cpu 的其他任何人,空的 layoutSubviews 覆盖也会出现同样的问题。

标签: iphone objective-c ipad uibutton ios7


【解决方案1】:

发现问题。在我的 setEnabled: 方法中(首先是子类的部分原因),我有以下行:

self.titleLabel.alpha = enabled ? 1.0 : 0.8;

显然在 iOS 7 中,这会导致 UIButton 开始一个它永远不会完成的标题更改动画。结果是一个无限循环,其中 layoutSubviews 被重复调用。

解决方法是在 titleColor 更改时包含此行:

[self setTitleColor:[[self titleColorForState:UIControlStateNormal] colorWithAlphaComponent:0.8] forState:UIControlStateDisabled];

并且避免了无限循环!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多