2010-11-24 2 views
1

У меня есть представление. этот вид имеет колесо посередине. он также поддерживает iAds и автоматическое вращение. поэтому всякий раз, когда реклама появляется в верхней части экрана, или устройство вращается, колесо автоматически перестраивается в центр открытого пространства.iOS, KVO: Наблюдатель не отслеживает изменение myObject.myCalayer.center

Теперь у меня есть класс, чтобы определить, вращается ли пользователь круг. он получен из UIAdvancedGesture, но для правильной работы он должен знать центр колеса. Что меняется. как исправить?

Я хотел бы «наблюдать» myObject.myCALayer.center, и каждый раз, когда он изменяется, отправьте новое значение в мой класс обработки touchinput.

, так что я сделал это:

- (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 колес переместится на экран. но Наблюдатель не соблюдает это изменение. Как исправить?

ОБНОВЛЕНИЕ: , очевидно, есть проблема с KVO по свойствам CALayer. не

Я попытался подклассов 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. Свойство frame, например, для CALayer, похоже, является одним из этих свойств. Я успешно наблюдал изменения свойства bounds (CGRect), а именно KVO-совместимого (по крайней мере, в 10.6).

Я также тестировал свойство position, и он соответствует требованиям KVO на 10.6. Я не уверен в 10.5 и iOS.

Кажется, существуют различия в свойствах, совместимых с KVC/KVO, для CALayer между 10.5 и 10.6. В частности, пользовательские свойства подклассов CALayer не соответствуют требованиям KVO в 10.5, но соответствуют 10.6. Могут существовать другие различия в соответствии требованиям KVO между свойствами CALayer между 10.5, 10.6 и iOS.

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

Вы можете наблюдать некоторые структуры, так как они обернуты и поддерживаются КВЦ/КВО. Например, я успешно наблюдал изменения свойств ограничений (CGRect) и позиции (CGPoint) на CALayer. – Dalmazio 2011-01-25 15:28:51

Смежные вопросы