15

我有几个按钮的视图,大小不一。它们都有一个标题和一个图像。我想让图像在顶部,标题在底部,居中。这适用于以下代码:

- (void)centerAlignImageAndTextForButton:(UIButton*)button
{
    CGFloat spacing = 5;
    CGSize imageSize = button.imageView.frame.size;
    button.titleEdgeInsets = UIEdgeInsetsMake(0, -imageSize.width, -(imageSize.height + spacing), 0);
    CGSize titleSize = button.titleLabel.frame.size;
    button.imageEdgeInsets = UIEdgeInsetsMake(-(titleSize.height + spacing), 0, 0, -titleSize.width);
}

但是,我注意到在进入这个视图之前有一点停顿。Instruments 中的 Time Profiler 显示,在 viewDidLoad 中花费的 99% 时间是由调用我的按钮方法引起的:

283.0ms  -[XViewController viewDidLoad]
282.0ms    -[XViewController centerAlignImageAndTextForButton:]
141.0ms      -[UIButton imageView]
 98.0ms        -[UIView(Hierarchy) layoutBelowIfNeeded]
141.0ms      -[UIButton titleLabel]
103.0ms        -[UIView(Hierarchy) layoutBelowIfNeeded]

各种布局相关的东西被称为 inside [UIView(Hierarchy) layoutBelowIfNeeded], like[UIView(AdditionalLayoutSupport) recursiveLayoutEngineDidChange][NSLayoutConstraint addToEngine]

我知道可以在 Interface Builder 中设置这些插图,但这不仅是一项繁琐的工作(需要“猜测”文本的宽度);该应用程序也将被本地化,因此适用于一种语言的插图不会适用于文本大小不同的另一种语言(我对故事板和 .strings 文件使用基本本地化,而不是为每种语言复制整个故事板)。所以对我来说,似乎以编程方式设置插图是要走的路,但它导致的滞后并不是真正可以接受的。

有什么想法可以解决吗?

4

2 回答 2

6

将所有centerAlignImageAndTextForButton调用从移动viewDidLoadviewDidLayoutSubviews将加载时间从之前的 283 毫秒减少到 18 毫秒(1 毫秒viewDidLoad和 17 毫秒viewDidLayoutSubviews)。

但是,我有点困惑,为什么从viewDidLoad...设置这些插图如此昂贵

于 2013-03-15T13:38:37.470 回答
0

在自定义子类中对titleLabelfrom的缓慢调用也有类似的问题。由于按钮的大量和/或非平凡的生命周期,将代码移动到视图控制器是不可取的。将代码移动到没有帮助。最终我将代码移到并解决了问题。awakeFromNibUIButtonlayoutSubviewsdidMoveToSuperview

- (void)didMoveToSuperview
{
    [super didMoveToSuperview];
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
    self.titleLabel.numberOfLines = 2;
    self.titleLabel.textAlignment = NSTextAlignmentCenter;
}
于 2014-02-26T08:48:54.663 回答