我有一个UIViewController在主视图上处理几个UIImageViews。在底部是一个UIToolbar,其中有几个要与之交互的项目。
现在,当我旋转设备时,我不希望viewController旋转,而只是UIImageViews。换句话说,底部的工具栏将位于左侧(或右侧),但imageViews将正确旋转。
所以,通过使用方法
- (BOOL)shouldAutoRotate {
return YES;
}
结合
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
和
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
// rotate the image views here
}
设备上的任何旋转都不会被执行,因为只支持一个接口方向(UIInterfaceOrientationMaskPortrait
)。但是当我在supportedInterfaceOrientations
- 方法中添加另一个界面方向时,视图控制器也会旋转。
即使只支持一个方向,如何检测视图控制器的旋转?或者是否有另一种可能性根据不断变化的设备方向旋转UIViews?
感谢您的帮助!
答案 0 :(得分:8)
尝试使用UIDevice实例来检测设备物理方向的变化。
要开始接收通知,您可以使用类似的内容(例如viewWillAppear:
方法):
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
//No reason to ask NSNotification because it many cases `userInfo` equals to
//@{UIDeviceOrientationRotateAnimatedUserInfoKey = 1;}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceDidRotate) name:@UIDeviceOrientationDidChangeNotification object:nil];
}
要取消注册接收设备轮换事件,请使用此功能(例如,在viewWillDisappear:
中):
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}
这是deviceDidRotate
函数的一个例子:
- (void)deviceDidRotate {
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
switch (orientation) {
case UIDeviceOrientationPortrait:
case UIDeviceOrientationPortraitUpsideDown:
// do something for portrait orientation
break;
case UIDeviceOrientationLandscapeLeft:
case UIDeviceOrientationLandscapeRight:
// do something for landscape orientation
break;
default:
break;
}
}