IOS重力感应

iPhone和iPad设备有4个方向的状态,我们可以针对应用当前所处的方向调整界面。

为了使应用支持不同的方向,首先我们需要在项目设置中设置设备支持的方向(也可以在项目的plist中设置)

Portrait  竖放,home键在屏幕下方

Upside Down  竖放,home键在屏幕上方

Landscape Left  横放,home键在屏幕左方

Landscape Right  横放,home键在屏幕右方

我们在StoryBoard中拖入一个新的ViewController,绑定好它的File's Owner,然后放入6个UIView,设置好不同的背景色

程序运行后,我们在旋转模拟器,发现在竖屏和横屏状态下,界面显示如下

     

显然横屏状态下这样的显示是不适合的,为了得到合适的显示效果,我们需要在ViewController中写一些代码。

首先我们先看一下在ViewController中和重力感应相关的一些函数

- (BOOL)shouldAutorotate  

此函数返回YES表示此视图控制器支持重力感应,返回NO表示此视图控制器不支持重力感应

 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation  

此函数设置视图控制器加载后最先显示的方向,UIInterfaceOrientation是一个结构体,支持的取值如下

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight

 

- (NSUInteger)supportedInterfaceOrientations

此函数设置视图控制器支持的方向(需要shouldAutorotate返回YES),支持的取值如下

UIInterfaceOrientationMaskPortrait

UIInterfaceOrientationMaskLandscapeLeft

UIInterfaceOrientationMaskLandscapeRight

UIInterfaceOrientationMaskPortraitUpsideDown

UIInterfaceOrientationMaskLandscape

UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown)

UIInterfaceOrientationMaskAllButUpsideDown 

 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

用户界面即将旋转时触发此函数,toInterfaceOrientation表示即将到达的方向

 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

用户界面旋转结束时触发此函数,fromInterfaceOrientation表示旋转前的方向

 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

用户界面旋转过程中触发此函数,一般在此函数中定制翻转后控件的位置和大小

 

所以在上面那个实例中我们先将6个UIVIew控件连结到视图控制器中,然后在willAnimateRotationToInterfaceOrientation:duration:中修改旋转后的界面

 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
        self.view1.frame = CGRectMake(50, 20, 110, 130);
        self.view2.frame = CGRectMake(225, 20, 110, 130);
        self.view3.frame = CGRectMake(400, 20, 110, 130);
        
        self.view4.frame = CGRectMake(50, 180, 110, 130);
        self.view5.frame = CGRectMake(225, 180, 110, 130);
        self.view6.frame = CGRectMake(400, 180, 110, 130);
    }
}

上面代码在旋转到横屏时修改view控件的位置,因为我们strobyboard中默认布局了竖直状态下的界面,所以在代码中不需要重新布局view控件竖直状态时的位置,但是如果我们是用编码方式放置的控件,那么需要在上面代码中添加一个else,设置竖屏后的界面。

    

原文地址:https://www.cnblogs.com/zanglitao/p/4051706.html