IOS 9 searchBar исчезает из представления заголовка таблицы, когда активен UISearchController
Структура:
View1 (нажмите кнопку) → присутствует модально (MyModalView: UITableViewController)
В MyModalView встроен UISearchController. SearchBar UISearchController помещается в MyModalView.tableView.tableHeaderView.
Он отлично работает с iOS 8.0. Однако на iOS 9, SearchBar исчезает, когда UISearchController активен. Пожалуйста, взгляните на фотографии тезисов ниже
Модальный вид: ![модальный вид]()
UISearchController активен в iOS 8: ![строка поиска в iOS 8]()
UISearchController активен в iOS 9: ![строка поиска в 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...
Любая идея/указатель будет глубоко оценена
Приветствия.
Ответы
Ответ 1
Кажется, у всех нас была та же проблема, но они были решены по-разному. Однако ни один из предложенных ответов не помог мне:( Тем не менее, спасибо вам всем за ваше время.
У меня есть решение, которое решило мою проблему. Он устанавливает Extend Edges - под непрозрачными барами моего (MyModalView: UITableViewController) до true в раскадровке с помощью Interface Builder.
Вкратце:
MyModalView: UITableViewController, в Storyboard с помощью Interface Builder имеет
Расширить края:
- Под верхними барами тикают
- Под нижними барами тикают
- Под Opaque Bars отмечен
![screenshot]()
Ответ 2
Я не уверен, в чем проблема, но я "исправил" ее:
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
Я предполагаю, что UISearchController
делает что-то напуганное, когда пытается представить его как панель навигации. Итак, это взлом, но он по крайней мере не блокирует пользователя. Панель поиска не делает крутую анимацию и закрывает панель навигации.
Ответ 3
Я нашел в симуляции метрики (верхний бар) в раскадровке, которые вызывают эту проблему.
В моем случае работают следующие строки, но я до сих пор не знаю почему.
- (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;
}
Ответ 4
Мне пришлось
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
Я нашел аналогичный вопрос здесь, но в моем случае это не было в методе viewDidLoad. Мне пришлось попробовать разные взгляды, пока они не сработали. Теперь у меня есть как пользовательский цвет панели навигации, так и панель поиска,
Ответ 5
Спасибо @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;
}
Ответ 6
Я исправил его в моем случае, удалив
definesPresentationContext = true
Я еще не тестировал, если есть какие-то недостатки в устранении этого!
Ответ 7
У меня нет панели навигации в этом месте приложения. Ни одна из других сообщений SO не помогла мне, поэтому я исправил ее так:
- (void)layoutSubviews
{
[[[self searchController] searchBar] sizeToFit];
}
Ответ 8
Настройка навигационной панели навсегда для полупрозрачного в раскадровке решила мою проблему.
Ответ 9
Работает
override func viewDidLoad() {
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
Ответ 10
У меня была та же проблема, и когда я отлаживал пользовательский интерфейс на 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)
}
Ответ 11
Если вы хотите скрыть свою навигационную панель и отобразить полный экран контроллера поиска, установите на панели навигации следующее: панель поиска не будет раскалываться:
navigationController?.navigationBar.translucent = true