我有一个视图与几个按钮,各种大小.他们都有一个标题和一个形象.我想把图像放在顶部,底部的标题居中.以下代码可以正常工作:
- (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 …