Appleの仕組みを知りたいのですが-setNeedsLayout。
-layoutSubviewsメソッドで2回呼び出す必要があるかもしれないので、直接呼び出すよりも効率的であることはすでに知っています。
そして、それは私がそれを必要としているものです:-setNeedsValidationビューコントローラーのためのいくつかのカスタム。
しかし、そのような機能をどのように実現するのでしょうか?
Appleの仕組みを知りたいのですが-setNeedsLayout。
-layoutSubviewsメソッドで2回呼び出す必要があるかもしれないので、直接呼び出すよりも効率的であることはすでに知っています。
そして、それは私がそれを必要としているものです:-setNeedsValidationビューコントローラーのためのいくつかのカスタム。
しかし、そのような機能をどのように実現するのでしょうか?
Appleがこれを正確にこのように行っているかどうかは確認できませんが、これがあなたが探していることを行う方法でsetNeedsLayoutあり、実装方法と似ている可能性があります。私はこれをテストしていません(またはコンパイルしていません)が、のカテゴリとして問題を攻撃する方法のアイデアを与えるはずUIViewControllerです。UIKitと同様に、これは完全にスレッドセーフではありません。
static NSMutableSet sViewControllersNeedingValidation = nil;
static BOOL sWillValidate = NO;
@implementation UIViewController (Validation)
+ (void)load {
sViewControllersNeedingValidation = [[NSMutableSet alloc] init];
}
- (void)setNeedsValidation {
[sViewControllersNeedingValidation addObject:self];
if (! sWillValidate) {
sWillValidate = YES;
// Schedule for the next event loop
[[self class] performSelector:@selector(dispatchValidation) withObject:nil afterDelay:0];
}
}
+ (void)dispatchValidation {
sWillValidate = NO;
// The copy here is in case any of the validations call setNeedsValidation.
NSSet *controllers = [sViewControllersNeedingValidation copy];
[sViewControllersNeedingValidation removeAllObjects];
[controllers makeObjectsPerformSelector:@selector(validate)];
[controllers release];
}
- (void)validate {
// Empty default implementation
}
大声で考えてみてください...ドキュメントには-setNeedsLayout、次の「更新サイクル」(またはドキュメントに記載されている「図面の更新」)でレイアウトの更新がスケジュールされると書かれています-layoutSubviews。
したがって-setNeedsLayout、おそらくBOOLフラグを設定します。フラグは後で(-drawRect:?で)チェックされYES、に設定されている場合-layoutSubviewsはが呼び出されます。次に、フラグがクリアされ、への次の呼び出しを待機し-setNeedsLayoutます。