Пробел появляется только в iOS 10.
5 ответов
Я тоже столкнулся с этой проблемой. Если у вас включен индикатор вертикальной прокрутки, вы должны увидеть, что это проблема со вставкой UIScrollView
. И похоже, что это происходит только тогда, когда вы используете UITableViewcontroller
как searchResultsController
для UISearchController
.
И это дополнительное пространство видно как вверху, так и внизу вида.
Это некрасивый ответ, но пока я добавляю его.
if #available(iOS 10.0, *) {
automaticallyAdjustsScrollViewInsets = false
tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0)
}
Вы устанавливаете UITableViewController как searchResultsController UISearchController, но без Autolayout и фрейма.
Как вы можете прочитать в быстрой справке UISearchController, вы можете передать ее nil, если вы хотите отображать результаты поиска в том же контроллере представления, который отображает доступный для поиска контент.
Итак, ваш код будет выглядеть нормально, если вы установите его так:
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? ⬇️"
}
}
...
На основе ответа @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
. Это очень плохо для производительности, так как я загружаю результаты асинхронно.
Я попробовал другой подход, который, похоже, у меня сработал. Для основной цели вашего приложения установите для параметра «Скрыть строку состояния» значение true. По крайней мере, для меня (семя Xcode 8 GM) это фактически не скрывало строку состояния в приложении, но, похоже, исправило проблему с интервалом.
В то время как для меня это устранило проблему, когда телефон ориентирован вертикально, это не решило полностью проблему с интервалом при горизонтальной ориентации. Этот фрагмент кода также устраняет проблему на экранах, выровненных по горизонтали:
override var prefersStatusBarHidden: Bool {
get {
return UIApplication.shared.isStatusBarHidden
}
}
Конечно, установка для параметра prefersStatusBarHidden значения false полностью отключит строку состояния, но это может быть неприемлемым решением для некоторых разработчиков.
Надеюсь это поможет. Это немного похоже на взлом, и я надеюсь, что Apple решит эту проблему в будущем обновлении iOS.
Наконец, я нашел самое простое решение:
automaticallyAdjustsScrollViewInsets = false
🎉😃
Похожие вопросы
Связанные вопросы
Новые вопросы
uitableview
UITableView - это класс, используемый для отображения и редактирования списков информации на iOS. В табличном представлении элементы отображаются в одном столбце. UITableView является подклассом UIScrollView, который позволяет пользователям прокручивать таблицу, хотя UITableView допускает только вертикальную прокрутку.