【问题标题】:How can I prepare a UISplitViewController secondary VC for a change to displayMode?如何准备 UISplitViewController 辅助 VC 以更改 displayMode?
【发布时间】:2014-09-06 02:39:59
【问题描述】:
在 iOS8 中,UISplitViewController 发生了变化,现在通过 splitViewController:willChangeToDisplayMode: 通知它的代理有一个挂起的 displayMode 变化。我需要更新辅助视图控制器的某些方面以响应此更改。
在此委托方法期间调用辅助 VC 上的方法很简单,但 VC 还不知道它的新边界是什么。
除了辅助 VC 边界上的 KVO 之外,是否有合理的方式来通知 VC 的边界将发生变化?理想情况下,VC 会调用 viewWillTransitionToSize:withTransitionCoordinator: 来更改 displayMode,因为这提供了与过渡一起制作动画的能力。
【问题讨论】:
标签:
ios
objective-c
uiviewcontroller
uisplitviewcontroller
displaymode
【解决方案1】:
所以,现在我只使用 KVO。我听从了here 的一些建议。
在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 更频繁地触发。