1. 做横竖屏适配的时,需要判断当前状态是横屏还是竖屏,有两种方法:
第1种:[UIScreen mainScreen].bounds.size.width == 768
优点:把这个抽成宏之后,随时可以判断横竖屏, #define Lanscape ([UIScreen mainScreen].bounds.size.width == 768)
缺点:只在iOS8可行,也就是说在iOS8中横屏的width=1024,竖屏的width=768; 而在iOS7上,横竖屏的width=768
第2种: - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
屏幕旋转时,会自动调用该方法,只需要在根控制器重写该方法
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
BOOL landscape = UIInterfaceOrientationIsLandscape(toInterfaceOrientation); //判断是不是横屏
[子视图1 rotate:landscape]; // 子视图1的公共方法
[子视图2 rotate:landscape]; // 子视图2的公共方法
}
在子视图1中,要实现- (void)rotate:(BOOL)landscape 方法
- (void)rotate:(BOOL)landscape
{
if (landscape) {
// 横屏情况下,frame是怎样的
} else {
// 竖屏情况下,frame是怎样的
}
// 如果子视图1里,如果也有子视图,可以这样
[子视图1的子视图A rotate:landscape];
[子视图1的子视图B rotate:landscape];
}
实际可能有很多视图都需要响应横竖屏,所以可以- (void)rotate:(BOOL)landscape抽成协议,只要遵守协议,就拥有了该方法的声明,自行实现协议方法.
优点:iOS7\8都可行
缺点:比较繁琐
2. 补充说明
屏幕旋转时,窗口会知道,窗口然后告诉根控制器,然后根控制器传给子控制器,子控制器又传给子控制器,所以控制器的view要响应屏幕旋转事件,通过找父控制器,一层层往上找,最终要能找到窗口才行.