想要使用多个笔尖来实现不同的iphone接口方向

时间:2010-09-24 11:46:24

标签: iphone ipad orientation

我有一个情况,我创建了两个不同的笔尖,一个在纵向模式,另一个在横向模式。我在视图中有很多设计,所以我不得不选择两个不同的笔尖。现在,我想在接口在

中旋转时切换笔尖
  

常见的viewController

这样我就可以保留填充值和视图中控件的状态。

现在我正在使用

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Override to allow orientations other than the default portrait orientation.
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight ){
    [self initWithNibName:@"LandscapeNib" bundle:nil];
}else if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
    [self initWithNibName:@"PortraitNib" bundle:nil];

}


return YES;

}

但它不会改变Nib,它会显示初始加载的笔尖。我猜它是加载但没有显示,因为初始笔尖已经显示,不会被删除。我无法找到使用通用视图控制器处理多个笔尖的解决方案,以便我可以轻松处理控件的功能?

4 个答案:

答案 0 :(得分:6)

您应该为横向模式创建一个特殊的视图控制器,并在设备旋转时以模态方式显示它。要在设备旋转时收到通知,请注册UIDeviceOrientationDidChangeNotification通知。

对于需要在纵向和横向上呈现不同的复杂视图,这是Apple实施它的推荐方法。请阅读此处了解更多详情:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW26

以下是Apple文档的摘录。在init或awakeFromNib中注册通知:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
   [[NSNotificationCenter defaultCenter] addObserver:self
                             selector:@selector(orientationChanged:)
                             name:UIDeviceOrientationDidChangeNotification
                             object:nil];

并且在orientationChanged中根据当前轮换以模态方式呈现您的横向视图控制器,或者将其关闭:

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
        !isShowingLandscapeView)
    {
        [self presentModalViewController:self.landscapeViewController
                                animated:YES];
        isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait &&
             isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        isShowingLandscapeView = NO;
    }
}

答案 1 :(得分:5)

shouldAutorotateToInterfaceOrientation:应该只返回YES或NO。根据我的经验,在这里进行任何扩展处理并不是一个好主意。来自文档:

  

您实施此方法   应该简单地返回YES或NO   关于价值   interfaceOrientation参数。不要   试图获得价值   interfaceOrientation属性或检查   由...报告的方向值   UIDevice类。你的视图控制器   要么能够支持a   给定方向或不是。

加载你的笔尖以响应设备轮换的更好的地方是

willRotateToInterfaceOrientation:duration:didRotateToInterfaceOrientation:

答案 2 :(得分:2)

一旦自己已经初始化,你就无法再次自我启发。

旋转时,您需要:

  1. 使用loadNibNamed:owner:options: 用手将笔尖装入 NSArray的。 (见the documention)。
  2. 将self.view设置为index处的对象 该数组的0。

答案 3 :(得分:-2)

我需要为自己的应用程序做同样的事情,最后得到一个特定的UIAutoRotateView类,它将为你处理。

参见解释here

希望这有帮助。