在iOS8中,UISplitViewController发生了更改,现在通过splitViewController:willChangeToDisplayMode:
通知其代理一个挂起的displayMode更改。我需要更新辅助视图控制器的某些方面以响应此更改。
在这个委托方法中调用辅助VC上的方法很简单,但VC还不知道它的新边界是什么
除了二级VC边界上的KVO外,是否有合理的方式通知VC边界将发生变化?理想情况下,VC会调用viewWillTransitionToSize:withTransitionCoordinator:
来更改displayMode,因为这提供了在转换的同时设置动画的能力。
所以,现在我只使用KVO。我听从了这里的一些建议。
在viewDidLoad
:中
[self.view addObserver:self
forKeyPath:NSStringFromSelector(@selector(frame))
options:(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew)
context:nil];
然后:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([object isKindOfClass:[UIScrollView class]] && [keyPath isEqualToString:NSStringFromSelector(@selector(frame))]) {
CGRect newFrame = [change[@"new"] CGRectValue];
CGRect oldFrame = [change[@"old"] CGRectValue];
if ((newFrame.size.width == oldFrame.size.width) || (newFrame.size.height == oldFrame.size.height)) {
// If one dimension remained constant, we assume this is a displayMode change instead of a rotation
// Make whatever changes are required here, with access to new and old frame sizes.
}
}
}
我在视图的边界上尝试了这个,但它比框架上的KVO发射频率高得多。