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