1.监听听设备的旋转:
[[UIDevice currentDevice]
beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceOrientationDidChange)
name:UIDeviceOrientationDidChangeNotification
object:nil];
上面的语句主要是通知设备发生了旋转.一般来说,我们只需要4个方向就够了,但是这个通知会把设备方向发生改变的所有情况发给程序,而且很灵敏,只要设
备有微小的变化也会发通知.
如果要用这种方式监听设备旋转,
我的做法是用一个全局对象保存view里所有控件的坐标位置,在每次设备发生旋转的时候,如果遇到了下面4个方向
UIDeviceOrientationPortrait,UIDeviceOrientationPortraitUpsideDown,UIDeviceOrientationLandscapeRight,UIDeviceOrientationLandscapeLeft
就把控件坐标save一下,
如果设备旋转的时候方向不在这个4个方向内,就把save的坐标赋回给控件
不过我感觉这种方式不太好,因为这个通知很灵敏,会经常改变控件的位置大小,给人眼花缭乱的感觉
我另外一个做法是用- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
这个方法是苹果在viewcontroller里面提供给我们的,这个方法就只会发送4个方向的interfaceOrientation,而且只有在
设备确实发生旋转的时候才会通知我们(不同于上面的方法)
这个方法在当前的viewcontroller的时候是会每次都调用的,在进入或者出这个viewcontroller的时候也会调用一次
如果你有一个viewcontroller_a,那么你旋转设备的时候viewcontroller_a就会发上面的通知了.
如果你用viewcontroller_a present了另外一个viewcontroller_b,这时你旋转设备,
viewcontroller_b会发通知, viewcontroller_a不会.
所以设计程序的时候就要注意了,在你viewcontroller_b发生旋转的时候viewcontroller_a是不会旋转的,我们要手动旋转
viewcontroller_a
就像这样
viewcontroller_b的通知方法.
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
[viewcontroller_a
deviceOrientationDidChange:interfaceOrientation];
// Return YES for supported orientations
switch (interfaceOrientation) {
case UIDeviceOrientationPortrait:
case UIDeviceOrientationPortraitUpsideDown:
{
}
break;
case UIDeviceOrientationLandscapeLeft:
case UIDeviceOrientationLandscapeRight:
{
}
break;
default:
{
}
break;
}
return YES;
}
还有要注意的是,如果你用viewcontroll_a.view addsubive viewcontroll_b.view的话
设备旋转的时候viewcontroll_b是不会调用shouldAutorotateToInterfaceOrientation的...
2.获得设备的当前方向
一般的做法是用[[UIDevice currentDevice]orientation]
这种方法会把设备当前的方向发给我们,不过我们一般只要4个方向就够了
所以,应该用orientation = [UIApplication
sharedApplication].statusBarOrientation;
这个方法是获得statusBar的当前方向,也就是我们想要的4方向之一了.
其次,scrollvew遇到的问题
scrollview的当前contentcontentoffset在他上面最后一个子view的位置时
这个时候旋转设备,要重新设置scrollview的frame, contentoffset,contentsize等等…
问题来了,如果先设置的scrollview的contentoffset,再设置frame的话,scrollview的contentoffset
会发生变化! 原因不明……
我的解决方法是先保存一下改变的contentoffset,再设置frame,再把保存的contentoffset赋回去.问题解决.
所以,遇到这种需要改变scrollview的contentoffset的时候应该先保存改变的contentoffset,然后再改变其他view
的frame,最后再赋回去.