Пробел появляется только в iOS 10.

iOS10HeaderBug

4
alexruperez 4 Сен 2016 в 18:50

5 ответов

Лучший ответ

Я тоже столкнулся с этой проблемой. Если у вас включен индикатор вертикальной прокрутки, вы должны увидеть, что это проблема со вставкой UIScrollView. И похоже, что это происходит только тогда, когда вы используете UITableViewcontroller как searchResultsController для UISearchController.

И это дополнительное пространство видно как вверху, так и внизу вида.

Это некрасивый ответ, но пока я добавляю его.

if #available(iOS 10.0, *) {
    automaticallyAdjustsScrollViewInsets = false
    tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0)
}
5
yishus 5 Окт 2016 в 10:15

Вы устанавливаете 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? ⬇️"
    }
}
...

No more whitespace!

3
PabloLerma 4 Сен 2016 в 19:51

На основе ответа @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. Это очень плохо для производительности, так как я загружаю результаты асинхронно.

2
Community 23 Май 2017 в 12:30

Я попробовал другой подход, который, похоже, у меня сработал. Для основной цели вашего приложения установите для параметра «Скрыть строку состояния» значение true. По крайней мере, для меня (семя Xcode 8 GM) это фактически не скрывало строку состояния в приложении, но, похоже, исправило проблему с интервалом.

В то время как для меня это устранило проблему, когда телефон ориентирован вертикально, это не решило полностью проблему с интервалом при горизонтальной ориентации. Этот фрагмент кода также устраняет проблему на экранах, выровненных по горизонтали:

    override var prefersStatusBarHidden: Bool {
        get {
            return UIApplication.shared.isStatusBarHidden
        }
    }

Конечно, установка для параметра prefersStatusBarHidden значения false полностью отключит строку состояния, но это может быть неприемлемым решением для некоторых разработчиков.

Надеюсь это поможет. Это немного похоже на взлом, и я надеюсь, что Apple решит эту проблему в будущем обновлении iOS.

1
Mike Smith 16 Окт 2016 в 12:58

Наконец, я нашел самое простое решение:

automaticallyAdjustsScrollViewInsets = false

🎉😃

0
alexruperez 4 Сен 2016 в 21:55