使用Autolayout设置UIButton titleEdgeInsets和imageEdgeInsets很慢

Rob*_* B. 15 objective-c uibutton uikit ios autolayout

我有几个按钮,各种尺寸的视图.所有这些都有标题和图像.我希望将图像放在顶部,标题放在底部,居中.使用以下代码可以正常工作:

- (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);
}
Run Code Online (Sandbox Code Playgroud)

但是,在进入此视图之前,我注意到了一点暂停.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]
Run Code Online (Sandbox Code Playgroud)

在内部调用各种与布局相关的内容[UIView(Hierarchy) layoutBelowIfNeeded],例如[UIView(AdditionalLayoutSupport) recursiveLayoutEngineDidChange][NSLayoutConstraint addToEngine].

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

有什么想法可以解决这个问题?

Rob*_* B. 6

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

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