2

私のUI構造:

UINavigationController
--UIViewController(first)
 |
 |Modal 
 |
 V 
UINavigationController (subclass)
--UIViewController (contains UIPageViewController)

iOS6の新しい自動ローテーションでは、UINavigationControllerのサブクラスを作成し、次を追加しました。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

向きを維持したいだけは縦向きです。

そして、UIPageViewControllerを次のように初期化します。

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

    PageDataViewController *startingViewController = [self viewControllerAtIndex:start storyboard:self.storyboard];

    NSArray *viewControllers = [NSArray arrayWithObject:startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];

    self.pageViewController.dataSource = self;

    [self addChildViewController:self.pageViewController];
    [self.view addSubview:self.pageViewController.view];

    // Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages.
    CGRect pageViewRect = self.view.bounds;
    self.pageViewController.view.frame = pageViewRect;

    [self.pageViewController didMoveToParentViewController:self];

次に、モーダルセグエを実行します。最初のUIViewControllerが縦向きの場合、pageViewControllerは機能しますが、最初のUIViewControllerが横向きの場合、常に例外が発生します。

*-[UIPageViewController willAnimateRotationToInterfaceOrientation:duration:]、/ SourceCache / UIKit_Sim / UIKit-2372 / UIPageViewController.m:945でのアサーションの失敗 キャッチされない例外により'NSInternalInconsistencyException'、理由にアプリを終了: 'いいえビューコントローラ' * *まずスローコールスタック:(0x2a5e012 0x19bae7e 0x2a5de78 0x1450f35 0xd75974 0x9f12b4 0x9f13ea 0x9e4c32 0x9f1372 0x9f13ea 0x9e4c32 0x9f1372 0x9f1751 0x93a1a6 0xbee5f9 0x9ec4f3 0x9ec777 0x9ec7b7 0xd57fe2 0xd49ad9 0xd49b54 0x9b1899 0x9b1b3d 0x13b8e83 0x2a1d376 0x2a1ce06 0x2a04a82 0x2a03f44 0x2a03e1b 0x2c967e3 0x2c96668 0x90265c 0xea7d 0x2685 0x1)libc ++ abi.dylib:例外をスローして終了します

4

4 に答える 4

4

実際には、別の解決策があります。

willAnimateRotationToInterfaceOrientationメソッドをrootViewControllerに呼び出すだけの回転では、そのメソッドを実装する必要があります。

@interface UIPageViewController (Rotation)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
@end

//実装ファイル

#import "UIPageViewController+Rotation.h"

@implementation UIPageViewController(Rotation)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {}
@end
于 2013-04-09T05:36:23.740 に答える
2

「supportedInterfaceOrientations」に関するドキュメントには、次のように書かれています。

ユーザーがデバイスの向きを変更すると、システムはルートビューコントローラーまたはウィンドウ全体に表示される最上位のビューコントローラーでこのメソッドを呼び出します。

メインウィンドウのrootViewControllerを現在のNavigationControllerクラスに設定してみましたか?

AppDelegateのように:

self.window.rootViewController = nvc;

そして、navigationControllerが変更されたら、rootViewControllerを再度設定します...

于 2012-09-24T18:16:58.120 に答える
0

UIPageViewControllerビューコントローラーを再度inに設定することで、問題を「修正」しましviewWillAppear:た。このメソッドが呼び出されたときに、ページビューコントローラーのスパインの場所が正しく、この情報に基づいて1ページまたは2ページ(ビューコントローラー)を設定したためです。

- (void)viewWillAppear:(BOOL)animated
{   
    [super viewWillAppear:animated];

    if(self.pageViewController.spineLocation == UIPageViewControllerSpineLocationMid)
    {
        BookPageViewController *currentViewController = self.pageViewController.viewControllers[0];
        NSArray *viewControllers = nil;

        NSUInteger indexOfCurrentViewController = [self.modelController indexOfViewController:currentViewController];
        if (indexOfCurrentViewController == 0 || indexOfCurrentViewController % 2 == 0) {
            UIViewController *nextViewController = [self.modelController pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController];
            viewControllers = @[currentViewController, nextViewController];
        } else {
            UIViewController *previousViewController = [self.modelController pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController];
            viewControllers = @[previousViewController, currentViewController];
        }
        [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
    }

    if(self.pageViewController.spineLocation == UIPageViewControllerSpineLocationMin)
    {
        [self.pageViewController setViewControllers:[NSArray arrayWithObject:[self.pageViewController.viewControllers objectAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
    }
}

UIPageViewControllerデリゲートメソッドを以下のように設定します

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
    BookPageViewController *currentViewController = self.pageViewController.viewControllers[0];

    if(UIInterfaceOrientationIsPortrait(orientation))
    {
        [self.pageViewController setViewControllers:[NSArray arrayWithObject:currentViewController] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];

        pageViewController.doubleSided = NO;

        return UIPageViewControllerSpineLocationMin;
    }

    if(UIInterfaceOrientationIsLandscape(orientation))
    {
        NSArray *viewControllers = nil;

        NSUInteger indexOfCurrentViewController = [self.modelController indexOfViewController:currentViewController];
        if (indexOfCurrentViewController == 0 || indexOfCurrentViewController % 2 == 0) {
            UIViewController *nextViewController = [self.modelController pageViewController:self.pageViewController viewControllerAfterViewController:currentViewController];
            viewControllers = @[currentViewController, nextViewController];
        } else {
            UIViewController *previousViewController = [self.modelController pageViewController:self.pageViewController viewControllerBeforeViewController:currentViewController];
            viewControllers = @[previousViewController, currentViewController];
        }
        [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];

        return UIPageViewControllerSpineLocationMid;
    }

    return UIPageViewControllerSpineLocationMin;
}
于 2015-10-15T10:55:39.953 に答える
0

viewWillAppearでビューコントローラーをUIPageViewControllerに設定することで、問題を「修正」しました。このメソッドが呼び出されたときに、ページビューコントローラーのスパインの場所が正しく、この情報に基づいて1ページまたは2ページ(ビューコントローラー)を設定したためです。

于 2016-10-28T19:16:48.780 に答える