Dołączam UISearchController do navigationItem.searchController
właściwości UITableViewController na iOS 11. To działa dobrze: mogę używać ładnego paska wyszukiwania w stylu iOS 11.
Chciałbym jednak, aby pasek wyszukiwania był widoczny po uruchomieniu. Domyślnie użytkownik musi przewinąć w górę w widoku tabeli, aby zobaczyć pasek wyszukiwania. Czy ktoś wie, jak to jest możliwe?
Po lewej: sytuacja domyślna po uruchomieniu. Po prawej: widoczny pasek wyszukiwania (przez przewijanie w górę). Chciałbym, aby pasek wyszukiwania był widoczny po uruchomieniu, jak na prawym zrzucie ekranu.
Odkryłem już, że pasek wyszukiwania można uczynić widocznym, ustawiając właściwość hidesSearchBarWhenScrolling
mojego elementu nawigacyjnego na false. Jednak powoduje to, że pasek wyszukiwania jest zawsze widoczny - nawet podczas przewijania w dół - co nie jest tym, czego chcę.
źródło
hidesSearchBarWhenScrolling
firstResponder
?scrollView.setContentOffset(_:animated)
. Czy ktoś ma sugestie?hidesSearchBarWhenScrolling = false
umieszcza pasek wyszukiwania nad dużym tytułem w iOS 13. Masz pomysł, czy mogę to jakoś zaktualizować?Odpowiedzi:
Poniższe elementy sprawiają, że pasek wyszukiwania jest najpierw widoczny, a następnie pozwala go ukryć podczas przewijania:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if #available(iOS 11.0, *) { navigationItem.hidesSearchBarWhenScrolling = false } } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if #available(iOS 11.0, *) { navigationItem.hidesSearchBarWhenScrolling = true } }
Użycie
isActive
nie zrobiło tego, co chciałem, powoduje, że pasek wyszukiwania jest aktywny (pokazuje przycisk anulowania itp.), Gdy wszystko, czego chcę, to aby był widoczny.źródło
viewDidLoad
zamiast tego wstawisz pierwszą częśćviewWillAppear
searchController.searchBar.isHidden = false
w viewDidLoad nie działa? To drugie wydaje mi się o wiele bardziej logiczneMożesz ustawić właściwość
isActive
natrue
po dodaniu searchController donavigationItem
.Takie jak to:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) searchController.isActive = true }
źródło
isActive
jest wartością logiczną tylko do odczytu. Zamiast tego będziesz chciał użyćsearchController.active = true
.U mnie zadziałało po dodaniu następujących linii w
viewDidLoad()
metodzie:navigationController?.navigationBar.prefersLargeTitles = true navigationController!.navigationBar.sizeToFit()
źródło
Na iOS 13 odpowiedź @Jordan Wood nie zadziałała. Zamiast tego zrobiłem:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UIView.performWithoutAnimation { searchController.isActive = true searchController.isActive = false } }
źródło