Как я могу подготовить вторичный VC UISplitViewController для изменения displayMode?

В iOS8 UISplitViewController изменился, и теперь уведомляет своего делегата об ожидающем изменении displayMode через splitViewController:willChangeToDisplayMode:, Мне нужно обновить некоторые аспекты моего вторичного контроллера представления в ответ на это изменение.

Достаточно просто вызвать методы на вторичном VC во время этого метода делегата, но VC еще не знает, какими будут его новые границы.

Есть ли разумный способ получить уведомление о том, что границы VC изменятся, кроме KVO на границах вторичного VC? В идеале, VC будет иметь viewWillTransitionToSize:withTransitionCoordinator: вызывается для изменения displayMode, так как это обеспечивает возможность анимации вместе с переходом.

1 ответ

Итак, сейчас я просто использую 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.
        }
    }
}

Я пробовал это на границах обзора, но это срабатывало гораздо чаще, чем КВО на кадре.

Другие вопросы по тегам