🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1260閲覧

ナビゲーションバーのサーチバーの表示と表示後の不具合について

oeiqgfodgfhps

総合スコア35

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/11/22 11:24

ナビゲーションバーの中に検索ボタンをおいて、それがタップされたらサーチバーを表示し、サーチバーの使用を終了した際に、サーチバーを削除し、元のUIに戻すという処理を書いています。そこで問題点が二つあります。
問題点1 サーチバーの表示時に一瞬ナビゲーションバー全体が下に下がってそのあとすぐに上に戻るアニメーションとなっているため、ナビゲーションバー全体が上下に動くのをやめたい
問題点2 サーチバーの削除時にナビゲーションバーの高さが高くなっている
↓参考動画
イメージ説明

  • サーチバーを削除する際に実行しているnavigationController?.view.setNeedsLayout(),navigationController?.view.layoutIfNeeded()この記事でサーチバーの削除時に必要と書かれているのを見て参考にしたのですが、この処理をなくすと削除後のレイアウトは正常になります。この処理は必要ないということでしょうか?

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 navigationItem.rightBarButtonItem = startSearchButton 8 } 9 10 override func viewWillAppear(_ animated: Bool) { 11 } 12 13 14 private lazy var searchController: UISearchController = { 15 let searchController = UISearchController() 16 searchController.delegate = self 17 searchController.obscuresBackgroundDuringPresentation = true 18 searchController.hidesNavigationBarDuringPresentation = true 19 searchController.searchBar.placeholder = "検索を開始してください" 20 searchController.searchBar.tintColor = .black 21 searchController.searchBar.sizeToFit() 22 return searchController 23 }() 24 25 private lazy var startSearchButton: UIBarButtonItem = { 26 UIBarButtonItem(title: "検索", style: .plain, target: self, action: #selector(startSearchButtonAction(_:))) 27 }() 28 29 @objc private func startSearchButtonAction(_ seander: Any) { 30 startSearch() 31 } 32 33 private func startSearch() { 34 navigationItem.searchController = searchController 35 DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(10)) { [weak self] in 36 guard let self = self else { return } 37 if !self.searchController.isActive { 38 self.searchController.isActive = true 39 } 40 self.searchController.searchBar.becomeFirstResponder() 41 } 42 } 43 44 private func endSearch() { 45 if searchController.isActive { 46 searchController.isActive = false 47 } 48 if navigationItem.searchController != nil { 49 startSearchButton.isEnabled = false 50 navigationItem.searchController = nil 51 navigationController?.view.setNeedsLayout() 52 navigationController?.view.layoutIfNeeded() 53 DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)) {[weak self] in 54 guard let self = self else { return } 55 self.startSearchButton.isEnabled = true 56 } 57 } 58 } 59 60 61} 62 63extension ViewController:UISearchControllerDelegate{ 64 func didDismissSearchController(_ searchController: UISearchController) { 65 endSearch() 66 } 67}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Search Controller の公式サンプルを見てみましたが、setNeedsLayout()layoutIfNeeded() は不要だと思われます。

そもそも、参考にされているサイトは Stackoverflow の公式ページ

を無断で翻訳しているサイトだと思われますが、上記のオリジナルな質問を見る限り、 UIView.animate を使ってアニメーションさせているため、オートレイアウトに関する2つのメソッドを呼び出しているのかと推測しています。

投稿2020/11/23 23:24

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oeiqgfodgfhps

2020/11/24 09:19

ご回答ありがとうございます! 表示時のアニメーションの挙動についてはこれはデフォルトのものなのでしょうか?
TsukubaDepot

2020/11/24 09:20

おそらく、デフォルトだと思います(それを示す証拠はありませんが)。
oeiqgfodgfhps

2020/11/24 09:23

ありがとうございます! 重ね重ねの質問で大変恐縮なのですが、``setNeedsLayout() ``や ``layoutIfNeeded()``を行うと画面のレイアウトの不具合が生じるのはサーチバーの消去時に一瞬だけ下に伸びた場所に合わせてレイアウトが行われるからという認識で合っていますか?
TsukubaDepot

2020/11/24 09:27

それを示せるような方法がないか、回答する前に試行錯誤していたのですが、確実に「これが要因」というところまでは分かりませんでした。 ただ、システムとして用意されているアニメーションなので、レイアウトについては想定される範囲で正常に実行されるよう配慮はされているのではないかと推測しています(これも、ドキュメントに明確に書かれていれば良いのですが、そのような記述も見つかりませんでした)。 もしかしたら、SearchBard 関連のクラスを基底クラスとして拡張したカスタムクラスを作った上、レイアウトに関するメソッドをオーバーライドしてデバッグメッセージを出すようにすれば詳しい挙動まで調べられると今おもったのですが、そこまでする必要はないかもしれません。
oeiqgfodgfhps

2020/11/24 13:01

なかなか書いていないですよねえ????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問