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;
}
(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;
}
相关文章推荐
- 旋转实现iOS(iPhone/iPad) 屏幕旋转响应函数的缺点与窗口大小位置调整,以及解决办法
- Series 60 3rd---调整list box位置和大小后造成与scroll bar不一致的解决办法
- ios iphone ipad上iframe的宽度会扩大的解决办法
- win7无法自由调整cmd窗口大小的解决办法
- 通过窗口大小适时调整以及子窗口的动态布局来解决窗口在不同DPI设置下的显示问题
- virtualBox 虚拟机窗口不能自由调整大小解决办法
- iPad/iPhone登陆iOS Beta页提示"Your session has expired"解决办法
- Series 60 3rd---调整list box位置和大小后造成与scroll bar不一致的解决办法
- 在VMware虚拟机软件中安装的Ubuntu虚拟机的窗口不能自动调整大小的解决办法
- Series 60 3rd---调整list box位置和大小后造成与scroll bar不一致的解决办法
- unity, 显示像素图,以及iOS下像素图变模糊解决办法
- itouch/iphone/ipad充不上电的解决办法
- MFC 控件随窗口尺寸变化自动调整位置及大小
- 关于IE6和IE7关闭窗口时提示和不提示以及上传图片前的本地预览解决办法
- [转]VC++之随父窗口变化调整控件大小/位置
- 无法安装Apple mobile device support 导致ipad(iphone)无法连接itunes的解决办法
- MFC 控件随窗口尺寸变化自动调整位置及大小
- JQuery UI Drag and Drop在ipad和iphone上的解决办法
- 关于IE6和IE7关闭窗口时提示和不提示以及上传图片前的本地预览解决办法