您的位置:首页 > 移动开发 > IOS开发

iOS(iPhone/iPad) 屏幕旋转响应函数的缺点与窗口大小位置调整,以及解决办法

2013-05-07 17:31 429 查看
1,UIViewController响应屏幕旋转的缺点:

(1)旋转之前响应的操作缺点:

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

在这里面处理窗口控件大小位置调整,最大的问题就是不能通过 self.view.frame 获取布局区域。因为这时获取到的是旋转前的,而不是旋转后的。

(2)旋转之后响应的操作缺点:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;

在这里处理窗口控件大小位置调整,最大的问题就是不知道目标转向,就是旋转后到底是横屏还是竖屏。

(3)上述两者结合的缺点:

有人可能会迫不及待地说增加一个成员变量在willRotateToInterfaceOrientation记住目标转向toInterfaceOrientation,然后在didRotateFromInterfaceOrientation实现调整。

UIViewController多了,每个增加那么一个成员变量不觉得累赘吗?

2,解决方法

(1)在旋转之前的willRotateToInterfaceOrientation里面实现调整,但是目标布局区域不是通过self.view.frame来获取,而是通过本人自定义函数getClientRect来实现。

举例:

//Howard 2013-05-07 旋转之前的操作(仔细看了,不需要用到 didRotateFromInterfaceOrientation )

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

{

//先判断是否有效转向

if( UIDeviceOrientationIsValidInterfaceOrientation( toInterfaceOrientation ) )

{

//参数表示是否横屏,这里我只需要知道屏幕方向就可以提前知道目标区域了!

[self setCtrlPos: UIInterfaceOrientationIsLandscape( toInterfaceOrientation) ];

}

}

//这个用来实现窗口空间大小位置调整

-(void)setCtrlPos:(BOOL)isHorz

{

   CGRect rcClient = getClientRect( isHorz );

//其他控件根据这个rcClient来调整位置大小

}

//下面这个函数的好处在于,获取到的布局区域不会随着 某某UIViewController的self.view.frame来改变,只与屏幕转向有关,与UIViewController无关。

//可以根据横屏还是竖屏,提前预知目标窗口区域大小

//不要看多了这么一整个函数,但是给多个UIViewController调用就很方便了。

//这一个函数,本人丢到自定义的公共文件去实现。当做全局函数,一般用global.h来声明接口,在global.m实现。

CGRect getClientRect( BOOL isHorz)

{

BOOL isStatusBarHidden = [[ UIApplication sharedApplication ]isStatusBarHidden ]; //判断屏幕顶部有没状态栏出现

CGRect rcScreen = [[UIScreen mainScreen] bounds];//这个不会随着屏幕旋转而改变

int status_height = isStatusBarHidden ? 0 :20;

CGRect rcClient = rcScreen;

if( isHorz )

{

rcClient.size.width -= status_height;

}

else

{

rcClient.size.height -= status_height;

}

CGRect rcArea = rcClient;

if( isHorz )

{

rcArea.size.width = MAX(rcClient.size.width,rcClient.size.height);

rcArea.size.height = MIN(rcClient.size.width,rcClient.size.height);

}

return rcArea;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: