旋转实现iOS(iPhone/iPad) 屏幕旋转响应函数的缺点与窗口大小位置调整,以及解决办法
2013-05-07 21:38
656 查看
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~
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;
}
文章结束给大家分享下程序员的一些笑话语录:
一边用着越狱的ip,一边拜乔帮主的果粉自以为是果粉,其实在乔帮主的眼里是不折不扣的叛徒。
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;
}
文章结束给大家分享下程序员的一些笑话语录:
一边用着越狱的ip,一边拜乔帮主的果粉自以为是果粉,其实在乔帮主的眼里是不折不扣的叛徒。
相关文章推荐
- iOS(iPhone/iPad) 屏幕旋转响应函数的缺点与窗口大小位置调整,以及解决办法
- Series 60 3rd---调整list box位置和大小后造成与scroll bar不一致的解决办法
- win7无法自由调整cmd窗口大小的解决办法
- Series 60 3rd---调整list box位置和大小后造成与scroll bar不一致的解决办法
- iPad/iPhone登陆iOS Beta页提示"Your session has expired"解决办法
- ios iphone ipad上iframe的宽度会扩大的解决办法
- 通过窗口大小适时调整以及子窗口的动态布局来解决窗口在不同DPI设置下的显示问题
- virtualBox 虚拟机窗口不能自由调整大小解决办法
- Series 60 3rd---调整list box位置和大小后造成与scroll bar不一致的解决办法
- 在VMware虚拟机软件中安装的Ubuntu虚拟机的窗口不能自动调整大小的解决办法
- ios -- 虚拟键盘弹出挡住textfield的分析以及解决办法
- springMVC实现REST开发详解(补充Json解析问题以及静态文件404错误解决办法)
- MFC_MoveWindow窗口、控件的大小、位置调整
- ViewPager实现引导界面以及进入下一个activity解决办法
- iPhone/iOS开启个人热点的相关位置调整小结
- qt中让控件位置岁窗口大小自动调整,并且自身大小不变
- Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制
- 在XIB 或者Storyboard 上面 控件的大小,位置都是对的, 但是显示的时候,就不对了 的解决办法
- IOS中动画的实现:以及视图的移动、缩放和旋转
- 【已解决】Ipad 1代-随意下载应用软件(此方法,同样适用于IOS 5.1.1的Iphone手机)