向きが変わったときに再生されるアニメーションを無効にする必要があります。これは可能ですか?そうでない場合、それをスピードアップすることは可能ですか?
明確にするために、私は向きの変更を止めたくはありません。アニメーションだけです。すぐに向きを変えたい。
私が正しく覚えていれば(これはいつも私が正しくするために少し遊んでいなければならないようなものです)willRotateToInterfaceOrientation:duration:
およびwillAnimateRotationToInterfaceOrientation:duration:
は両方ともアニメーションブロック内にあり、didRotateFromInterfaceOrientation:
アニメーションブロックの後に実行されます。ビューをwillRotate
にレイアウトして、回転後に表示される位置に表示されるようにする必要があると思います回転していなかった場合(意味がある場合)。このようにして、アニメーションは、デバイスが回転するのと反対の方向に、元の(正しい)レイアウトから新しい(回転した)レイアウトにアニメーション化し、アニメーションがないように見せます。回転が完了すると、アニメーションなしでdidRotate
にビューをレイアウトして、瞬時に回転しているような印象を与えることができます。
泥のように澄んでいますね
はい、すべてを分解せずにアニメーションを無効にすることは可能です。
次のコードは、他のアニメーションや方向コードをいじることなく、「ブラックボックス」回転アニメーションを無効にします。
- (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);
}
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];
}];
}
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)
}
ビューが回転しようとしているときにビューを再レイアウトすると、実際に回転するとアニメーションが表示されなくなると思います。つまり、各サブビューの新しい座標、フレーム、位置を使用してメソッドを記述し、そのメソッドをwillRotateToInterfaceOrientation:duration:
またはwillAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
で呼び出します(これは賢明な方法ではありません。なぜだろうか。アニメーションは必要ありませんか?)