iOS, KVO: Наблюдателю не удается отследить изменение в myObject.myCALayer.center - PullRequest
1 голос
/ 24 ноября 2010

У меня есть вид.этот вид имеет колесо посередине.он также поддерживает iAds и автоматическое вращение.поэтому всякий раз, когда реклама появляется в верхней части или устройство вращается, колесо автоматически перемещается в центр открытого пространства.

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

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

- (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, например:

+(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

но все равно нет радости

Ответы [ 2 ]

4 голосов
/ 25 января 2011

Некоторые свойства 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

0 голосов
/ 23 января 2011

Я верю, что вы можете наблюдать только за объектами. Свойства, которые вы пытаетесь наблюдать, являются структурами.

...