0

デバイスを回転させるときにのみ必要になるため、プログラムで実装する UIButton があります。

回転するとボタンが消え、横向きになるとボタンが表示される必要があります。

同じ ViewController にとどまっている限り、問題はありません。とにかくデバイスを回転させることができ、ボタンは期待どおりに表示および非表示になります。アプリは TabController ベースのアプリであり、別のタブに移動すると同じ動作が発生します。

これが問題 です 元のビューに戻ると、ボタンが表示されますが、消えません。が呼び出されていないのとほぼ同じremoveFromSuperViewですが、呼び出されてもボタンは削除されません。

これはなぜですか?

-(void)autoRotationDetection
{
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(orientationChanged:)
     name:UIDeviceOrientationDidChangeNotification
     object:[UIDevice currentDevice]];
}

- (void) orientationChanged:(NSNotification *)note
{
    UIDevice * device = note.object;
    switch(device.orientation)
    {
        case UIDeviceOrientationPortrait:
            /* start special animation */
            [_menuButton removeFromSuperview];
            break;

        case UIDeviceOrientationPortraitUpsideDown:
            /* start special animation */
            break;

        default:
            break;
    };
}

それから私は電話します

-(void)viewWillAppear:(BOOL)animated
{

    [self autoRotationDetection];
}

申し訳ありませんが、それを追加する必要があります。

4

1 に答える 1

0

[super viewWillAppear] への呼び出しが省略されている場合に、この種の動作 (別のタブに移動してから再び戻ってくると動作が異なる) を見たことがあります。それを追加してみて、修正されるかどうかを確認してください。

編集後:

これを行う簡単な方法は、回転があるたびに呼び出されるviewWillLayoutSubviewsでビューの境界を確認することだと思います(それ以外の場合も同様ですが、このような単純なことの場合、それは問題ではありません) . この例では、削除するのではなく、表示または非表示にしていますが、この概念は両方で機能するはずです。

-(void)viewWillLayoutSubviews {
    BOOL portrait = self.view.bounds.size.height > self.view.bounds.size.width;
    if (portrait) {
        self.button.hidden = YES;
    }else{
        self.button.hidden = NO;
    }
}

このメソッドが最後に呼び出されたときのポートレートの値を追跡し、ポートレートが変更された場合にのみボタンのステータスを変更することで、これをより効率的にすることができます。

于 2013-03-27T21:06:37.887 に答える