如何旋转是不允许旋转的接口在控制器的看法?(How to rotate a view in cont

2019-08-17 13:18发布

帮我解决了任务 - 我有一个不能转动它的接口的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我知道这个任务似乎有点傻,但是这是客户要求。 对不起:)

Answer 1:

有一个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);
    }];
}


Answer 2:

我删除了以前的答案,因为我误解了这个问题(其实这是一个非常奇怪的要求,但...)。 我建议你使用一个容器视图控制器具有无限旋转面膜,然后添加你的控制器子:CVC转发旋转事件基于以下方法孩子:

- (BOOL) automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return NO;
}

所以它会得到所有的事件,并转发给孩子只想要一个。

最后,容器将管理警报并正确旋转。



Answer 3:

由于方向被锁定到特定位置,指的是状态栏不会有太大的帮助。 我的建议是使用加速度计和相应地改变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?