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是要走的路,但它导致的延迟并不是真的可以接受.
有什么想法可以解决这个问题?
移动所有centerAlignImageAndTextForButton
呼叫viewDidLoad
以viewDidLayoutSubviews
减少从之前的283毫秒到18毫秒(1毫秒viewDidLoad
和17毫秒viewDidLayoutSubviews
)的加载时间.
但是,我有点困惑,为什么设置这些插图是如此昂贵viewDidLoad
......