10

ビュークラス(の子孫)にいくつかのカスタム外観プロパティがありますUIView。これらのプロパティに従ってビューの外観をカスタマイズしたいのですが、を使用して設定された値[[MyClass appearance] setFoo:…]がその時点で有効になっていないため、初期化子内でそれを行うことはできません。

@interface View : UIView
@property(strong) UIColor *someColor UI_APPEARANCE_SELECTOR;
@end

@implementation View
@synthesize someColor;

// Somewhere in other code before the initializer is called:
// [[View appearance] setSomeColor:[UIColor blackColor]];

- (id) initWithFrame: (CGRect) frame
{
    self = [super initWithFrame:frame];
    NSLog(@"%@", someColor); // nil
    return self;
}

@end

これらはすでに設定されていますがlayoutSubviews、一部のカスタマイズがlayoutSubviews再度トリガーされて無限ループが発生する可能性があるため、ビューのカスタマイズを実行するのは適切ではありません。

では、カスタマイズを実行するための良い点は何ですか?または、外観値を適用するコードをトリガーする方法はありますか?

4

5 に答える 5

2

考えられる回避策の1つは、プロキシから直接値を取得することです。

- (id) initWithFrame: (CGRect) frame
{
    self = [super initWithFrame:frame];
    NSLog(@"%@", [[View appearance] someColor); // not nil
    return self;
}

もちろん、これはビューコンテナに応じて外観を変更するオプションを無効にし、一般的に醜いです。私が見つけた2番目のオプションは、セッターでカスタマイズを実行することです。

- (void) setSomeColor: (UIColor*) newColor
{
    someColor = newColor;
    // do whatever is needed
}

それでも、外観プロパティが設定された後に呼び出されるフックが必要です。

于 2012-05-24T14:33:48.463 に答える
1

まで待ってみませんか

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];

    if (newSuperview) {
        ... code here ...
    }
}

それがあなたに問題を与えているなら?

于 2012-05-24T12:46:21.940 に答える
1

UIAppearanceビュー階層に追加されるときに、プロパティがビューに適用されると思います。したがって、おそらく、で設定されたプロパティにアクセスできますUIView didMoveToSuperview

于 2013-08-07T19:27:22.103 に答える
1

警告:私はSwift 2を使用しているので、以前のバージョンのSwift/Objective-Cについてはよくわかりません。しかし、私はそれdidMoveToSuperview()がうまくいかないことを発見しました。プロパティはで利用できますがlayoutSubviews()、このようなことを行うには適していません(複数回呼び出すことができるため)。私が見つけたビューのライフサイクルでこれらのプロパティにアクセスするのに最適な場所はですdidMoveToWindow()

于 2015-12-17T16:33:10.960 に答える
0

それが1回限りのことであれば、viewDidLoadが最適だと思いました。それ以外の場合は、viewWillAppear。

編集:

コントローラではなくビューでそれを実行したい場合は、次の行に沿ってビューのカスタムinitを作成します。

-(id) initWithFrame:(CGRect) frame andAppearanceColor:(UIColor)theColor;

これにより、作成時に色がビューに渡されます。

于 2012-05-24T13:23:55.710 に答える