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のTimeProfilerは、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ファイルにベースローカリゼーションを使用しています)。ですから、私にとっては、プログラムでインセットを設定するのが道のりのようですが、それが引き起こすラグは実際には受け入れられません。

これをどのように解決できるか考えていますか?

4

2 に答える 2

6

すべてのcenterAlignImageAndTextForButton呼び出しをからviewDidLoadに移動するとviewDidLayoutSubviews、ロード時間が以前の283ミリ秒から18ミリ秒に短縮されます(の場合は1ミリ秒、の場合はviewDidLoad17ミリ秒viewDidLayoutSubviews)。

しかし、私は少し戸惑っています、なぜそれらのインセットをから設定するのにそれほど費用がかかるのですかviewDidLoad...

于 2013-03-15T13:38:37.470 に答える
0

カスタムサブクラスのtitleLabelfromへの呼び出しが遅いという同様の問題がありました。ボタンの数が多いか、ライフサイクルが重要であるため、コードをViewControllerに移動することは望ましくありませんでした。コードをに移動しても効果はありませんでした。最終的にコードをに移動すると、問題は解決しました。awakeFromNibUIButtonlayoutSubviewsdidMoveToSuperview

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