web-dev-qa-db-ja.com

方向変更回転アニメーションを無効にする

向きが変わったときに再生されるアニメーションを無効にする必要があります。これは可能ですか?そうでない場合、それをスピードアップすることは可能ですか?

明確にするために、私は向きの変更を止めたくはありません。アニメーションだけです。すぐに向きを変えたい。

25
Arlen Anderson

私が正しく覚えていれば(これはいつも私が正しくするために少し遊んでいなければならないようなものです)willRotateToInterfaceOrientation:duration:およびwillAnimateRotationToInterfaceOrientation:duration:は両方ともアニメーションブロック内にあり、didRotateFromInterfaceOrientation:アニメーションブロックの後に実行されます。ビューをwillRotateにレイアウトして、回転後に表示される位置に表示されるようにする必要があると思います回転していなかった場合(意味がある場合)。このようにして、アニメーションは、デバイスが回転するのと反対の方向に、元の(正しい)レイアウトから新しい(回転した)レイアウトにアニメーション化し、アニメーションがないように見せます。回転が完了すると、アニメーションなしでdidRotateにビューをレイアウトして、瞬時に回転しているような印象を与えることができます。

泥のように澄んでいますね

2
Adam Milligan

はい、すべてを分解せずにアニメーションを無効にすることは可能です。

次のコードは、他のアニメーションや方向コードをいじることなく、「ブラックボックス」回転アニメーションを無効にします。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [UIView setAnimationsEnabled:YES];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [UIView setAnimationsEnabled:NO];
  /* Your original orientation booleans*/

    return TRUE;
}

UIViewControllerに配置すると、すべてうまくいくはずです。同じ方法をiOSの不要なアニメーションに適用できます。

あなたのプロジェクトで頑張ってください。


2016年の場合、shouldAutorotateToInterfaceOrientationをオーバーライドすることはできません。以下は機能しているようで、他に害はありません。

// these DO SEEM TO WORK, 2016
override func willRotateToInterfaceOrientation(
        toInterfaceOrientation:UIInterfaceOrientation, duration:NSTimeInterval)
    {
    UIView.setAnimationsEnabled(false)
    super.willRotateToInterfaceOrientation(toInterfaceOrientation,duration:duration)
    }
override func didRotateFromInterfaceOrientation(
        fromInterfaceOrientation:UIInterfaceOrientation)
    {
    super.didRotateFromInterfaceOrientation(fromInterfaceOrientation)
    UIView.setAnimationsEnabled(true)
    }

ただし!!実際、これらの関数は両方とも非推奨です。 viewWillTransitionToSizeは、「前」と「後」の両方を処理するようになりました。

override func viewWillTransitionToSize(size:CGSize,
       withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
    {
    coordinator.animateAlongsideTransition(nil, completion:
        {_ in
        UIView.setAnimationsEnabled(true)
        })
    UIView.setAnimationsEnabled(false)
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator);
    }
48
Nils Munch

IOS8では、ViewControllerのviewWillTransitionToSizeの実装でCALayerアニメーションを無効にすることで、回転アニメーションを無効にできます。

受け入れられた回答に記載されている逆回転は、遷移(WWDC 2014'iOS 8でのコントローラーの進歩の表示 'を参照)をカスタマイズしたい場合に役立ちますが、アニメーションを防止したい場合には役立ちません。

(注:viewWillTransitionToSizeを実装すると、非推奨のiOS8以前のローテーションAPIが呼び出されなくなります。)

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        // You could make a call to update constraints based on the
        // new orientation here.
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [CATransaction commit];
    }];
}
12
zethraeus

Nils Munchの回答に基づくと、これはSwift 3バージョン:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: nil) { (_) in
        UIView.setAnimationsEnabled(true)
    }
    UIView.setAnimationsEnabled(false)
    super.viewWillTransition(to: size, with: coordinator)
}
3
Bruno Paulino

ビューが回転しようとしているときにビューを再レイアウトすると、実際に回転するとアニメーションが表示されなくなると思います。つまり、各サブビューの新しい座標、フレーム、位置を使用してメソッドを記述し、そのメソッドをwillRotateToInterfaceOrientation:duration:またはwillAnimateFirstHalfOfRotationToInterfaceOrientation:duration:で呼び出します(これは賢明な方法ではありません。なぜだろうか。アニメーションは必要ありませんか?)

0
nacho4d