UISplitViewController 在尝试使用其中的 UINavigationController 后停止自动旋转

Posted

技术标签:

【中文标题】UISplitViewController 在尝试使用其中的 UINavigationController 后停止自动旋转【英文标题】:UISplitViewController stops auto-rotating after trying to use the UINavigationController inside of it 【发布时间】:2010-12-28 06:06:39 【问题描述】:

我的 iPad 应用程序中的 UISplitViewController 遇到了一些问题。我正在尝试使用 UISplitView 内的 UINavigationController 制作一个简单的导航树。我已使用以下基本代码来执行此操作:

NavController.h

@interface NavController : NSObject 
    /* 
     * This is connected properly to the UINavigationController in the 
     * UISplitViewController through Interface Builder.
     */

    UINavigationController *navigationController;

 

 @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

 @end

NavController.m

#import "NavController.h"

@implementation NavController

@synthesize navigationController;

- (void) awakeFromNib 
    UIViewController *testController = [[UIViewController alloc] init];
    UITableView *tableView = [[UITableView alloc] init];

    [testController setView: tableView];

    [navigationController pushViewController: testViewController
                                    animated: YES];



@end

这段代码成功地将视图推送到导航控制器,我可以使用后退按钮导航回来,但是,我的问题在于,发生这种情况后,我的 UISplitViewController 不再自动旋转或从纵向位置。当我删除此代码(并且视图不会被推送)时,它会按预期工作。

我做错了什么,我是否以正确的方式解决这个问题?

【问题讨论】:

【参考方案1】:

这也让我发疯了。我做了几件事使它起作用,但我对我的解决方案不满意——1)我不太了解它,2)它看起来很老套。

我将此添加到我的应用委托(我的 .m 文件):

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    return YES;

@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    return YES;

@end

这在大多数情况下都有效。对于没有自动旋转的视图,我必须自己使用变换手动旋转视图。我做了类似的事情:

- (void)deviceOrientationDidChangeWithAnimation:(BOOL)animated 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

    if (orientation == oldOrientation) 
        return;
    

    if (animated) 
        CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:duration];
        [UIView setAnimationDidStopSelector:@selector(orientationChanged)];
    

    [self sizeToFitOrientation:YES];

    if (animated) 
        [UIView commitAnimations];
    

    oldOrientation = orientation;


- (CGAffineTransform)transformForOrientation 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == UIInterfaceOrientationLandscapeLeft) 
        return CGAffineTransformMakeRotation(M_PI*1.5); // rotated CCW
     else if (orientation == UIInterfaceOrientationLandscapeRight)  // CW
        return CGAffineTransformMakeRotation(M_PI/2);
     else if (orientation == UIInterfaceOrientationPortraitUpsideDown)  // CCW
        return CGAffineTransformMakeRotation(-M_PI);
     else  // CW
        return CGAffineTransformIdentity;
    


- (void)sizeToFitOrientation:(BOOL)transform 
    if (transform) 
        self.view.transform = CGAffineTransformIdentity;
    

    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.width/2), frame.origin.y + ceil(frame.size.height/2));

    CGFloat width = frame.size.width - 0 * 2;
    CGFloat height = frame.size.height - 0 * 2;

    UIInterfaceOrientation _orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (UIInterfaceOrientationIsLandscape(_orientation)) 
        self.view.frame = CGRectMake(0, 0, height, width);
     else 
        self.view.frame = CGRectMake(0, 0, width, height);
    
    self.view.center = center;

    if (transform) 
        self.view.transform = [self transformForOrientation];
    

希望这会有所帮助!如果有人能指出我犯过的错误(或我一直在做的坏事),我会很乐意学习。 :)

【讨论】:

有趣。我从没想过设置 UINavigationController 让它自动旋转。我会毫不犹豫地尝试一下。我希望 UISplitView 更易于使用...谢谢您的回答! 今晚有机会尝试一下。我将我的 UINavigationController 子类化并添加了启用自动旋转所需的方法。它现在完美无缺!到目前为止,我还没有做任何手动旋转视图。非常感谢您的解决方案! 太好了!我仍然不太明白它为什么会起作用,但我很高兴它起作用了:) 谢谢!只是覆盖标签栏控制器对我有用!耶! =)

以上是关于UISplitViewController 在尝试使用其中的 UINavigationController 后停止自动旋转的主要内容,如果未能解决你的问题,请参考以下文章

在 UISplitViewController 中使用 SwiftUI 列表侧边栏

故事板、UIViewController 和 UISplitViewController

隐藏 UISplitViewController 的根视图

嵌套详细视图(UISplitViewController)中缺少后退按钮

实现 UISplitViewController 主从应用程序 - UIPopOverController 在旋转之前为空。

不能将 UISplitViewController 放在 UITabBarController 内