в iOS 9 строку поиска исчезает из поля зрения заголовок таблицы, когда UISearchController является активный
структура:
View1 (нажмите кнопку) - > присутствует модально (MyModalView: UITableViewController)
mymodalview имеет встроенный UISearchController. Панель поиска UISearchController находится в MyModalView.tableView.tableHeaderView.
он отлично работает с iOS 8.0. Однако в iOS 9 панель поиска исчезает, когда активен UISearchController. Пожалуйста, взгляните на эти фотографии ниже
uisearchcontroller активен на iOS 8:
uisearchcontroller активен на iOS 9:
очень стандартный код:
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
эта проблема также возникает в бета-версии iOS 9.1...
любая идея / указатель будут глубоко оценены
Ура.
13 ответов:
Я не уверен в чем именно проблема, но я норм:
self.searchController.hidesNavigationBarDuringPresentation = NO; self.definesPresentationContext = NO;
мое предположение заключается в том, что
UISearchController
делает что-то веселое, когда он пытается представить в качестве навигации. Итак, это хак, но он, по крайней мере, не блокирует пользователя. Панель поиска не делает прохладную анимацию и не закрывает панель навигации.
кажется, все мы получили ту же проблему, но они были решены по-разному. Однако ни один из предложенных ответов не работал для меня :(. Тем не менее спасибо всем за ваше время.
У меня есть решение, которое решает мою проблему. Он устанавливает Extend Edge-под непрозрачными полосами my (MyModalView: UITableViewController) в true в раскадровке с помощью Interface Builder.
в итоге:
MyModalView: UITableViewController, в раскадровке с помощью Интерфейс строителя
Расширить Края: - Под верхней планкой ставили галочку - Под нижними брусьями ставили галочку - Под непрозрачной решеткой ставили галочку
Я обнаружил, что это имитация метрики (верхняя панель) в раскадровке, которая вызывает эту проблему. В моем случае работают следующие строки, но я до сих пор не знаю, почему.
- (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented self.navigationController.navigationBar.translucent = YES; } -(void)willDismissSearchController:(UISearchController *)searchController { self.navigationController.navigationBar.translucent = NO; }
Я должен
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
Я нашел аналогичный вопрос здесь но в моем случае это не было на методе viewDidLoad. Я должен был попробовать разные взгляды, пока это не сработало. Теперь я могу иметь как пользовательский цвет панели навигации, так и панель поиска,
спасибо @wiles duan и @Techprimate
в моем случае, я исправил эту проблему путем установления:
self.definesPresentationContext = NO;
и реализовать следующие 2 метода в UISearchControllerDelegate
- (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented self.navigationController.navigationBar.translucent = YES; } -(void)willDismissSearchController:(UISearchController *)searchController { self.navigationController.navigationBar.translucent = NO; }
я исправил это в моем случае, удалив
definesPresentationContext = true
Я еще не проверял, есть ли какие-либо недостатки удаления этого!
У меня нет навигации в этом месте приложения. Ни один из других сообщений SO не помог мне, поэтому я исправил это следующим образом:
- (void)layoutSubviews { [[[self searchController] searchBar] sizeToFit]; }
у меня была та же проблема, и когда я отладил пользовательский интерфейс на Xcode я обнаружил, что
UISearchBar
вид был перемещен в другой вид и ширина была обнулена.я исправил это путем установки
definesPresentationContext
свойстваUISearchController
доfalse
, и установив егоtrue
содержащегоUITableViewController
.я добавил только одну строку к вашему
viewDidLoad()
.override func viewDidLoad() { super.viewDidLoad() // Dynamically create a search controller using anonymous function self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.definesPresentationContext = false // Disable the presentation controller controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar return controller })() // Auto sizing row & cell height self.tableView.estimatedRowHeight = 130 self.tableView.rowHeight = UITableViewAutomaticDimension self.definesPresentationContext = true // This one remains the same // No footer for better presentation self.tableView.tableFooterView = UIView.init(frame: CGRectZero) }
Он работает
override func viewDidLoad() { super.viewDidLoad() self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent }
Если вы хотите скрыть панель навигации и представить контроллер поиска в полноэкранном режиме, установите на панели навигации следующее, и панель поиска не исчезнет:
navigationController?.navigationBar.translucent = true
sc.hidesNavigationBarDuringPresentation = false
делает трюк для меня
lazy var searchController:UISearchController = { let sc = UISearchController(searchResultsController: nil) sc.searchResultsUpdater = self sc.obscuresBackgroundDuringPresentation = false sc.searchBar.placeholder = "Search" sc.hidesNavigationBarDuringPresentation = false return sc }()