注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

IOS & JAVA KEY

(iMilo)

 
 
 

日志

 
 
关于我

All the splendor in the world is not worth a good friend!! Hello my friend!!

网易考拉推荐

iOS6屏幕方向控制(转)  

2012-10-23 10:15:19|  分类: IOS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

转至:{iOS 6Rotation}

iOS 6rotation改变了很多。先来看看官方的描述  http://www.bgr.com/2012/08/06/ios-6-beta-4-change-log-now-available/

 

知识点:

 

UIViewControllershouldAutorotateToInterfaceOrientation方法被deprecated。在ios6里,是使用supportedInterfaceOrientations and shouldAutorotate 2个方法来代替shouldAutorotateToInterfaceOrientation注意:为了向后兼容iOS 4 and 5,还是需要在你的app里保留shouldAutorotateToInterfaceOrientation

 

for ios 4 and 5, 如果没有重写shouldAutorotateToInterfaceOrientation,那么对于iphone来讲,by default是只支持portrait,不能旋转。

 

for ios 6, 如果没有重写shouldAutorotate and supportedInterfaceOrientations,by default, iphone则是"可以旋转,支持非upside down的方向",而ipad"可以选择,支持所有方向"

 

example 1: for ios 4 and 5, iphone device, 若要"可以旋转,支持非upside down的方向",则可以在view controller

 

[cpp] view plaincopyprint?- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 

return (interfaceOrientation != UIDeviceOrientationPortraitUpsideDown); 

} 

 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

return (interfaceOrientation != UIDeviceOrientationPortraitUpsideDown);

}

example 2: for ios 6, iphone device, 若要不能旋转,只支持portait",则可以在view controller

 

 

[cpp] view plaincopyprint?- (BOOL)shouldAutorotate 

{ 

    return NO; 

} 

 

- (BOOL)shouldAutorotate

{

    return NO;

}

 

example 3: for ios 6, ipad device, 若要可以旋转,只支持landscape",则可以在view controller

 

[cpp] view plaincopyprint?-(NSUInteger)supportedInterfaceOrientations{ 

    return UIInterfaceOrientationMaskLandscape; 

} 

 

- (BOOL)shouldAutorotate 

{ 

    return YES; 

} 

 

-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskLandscape;

}

 

- (BOOL)shouldAutorotate

{

    return YES;

}

 

 

* iOS 4 and 5,都是由具体的view controller来决定对应的vieworientation设置。而在iOS 6,则是由top-most  controller来决定vieworientation设置。

 

举个例子:你的approotViewControllernavigation controller "nav", nav"里的stack依次是:main view -> sub view > sub sub view,而main view里有一个buttonpresent modal view "modal view".

 

那么for ios 4 and 5,在ipad里,如果你要上述view都仅支持横屏orientation,你需要在上面的main view, sub view, sub sub view, model view里都添加

 

 

[cpp] view plaincopyprint?- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 

return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight); 

} 

 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight);

}

而对于iOS6, 由于是由top-most controller来设置orientation,因此你在main view, sub view, sub sub view里添加下面的代码是没有任何效果的,而应该是在nav controller里添加下列代码。而modal view则不是在nav container里,因此你也需要在modal view里也添加下列代码。

 

 

[cpp] view plaincopyprint?-(NSUInteger)supportedInterfaceOrientations{ 

    return UIInterfaceOrientationMaskLandscape; 

} 

 

- (BOOL)shouldAutorotate 

{ 

    return YES; 

} 

 

-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskLandscape;

}

 

- (BOOL)shouldAutorotate

{

    return YES;

}

注意:

 

*你需要自定义一个UINavigationController的子类for "nav controller",这样才可以添加上述代码。

 

navigation controller类似,tab controller里的各个vieworientation设置应该放在tab controller

 

 

for ios6top-most controller决定orientation设置,导致这样一个问题:在 top-most controller里的views无法拥有不相同的orientation设置。例如:for iphone, nav controller里,你有main view, sub view and sub sub view,前2个都只能打竖,而sub sub view是用来播放video,可以打横打竖。那么在ios 4 and 5里可以通过在main view and sub viewshouldAutorotateToInterfaceOrientation里设置只能打竖,而在sub sub viewshouldAutorotateToInterfaceOrientation设置打竖打横即可。而在ios 6里则无法实现这种效果,因为在main view, sub view and sub sub vieworientation设置是无效的,只能够在nav controller里设置。那么你可能想着用下列代码在nav controller里控制哪个view打竖,哪个view打横

 

[cpp] view plaincopyprint?-(NSUInteger)supportedInterfaceOrientations{ 

    if([[self topViewController] isKindOfClass:[SubSubView class]]) 

        return UIInterfaceOrientationMaskAllButUpsideDown; 

    else 

        return UIInterfaceOrientationMaskPortrait; 

} 

 

-(NSUInteger)supportedInterfaceOrientations{

    if([[self topViewController] isKindOfClass:[SubSubView class]])

        return UIInterfaceOrientationMaskAllButUpsideDown;

    else

        return UIInterfaceOrientationMaskPortrait;

}

 

是的,这样可以使得在main view and sub view里无法打横,而sub sub view横竖都行。但问题来了,如果在sub sub view时打横,然后back to sub view,那么sub view是打横显示的!

 

目前想到的解决方法只能是把sub sub view脱离nav controller,以modal view方式来显示。这样就可以在modal view里设置打横打竖,而在nav controller里设置只打竖。

 

 

说了那么多,其实如果你的app的所有vieworientation的设置是统一的,那么你可以简单的在plist file里设置即可,不用添加上面的代码。而如果你添加了上面的代码,就会覆盖plistorientation的设置。

 

in iOS 6, view controller present时,不会call willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:, and didRotateFromInterfaceOrientation: methods,只有在发生rotate的时候才会call

  评论这张
 
阅读(1527)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017