ios – 使用Autolayout设置UIButton titleEdgeInsets和imageEdgeInsets很慢

前端之家收集整理的这篇文章主要介绍了ios – 使用Autolayout设置UIButton titleEdgeInsets和imageEdgeInsets很慢前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个视图与几个按钮,各种大小.他们都有一个标题和一个形象.我想把图像放在顶部,底部标题居中.以下代码可以正常工作:
- (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),-titleSize.width);
}

但是,在进入此视图之前,我注意到有一点暂停.仪器中的时间分析器显示,在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]

在[UIView(Hierarchy)layoutBelowIfNeeded]中调用各种布局相关的东西,如[UIView(AdditionalLayoutSupport)recursiveLayoutEngineDidChange]或[NSLayoutConstraint addToEngine].

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

有什么想法可以如何解决

解决方法

将所有来自viewDidLoad的centerAlignImageAndTextForButton调用移动到viewDidLayoutSubviews,减少从先前的283毫秒到18毫秒的加载时间(viewDidLoad为1毫秒,viewDidLayoutSubviews为17毫秒).

然而,我有点困惑,为什么这么昂贵的设置这些insets从viewDidLoad …

猜你在找的iOS相关文章