3

UIButton の image プロパティに問題があります。私のアセット カタログには、Any / Any size クラスのデフォルト イメージと、Regular / Regular クラスに固有のイメージが含まれています。Interface Builder で UIButton のイメージ プロパティを「img_facebook」に設定すると、iPad でイメージが正しくレンダリングされません (Regular/Regular の代わりに Any/Any サイズのイメージが選択されます)。しかし、「traitCollectionDidChange:」メソッド内で更新すると、画像は正しくレンダリングされます (添付のコード スニペットを参照)。

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
    [super traitCollectionDidChange:previousTraitCollection];
    [_facebookButton setImage:[UIImage imageNamed:@"img_facebook"] forState:UIControlStateNormal];
}

IB が UIImage インスタンスを作成し、それを一度だけプロパティに割り当てているようです。それは理にかなっていますが、UIButton の代わりに UIImage で同じことを行うと、すべてが完全に正常に機能します。

誰かが同様の問題を経験しましたか? IBでそれを修正することは可能ですか、それともコードで画像を手動でリセットする必要がありますか?

4

2 に答える 2

1

私はちょうど同様の問題に遭遇しました。UIButton のバグのようです。ボタンの traitCollection プロパティを確認しました (Interface Builder を介して通常のビュー コントローラー ビューに追加されます)。

<UITraitCollection: 0x7ff6f27a8930; _UITraitNameUserInterfaceIdiom = Phone, _UITraitNameDisplayScale = 2.000000>

予想されるサイズ クラスがありません。たとえば、親ビューの traitCollection は次のようになります。

<UITraitCollection: 0x7ff6f48a1640; _UITraitNameUserInterfaceIdiom = Phone, _UITraitNameDisplayScale = 2.000000, _UITraitNameHorizontalSizeClass = Compact, _UITraitNameVerticalSizeClass = Regular, _UITraitNameTouchLevel = 0, _UITraitNameInteractionModel = 1>

最も簡単な回避策は、サイズ クラスの代わりにデバイス固有のオプションを使用するように UIImageAsset を変更することです。

ここに画像の説明を入力

そして、iPhone と iPad 固有の画像を追加します。それで解決しました(Xcode Beta 6.3)

于 2015-04-08T10:54:05.260 に答える
1

私は同じ問題を抱えています.私が見つけた唯一の方法は、別のAPIを使用してボタンの適切な画像を設定することです.

UIImage *image;
if ( NSClassFromString(@"UITraitCollection") ) { //need to support iOS7
    image = [UIImage imageNamed:@"xxx" inBundle:nil compatibleWithTraitCollection:self.traitCollection];
} else {
    image = [UIImage imageNamed:@"xxx"];
}
[button setImage:image forState:UIControlStateNormal];

私のテストから、ボタンで traitCollectionDidChange が呼び出されたときに、ボタンの画像が対応する特性に自動的に変更されるようです。つまり、ボタンの画像を手動で制御したい場合は、画像をボタンに設定するときに適切な特性画像を取得する必要があります。そうしないと、次の traitCollectionDidChange がボタンに発生して画像が自動的に変更されるのを待つ必要があります。

于 2015-09-14T07:36:48.037 に答える