Белое пространство отображается только на iOS10.Странное пустое пространство в заголовке UITableView при использовании UISearchController с UITableViewController на iOS10
ответ
Я столкнулся с этой проблемой. Если у вас включен индикатор вертикальной прокрутки, вы должны увидеть, что это проблема с вставкой UIScrollView
. И похоже, что это происходит только тогда, когда вы используете UITableViewcontroller
как searchResultsController
UISearchController
.
И это дополнительное пространство отображается как сверху, так и снизу.
Этот ответ не очень, но я добавляю это сейчас.
if #available(iOS 10.0, *) {
automaticallyAdjustsScrollViewInsets = false
tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0)
}
Вы установки UITableViewController как searchResultsController в UISearchController, но без Autolayout ни кадра.
Как вы можете прочитать в Quick Help UISearchController, вы можете передать его нуль, если вы хотите отобразить результаты поиска в том же контроллере представления, который отображает ваш доступный для поиска контент.
Так вы код будет выглядеть хорошо, если вы установите его так:
class ViewController: UIViewController {
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
let tableView = UITableView(frame: view.bounds, style: .plain)
tableView.dataSource = self
view.addSubview(tableView)
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
navigationItem.titleView = searchController.searchBar
searchController.searchBar.becomeFirstResponder()
searchController.searchBar.text = "⬇️ What is this white space? ⬇️"
}
}
...
Наконец, я нашел простое решение:
automaticallyAdjustsScrollViewInsets = false
Я добавил автоматическиAdjustsScrollViewInsets = false как для searchController, так и для searchResultsController и все еще имеет разрыв с iOS 10. – Molanda
Я пробовал другой подход, который, кажется, сработал для меня. Для основной цели вашего приложения установите «Скрыть строку состояния» в значение true. По крайней мере, для меня (Xcode 8 GM seed) это фактически не скрывало строку состояния в приложении, но, похоже, исправила проблему с интервалом.
Принимая во внимание, что это проблема для меня, когда телефон ориентирован вертикально, он не полностью разрешил проблему с интервалом при горизонтальной ориентации. Этот бит кода также устраняет проблему на горизонтально выровненных экранах:
override var prefersStatusBarHidden: Bool {
get {
return UIApplication.shared.isStatusBarHidden
}
}
Конечно, установка значения prefersStatusBarHidden к ложным будет полностью отключать строку состояния, но это не может быть возможно обходной путь для некоторых разработчиков.
Надеюсь, это поможет. Это немного взломать, и я надеюсь, что Apple решит это в будущем обновлении iOS.
на основе @yishus ответить здесь: https://stackoverflow.com/a/39871273/4405051
Я столкнулся с этой проблемой, а также. Если у вас включен индикатор вертикальной прокрутки, вы должны увидеть, что это проблема с вставкой
UIScrollView
. И похоже, что это происходит только тогда, когда вы используетеUITableViewcontroller
какsearchResultsController
UISearchController
.И это дополнительное пространство отображается как сверху, так и снизу.
Этот ответ не очень, но я добавляю это сейчас.
if #available(iOS 10.0, *) { automaticallyAdjustsScrollViewInsets = false tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0) }
отключить индикатор вертикальной прокрутки, но проблема все еще существует. Кроме того, вы не можете использовать #available
для проверки версии iOS. Он используется для проверки наличия API или нет в версии iOS. Так что я в конечном итоге с помощью этого решения:
В результатов поиска контроллер (не главный контроллер зрения):
override func viewDidLoad() {
super.viewDidLoad()
if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 10,
minorVersion: 0,
patchVersion: 0)) {
automaticallyAdjustsScrollViewInsets = false
}
}
Когда результаты поиска обновления в главном контроллере представления:
func updateSearchResults(for searchController: UISearchController) {
if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 10,
minorVersion: 0,
patchVersion: 0)) {
searchResultsController.tableView.contentInset = UIEdgeInsets(top: topLayoutGuide.length,
left: 0,
bottom: bottomLayoutGuide.length,
right: 0)
}
// Filter results here
}
searchResultsController
является упомянутым выше контроллером.
Если вы хотите отрегулировать ориентацию, снова установите searchResultsController.tableView.contentInset
при изменении ориентации.
По-прежнему существует еще одна проблема: каждый раз, когда появляется главный контроллер представления (переключается с другой панели вкладок, появляется контроллер вида ...), вызывается updateSearchResults
. Это довольно плохо для производительности, так как я загружаю результаты асинхронно.
Спасибо, Пабло! Ты лучший! – alexruperez
Это не поможет, если вы хотите, чтобы контроллер поиска имел отдельное представление для результатов поиска. Этот пробел появляется в iOS 10, но не iOS 7-9. – Molanda