4

タスクを解決するのを手伝ってください-インターフェースを回転させることが許可されていない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; }}

とはUIDeviceOrientationRotateAnimatedUserInfoKey? また、現在の interfaceOrientation を知るにはどうすればよいですか? または、現在の向きを取得して alertView を回転させるより良い方法を提案してください。

使ってみた

(BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)toInterfaceOrientation

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)durationしかし、これらのメソッドは iOS6 では呼び出されません :(

また、デバイスが特定の方向に回転していることを知るために使用できる他の方法はありますか? 前もって感謝します!PS タスクが少しばかげているように見えることはわかっていますが、これは顧客の主張です。ごめん :)

4

3 に答える 3

5

現在のデバイスの向きを含む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);
    }];
}
于 2013-03-13T17:59:56.307 に答える
2

問題を誤解したため、以前の回答を削除します(実際には非常に奇妙な要求ですが...)。無制限の回転マスクを備えた Container View Controller を使用してから、コントローラーを子として追加することをお勧めします。CVC は、次の方法に基づいて回転イベントを子に転送します。

- (BOOL) automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
{
    return NO;
}

したがって、すべてのイベントを取得し、必要なものだけを子に転送します。

最後に、コンテナはアラートを管理し、適切にローテーションします。

于 2013-03-14T08:29:41.220 に答える
0

向きは特定の位置に固定されているため、ステータスバーを参照してもあまり役に立ちません。私の提案は、加速度計を使用し、受け取った XYZ 値に基づいて alertView を適宜変更することです。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 で設定して作成する必要がありますが、私の主張は理解できると思います。

于 2013-03-13T16:46:06.863 に答える