ios5和6在屏幕的选择方面做了不少的修改。主要是取消了几个api的函数。
– didAnimateFirstHalfOfRotationToInterfaceOrientation: Deprecated in iOS 5.0
– willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: Deprecated in iOS 5.0
– willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration: Deprecated in iOS 5.0
– shouldAutorotateToInterfaceOrientation: Deprecated in iOS 6.0
剩余:
– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
剩余这几个函数。平时的项目一般用系统旋转后自动对齐功能,大部分都可以满足需求。这次修改一个项目,tableview在旋转后cell需要加载不同的xib文件,于是重载didRotateFromInterfaceOrientation,不过发现系统并没有调用这个函数。想了一下,估计是tableviewController并不是rootviewControlller。而且是放在其他第三方的ViewController内,估计是第三方ViewController没有使用addChildViewController把tableViewController放入其子controller。查看了一下代码。发现估计是正确的。但是不太想修改这个第三方的ViewController。因为嵌套了2个第三方的ViewController,要修改起来会比较麻烦。
想了想使用注册旋转事件来处理这个需求。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)
name:@"UIDeviceOrientationDidChangeNotification" object:nil];
- (void)didRotate:(NSNotification *)notification
{
NSLog(@"didRotate:。---interFaceOrientation:%d,DeviceOrientation:%d",
self.interfaceOrientation,[[UIDevice currentDevice] orientation]);
//[self.tableView reloadData];
}
IOS6输出如下,程序设置是不支持UIInterfaceOrientationPortraitUpsideDown。所以interFaceOrientation不会出现2的情况。
didRotate:。---interFaceOrientation:4,DeviceOrientation:4
didRotate:。---interFaceOrientation:4,DeviceOrientation:2
didRotate:。---interFaceOrientation:3,DeviceOrientation:3
didRotate:。---interFaceOrientation:1,DeviceOrientation:1
可以根据interFaceOrientation的值对界面进行更新处理。非常完美。准备收工。不过在测试IOS5的时候发现,杯具了。
IOS5的输出入如下。interFaceOrientation并不会变化。只有DeviceOrientation会变化。
didRotate:。---interFaceOrientation:1,DeviceOrientation:3
didRotate:。---interFaceOrientation:1,DeviceOrientation:4
didRotate:。---interFaceOrientation:1,DeviceOrientation:2
didRotate:。---interFaceOrientation:1,DeviceOrientation:3
didRotate:。---interFaceOrientation:1,DeviceOrientation:1
这样不是大问题,那就不使用interFaceOrientation,使用DeviceOrientation吧。
当旋转后调用[self.tableView reloadData];tablevie会进行更新,然后根据DeviceOrientation进行cell的变化处理
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"tableView:cellforrowAtIndexPath:。---interFaceOrientation:%d,DeviceOrientation:%d"
,self.interfaceOrientation,[[UIDevice currentDevice] orientation]);
......
}
上边的输出你估计ios5和ios6的区别么。非常容易估计到,interFaceOrientation和DeviceOrientation的状态应该和didRotate一样。
IOS6的输出:
didRotate:。---interFaceOrientation:4,DeviceOrientation:4
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:4
didRotate:。---interFaceOrientation:4,DeviceOrientation:2
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:2
didRotate:。---interFaceOrientation:3,DeviceOrientation:3
tableView:cellforrowAtIndexPath:。---interFaceOrientation:3,DeviceOrientation:3
didRotate:。---interFaceOrientation:3,DeviceOrientation:1
tableView:cellforrowAtIndexPath:。---interFaceOrientation:3,DeviceOrientation:1
IOS5的输出:
didRotate:。---interFaceOrientation:1,DeviceOrientation:4
tableView:cellforrowAtIndexPath:。---interFaceOrientation:1,DeviceOrientation:4
didRotate:。---interFaceOrientation:1,DeviceOrientation:2
tableView:cellforrowAtIndexPath:。---interFaceOrientation:1,DeviceOrientation:2
didRotate:。---interFaceOrientation:1,DeviceOrientation:3
tableView:cellforrowAtIndexPath:。---interFaceOrientation:1,DeviceOrientation:3
didRotate:。---interFaceOrientation:1,DeviceOrientation:1
tableView:cellforrowAtIndexPath:。---interFaceOrientation:1,DeviceOrientation:1
最杯具的东西不在上边,最杯具的东西是当程序启刚刚启动后,未触发旋转事件的时候的interFaceOrientation和DeviceOrientation的状态。
IOS6的输出:
tableView:cellforrowAtIndexPath:。---interFaceOrientation:1,DeviceOrientation:0
下边不在UIInterfaceOrientationPortraitUpside的时候启动的输出。
didRotate:。---interFaceOrientation:3,DeviceOrientation:0
tableView:cellforrowAtIndexPath:。---interFaceOrientation:3,DeviceOrientation:0
IOS5的输出。
tableView:cellforrowAtIndexPath:。---interFaceOrientation:1,DeviceOrientation:0
下边不在UIInterfaceOrientationPortraitUpside的时候启动的输出。
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:4
didRotate:。---interFaceOrientation:4,DeviceOrientation:0
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:0
IOS5之后的旋转。interFaceOrientation再也不变化,DeviceOrientation会根据状态变化。
didRotate:。---interFaceOrientation:4,DeviceOrientation:2
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:2
didRotate:。---interFaceOrientation:4,DeviceOrientation:3
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:3
didRotate:。---interFaceOrientation:4,DeviceOrientation:1
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:1
didRotate:。---interFaceOrientation:4,DeviceOrientation:4
tableView:cellforrowAtIndexPath:。---interFaceOrientation:4,DeviceOrientation:4
现在的问题在于程序需要迁就IOS5与IOS6的旋转,需要选择使用DeviceOrientation,但是在程序启动的时候DeviceOrientation的值是一个非法的值0。这个时候又需要根据interFaceOrientation去取值。看来需要写多几个if语句才可以了处理。看来大家写自定义ViewController的时候一定要把其他ViewController添加到自己的ChildViewController内,要不然处理选择的时候需要别人写好好多判断。
我最终选择还是老老事实去修改使用到的第三方库,使用addChildViewController添加其ViewController。感觉这个方法比较好,虽然工作量大些。使用这种方式,直接读取self.interFaceOrientation就可以知道屏幕的状态,不会出现上边的差异。