ナビゲーションバーの中に検索ボタンをおいて、それがタップされたらサーチバーを表示し、サーチバーの使用を終了した際に、サーチバーを削除し、元の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}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/24 09:19
2020/11/24 09:20
2020/11/24 09:23
2020/11/24 09:27
2020/11/24 13:01