键值观察不适用于 zoomScale

Key-value observing doesn't work for zoomScale

我遇到了以下问题。我有一个 UIScrollView,_myScrollView,并且我想要另一个 UIScrollView 跟随它的移动。所以我对属性 "zoomScale" 和 "contentOffset" 使用键值观察,但是 observeValueForKeyPath:ofObject:change:context: 方法只报告 "contentOffset",而不是 "zoomScale",尽管缩放效果很好。 (请参阅下面的代码片段。)这可能是什么原因?

-(void)viewDidLoad {
    ...
    [_myScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:NULL];
    [_myScrollView addObserver:self forKeyPath:@"zoomScale" options:NSKeyValueObservingOptionNew context:NULL];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"zoomScale"]) {
        NSLog(@"zoomScale: %@", change); // Never gets called
    }
    ...
}

UIKit 实际上不支持 KVO。

From the docs:

Note: Although the classes of the UIKit framework generally do not support KVO you can still implement it in the custom objects of your application, including custom views.

它有时确实有效(如您所见),但对它的支持没有记录且不一致。请改用委托方法。

zoomScale 属性 不符合 KVO。但是 UIScrollViewDelegate 有一个 scrollViewDidZoom 方法,您可以使用它来跟踪对 zoomScale 的更改。