帮我解决了任务 - 我有一个不能转动它的接口的viewController:
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
但我需要旋转它出现在该控制器alertView! 因此,如果用户旋转设备的alertView应遵循的旋转和主界面静止。 我试着订阅通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];
但在我deviceRotated:
我收到了通知,这样有效载荷: NSConcreteNotification 0x101dc50 {name = UIDeviceOrientationDidChangeNotification; object = <UIDevice: 0x103e640>; userInfo = { UIDeviceOrientationRotateAnimatedUserInfoKey = 1; }}
NSConcreteNotification 0x101dc50 {name = UIDeviceOrientationDidChangeNotification; object = <UIDevice: 0x103e640>; userInfo = { UIDeviceOrientationRotateAnimatedUserInfoKey = 1; }}
什么是UIDeviceOrientationRotateAnimatedUserInfoKey
? 我如何使用知道目前interfaceOrientation? 或建议获得当前的方向和旋转alertView一个更好的方式。
我试图用
(BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)toInterfaceOrientation
和
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
,但是这些方法没有得到所谓的iOS6的:(
此外,是否有你可以用它来知道设备旋转到一些方位的任何其他方法? 提前致谢! PS我知道这个任务似乎有点傻,但是这是客户要求。 对不起:)
有一个orientation
的变量UIDevice
包含当前设备的方向 。 你可以用它代替接口取向的(即不旋转,你已经注意到了)。
首先,你订阅设备方向的变化,一个不好的地方就是在viewWillAppear
,并取消对viewWillDisappear
:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
在这个例子中,我们指出,我们要调用到orientationChanged:
当设备旋转,所以让我们实现它:
#pragma mark - Orientation change events
- (void)orientationChanged:(NSNotification*)notification {
UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
// Calculate rotation angle
CGFloat angle;
switch (deviceOrientation) {
case UIDeviceOrientationPortraitUpsideDown:
angle = M_PI;
break;
case UIDeviceOrientationLandscapeLeft:
angle = M_PI_2;
break;
case UIDeviceOrientationLandscapeRight:
angle = - M_PI_2;
break;
default:
angle = 0;
break;
}
// Apply rotation
static NSTimeInterval animationDuration = 0.3;
[UIView animateWithDuration:animationDuration animations:^{
_viewToRotate.transform = CGAffineTransformMakeRotation(angle);
}];
}
我删除了以前的答案,因为我误解了这个问题(其实这是一个非常奇怪的要求,但...)。 我建议你使用一个容器视图控制器具有无限旋转面膜,然后添加你的控制器子:CVC转发旋转事件基于以下方法孩子:
- (BOOL) automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
return NO;
}
所以它会得到所有的事件,并转发给孩子只想要一个。
最后,容器将管理警报并正确旋转。
由于方向被锁定到特定位置,指的是状态栏不会有太大的帮助。 我的建议是使用加速度计和相应地改变alertView根据接收到的XYZ值。 您可以通过使用CGAffineTransformMakeRotation或CGAffineTransformRotate方法旋转alertView。
使用加速计的一个示例是以下情况:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
accelerationValue[0] = acceleration.x;
accelerationValue[1] = acceleration.y;
accelerationValue[2] = acceleration.z;
NSLog(@"Acceleration X-axis: %1.1f, Y-axis: %1.1f, Z-axis: %1.1f", acceleration.x, acceleration.y, acceleration.z);
}
当然,加速度计将需要建立并创造了各自的ViewController,但我想你明白我的意思。
文章来源: How to rotate a view in controller that is not allowed to rotate its interface?