2

iOS8 では、UISplitViewController が変更され、保留中の displayMode の変更をデリゲートに 経由で通知するようになりましたsplitViewController:willChangeToDisplayMode:。この変更に対応して、セカンダリ ビュー コントローラーの一部を更新する必要があります。

このデリゲート メソッド中にセカンダリ VC でメソッドを呼び出すのは簡単ですが、VC は新しい境界がどうなるかまだ知りません。

セカンダリ VC の境界での KVO とは別に、VC の境界が変更されることを通知する合理的な方法はありますか? 理想的には、VC はviewWillTransitionToSize:withTransitionCoordinator:displayMode の変更を呼び出します。これにより、遷移に沿ってアニメーション化する機能が提供されるからです。

4

1 に答える 1

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.
        }
    }
}

ビューの境界でこれを試しましたが、フレームの KVO よりも頻繁に発生しました。

于 2014-09-06T06:20:03.180 に答える