[解決済み] 制約条件の変更をアニメーションで表現するには?
質問
古いアプリをアップデートしているのですが、その際に
AdBannerView
で、広告がないときは画面外にスライドして表示されます。広告があるときは画面上にスライドします。基本的なことです。
旧来のスタイルでは、アニメーションブロックにフレームを設定します。
新スタイルでは
IBOutlet
を決定するオートレイアウトコンストレイントに変更します。
Y
の位置、この場合はスーパービューの底面からの距離、そして定数を変更します。
- (void)moveBannerOffScreen {
[UIView animateWithDuration:5 animations:^{
_addBannerDistanceFromBottomConstraint.constant = -32;
}];
bannerIsVisible = FALSE;
}
- (void)moveBannerOnScreen {
[UIView animateWithDuration:5 animations:^{
_addBannerDistanceFromBottomConstraint.constant = 0;
}];
bannerIsVisible = TRUE;
}
そして、バナーは予想通り動きますが いいえ アニメーションを表示します。
UPDATEです。 再視聴しました WWDC 12講演 オートレイアウトを使いこなすためのベストプラクティス アニメーションを扱ったものです。を使用して制約を更新する方法について説明しています。 CoreAnimation :
以下のコードで試しましたが、まったく同じ結果になります。
- (void)moveBannerOffScreen {
_addBannerDistanceFromBottomConstraint.constant = -32;
[UIView animateWithDuration:2 animations:^{
[self.view setNeedsLayout];
}];
bannerIsVisible = FALSE;
}
- (void)moveBannerOnScreen {
_addBannerDistanceFromBottomConstraint.constant = 0;
[UIView animateWithDuration:2 animations:^{
[self.view setNeedsLayout];
}];
bannerIsVisible = TRUE;
}
余談ですが、何度も確認したところ、これが実行されているのは メイン スレッドになります。
解決方法は?
2つの重要な注意点
-
を呼び出す必要があります。
layoutIfNeeded
をアニメーションブロック内で使用します。 Apple では、保留中のレイアウト操作がすべて完了したことを確認するために、アニメーションブロックの前に一度このコマンドをコールすることを推奨しています。 -
において具体的に呼び出す必要があります。 親ビュー (例.
self.view
であり、制約が付加されている子ビューではありません。 そうすることで すべて 制約を変更したビューに制約されている可能性のある他のビューのアニメーションを含む(例:ビューBがビューAの下部に取り付けられていて、ビューAの上部オフセットを変更し、ビューBを一緒にアニメーションさせたい場合など)。
これを試してみてください。
オブジェクティブC
- (void)moveBannerOffScreen {
[self.view layoutIfNeeded];
[UIView animateWithDuration:5
animations:^{
self._addBannerDistanceFromBottomConstraint.constant = -32;
[self.view layoutIfNeeded]; // Called on parent view
}];
bannerIsVisible = FALSE;
}
- (void)moveBannerOnScreen {
[self.view layoutIfNeeded];
[UIView animateWithDuration:5
animations:^{
self._addBannerDistanceFromBottomConstraint.constant = 0;
[self.view layoutIfNeeded]; // Called on parent view
}];
bannerIsVisible = TRUE;
}
スウィフト3
UIView.animate(withDuration: 5) {
self._addBannerDistanceFromBottomConstraint.constant = 0
self.view.layoutIfNeeded()
}
関連
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] Unwind segueは何に使うのか、どう使うのか?
-
[解決済み] インポート vs #インポート - iOS 7
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IOS8 Development Guide Error Thread 1: signal SIGABRT
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] UIViewに角丸をつける
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み】Swiftで制約をアニメーション化しようとしています。
-
[解決済み】NSLayoutConstraintsはアニメーション可能ですか?重複