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

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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值