[解決済み】ナビゲーションベースのアプリでPushとPopのアニメーションを変更する方法
質問
ナビゲーションベースのアプリケーションを使用していますが、プッシュとポップのアニメーションを変更したいです。どうすればよいでしょうか?
2018年を編集する
この質問には多くの回答があり、かなり時間が経過していますが、現在最も適切と思われる回答を選び直しました。もし、そうでないと思う方がいらっしゃいましたら、コメントで教えてください。
どのように解決するのですか?
<ブロッククオートナビゲーションベースのアプリでPushとPopのアニメーションを変更するには...
前置き
あなたがiOSの開発を始めたばかりだとします。Appleは2つのトランジションを提供していて、簡単に使うことができます。クロスフェード」と「フリップ」です。
しかし、もちろん、クロスフェードもフリップも使い物になりません。決して使われることはありません。なぜAppleがこの2つの無駄なトランジションを提供したのか、誰も知らないのです!
だから
を行いたいとします。 普通の、一般的な、トランジション 例えば、"slide" のようなものです。その場合 膨大な作業をしなければならないのです。 .
その作業については、この記事で説明しています。
繰り返しになりますが
意外なことに、iOSでは 最もシンプルで、最も一般的で、日常的なトランジション (普通のスライドなど) を行うには すべての作業 を実装することで フルカスタムトランジション .
その方法を紹介します.
1. あなたは、カスタム
UIViewControllerAnimatedTransitioning
-
のような自前のboolが必要です。
popStyle
. (ポップオンなのか、ポップオフなのか). -
を含める必要があります。
transitionDuration
(些細なことですが)とメインコールがあります。animateTransition
-
実際、あなたは しなければならない 内部用に2つの異なるルーチンを書きます。
animateTransition
. ひとつはプッシュ用、もうひとつはポップ用です。 おそらくこれらの名前はanimatePush
とanimatePop
. 内部animateTransition
で分岐するだけです。popStyle
という2つのルーチンに -
以下の例では、単純なムーブオーバー/ムーブオフを行っています。
-
あなたの
animatePush
とanimatePop
ルーチンを使用します。あなたは 必須 は、"from view" と "to view" を取得します。(その方法は、コード例で紹介しています)。 -
そしてあなたは しなければならない
addSubview
を新しいビューに追加しました。 -
そして、あなたは しなければならない コール
completeTransition
アニメの最後に
だから......。
class SimpleOver: NSObject, UIViewControllerAnimatedTransitioning {
var popStyle: Bool = false
func transitionDuration(
using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.20
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
if popStyle {
animatePop(using: transitionContext)
return
}
let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
let f = transitionContext.finalFrame(for: tz)
let fOff = f.offsetBy(dx: f.width, dy: 55)
tz.view.frame = fOff
transitionContext.containerView.insertSubview(tz.view, aboveSubview: fz.view)
UIView.animate(
withDuration: transitionDuration(using: transitionContext),
animations: {
tz.view.frame = f
}, completion: {_ in
transitionContext.completeTransition(true)
})
}
func animatePop(using transitionContext: UIViewControllerContextTransitioning) {
let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
let f = transitionContext.initialFrame(for: fz)
let fOffPop = f.offsetBy(dx: f.width, dy: 55)
transitionContext.containerView.insertSubview(tz.view, belowSubview: fz.view)
UIView.animate(
withDuration: transitionDuration(using: transitionContext),
animations: {
fz.view.frame = fOffPop
}, completion: {_ in
transitionContext.completeTransition(true)
})
}
}
そして ...
2. ビューコントローラーで使用します。
注:不思議なことに、あなたは を実行するだけです。 をビューコントローラに追加します。 (その下にあるものです。)
にポチッとするやつで トップ を行う。 何もない . 簡単だ。
では、あなたのクラスは...
class SomeScreen: UIViewController {
}
は...
class FrontScreen: UIViewController,
UIViewControllerTransitioningDelegate, UINavigationControllerDelegate {
let simpleOver = SimpleOver()
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.delegate = self
}
func navigationController(
_ navigationController: UINavigationController,
animationControllerFor operation: UINavigationControllerOperation,
from fromVC: UIViewController,
to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
simpleOver.popStyle = (operation == .pop)
return simpleOver
}
}
以上です。
通常と全く同じようにプッシュ&ポップを行い、変化なし。押すには ...
let n = UIStoryboard(name: "nextScreenStoryboardName", bundle: nil)
.instantiateViewController(withIdentifier: "nextScreenStoryboardID")
as! NextScreen
navigationController?.pushViewController(n, animated: true)
をクリックし、次の画面でそれを実行することができます。
class NextScreen: TotallyOrdinaryUIViewController {
@IBAction func userClickedBackOrDismissOrSomethingLikeThat() {
navigationController?.popViewController(animated: true)
}
}
ふぅ。
3. AnimatedTransitioningをオーバーライドする方法については、このページの他の回答もお楽しみください !
AlanZeinoと@eliasの回答までスクロールしてください。
AnimatedTransitioning
最近のiOSアプリでは
関連
-
[解決済み】iOS 9.0より前のUIStackView
-
[解決済み] Xcode 10でコマンドCompileSwiftが0以外の終了コードで失敗する [重複] 。
-
[解決済み] Info.plist ユーティリティのエラーです。"そのようなファイルがないため、Info.plistを開くことができませんでした"
-
[解決済み] Xcode Simulatorのアニメーションをエディタで再生すると、極端に遅くなる。
-
[解決済み] selector' の引数が '@objc' メソッド、プロパティ、またはイニシャライザを参照していない
-
[解決済み] React native - connection has no connection handler エラーの意味?
-
[解決済み] HTTPの読み込みに失敗しました(エラーコード:-1200 [3:-9802])。
-
[解決済み] Xcode 6: iOS 8.1 The Developer Disk Imageをマウントできませんでした。
-
[解決済み] App Storeのアプリと連動させる方法
-
[解決済み】iOSアプリの名前を変更する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み】"宣言はファイルスコープでのみ有効 "について
-
[解決済み】NSURLErrorDomainエラーコードの説明
-
[解決済み] キャッチできない例外 'NSInvalidArgumentException', reason: '-[_.AppDelegate add:]: unrecognized selector' により、アプリを終了する。
-
[解決済み] データソースからのセルの取得に失敗しました。
-
[解決済み] 指定されたホスト名を持つサーバーが見つからなかった
-
[解決済み] 警告 xcode 6 で暗黙の変換により整数の精度が失われる
-
[解決済み] Objective-C ブロックパラメータ 発行 このブロック宣言はプロトタイプではありません
-
[解決済み] 配列型 'int [16]' は代入不可能です。
-
[解決済み] Swift 4 データが正しい形式でないため、読み取ることができませんでした。