2010-11-24 5 views
1

私はビューを持っています。このビューには中央にホイールがあります。 iAdsと自動回転もサポートしています。広告が上部に表示されるか、デバイスが回転するたびに、ホイールが自動的に空き領域の中心に移動します。iOS、KVO:ObserverがmyObject.myCALayer.centerへの変更を追跡できない

今、私は、ユーザーが車輪を回しているかどうかを検出するクラスを持っています。それはUIAdvancedGestureから派生していますが、正しく動作するためにはホイールの中心を知る必要があります。それは変化し続ける。直し方?

私はmyObject.myCALayer.centerを「観察」したいと思います。変更するたびに、新しい値をtouchinput-processingクラスに送ります。

- (id) initWithFrame: (CGRect) theFrame 
       target: (id) p_target 
    actionPlayChord: (SEL) p_actionPlayChord 
     actionSettings: (SEL) p_actionSettingsClick 
{ 
    target = p_target; 
    actionPlayChord = p_actionPlayChord; 

    self = [super initWithFrame: theFrame]; 

    if (! self) 
     return nil; 

    CGPoint centre = CGPointMake(theFrame.size.width/2.0, theFrame.size.height/2.0); 

    WheelTouchHandler * wheelTouchHandler = [WheelTouchHandler alloc]; 
    [wheelTouchHandler initWithTarget: self 
         activateAction: @selector(engaged:) 
         moveCWAction: @selector(movedCW:) 
         moveACWAction: @selector(movedACW:) 
    ] ; 

    [self addGestureRecognizer: wheelTouchHandler]; 

    [self setMultipleTouchEnabled: NO]; 


    self.wheel = [Wheel alloc]; 

    NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *symbol = [prefs stringForKey: @"sharpsOrFlats"]; 

    [self.wheel init_rMax: WHEEL_R_MAX 
        rMin: WHEEL_R_MIN 
        rGap01: WHEEL_R_RATIO_GAP_TO_DISC 
        rRatio: WHEEL_R_RATIO_OUTER_TO_INNER 
       sharpsFlats: symbol 
       bitmapSize: theFrame.size 
    ] ; 

    [self.layer addSublayer: [self.wheel wheelLayer] ]; 

    [self.wheel.wheelLayer setPosition: centre ]; 


    [self.layer addSublayer: [self.wheel labelLayer] ]; 
    [self.wheel.labelLayer setPosition: centre ]; 

    // "center" fails too... 
    [self.wheel.wheelLayer addObserver:self forKeyPath:@"position" options:0 context:nil]; 


    return self; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    NSLog(@"Changed!"); <-- this line does not get hit - why? 
} 

は、しかし、何も記録されません取得します:

ので、私はこれを行っています。私は何を間違えているのですか?明らかに、ホイールのCALayerは画面上に位置を変えます。オブザーバーはこの変化を観察することができません。直し方?

更新: 明らかに、CALayerプロパティにKVOの問題があります。

私はこのように、のCALayerをサブクラス化しようとしている:

@implementation WatchedLayer

+(BOOL) automaticallyNotifiesObserversForKey: (NSString *) key 
{ 

    //, if key is @"position" return YES, otherwise return [super automatically...] 

    if ([key isEqual: @"position"]) 
     return YES; // doesn't get hit 

    if ([key isEqual: @"center"]) 
     return YES; // <-- gets hit 

    return [super automaticallyNotifiesObserversForKey: key]; 
} 

- (void) setValue: (id) value 
      forKey: (NSString *) key 
{ 
    // method doesn't get hit 


    if ([key isEqual: @"position"]) 
    { 
     NSLog(@"POSHIT"); 
    } 

    [super setValue: value 
      forKey: key]; 
} 

@end 

まだありません喜び

答えて

4

一部のCALayerプロパティはKVOに準拠していません。たとえば、CALayerのフレームプロパティは、それらのプロパティの1つであるように見えます。私はKVOに準拠しています(少なくとも10.6では)境界プロパティ(CGRect)の変更を正常に観察しました。

また、私はpositionプロパティをテストしており、10.6ではKVOに準拠しています。私は約10.5とiOSについては分かりません。

CALayerのKVC/KVO準拠のプロパティに10.5と10.6の間に違いがあるようです。特に、CALayerサブクラスのカスタムプロパティは、10.5ではKVOに準拠していないように見えますが、10.6では準拠しています。 10.5,10.6、およびiOSの間のCALayerのプロパティ間には、他のKVO準拠の違いが存在する可能性があります。

http://lists.apple.com/archives/cocoa-dev/2008/Dec/msg01141.html

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html%23//apple_ref/doc/uid/TP40006082-SW1

-2

私はあなたがオブジェクトだけを観察することができると信じて。あなたが観察しようとしているプロパティは構造体です。

+1

彼らはラップとKVC/KVOによってサポートされているので、あなたは、いくつかの構造体を観察することができます。たとえば、CALayerの境界(CGRect)と位置(CGPoint)のプロパティの変更を正常に監視しました。 – Dalmazio

関連する問題