2016-09-04 2 views

ответ

3

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

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

Этот ответ не очень, но я добавляю это сейчас.

if #available(iOS 10.0, *) { 
    automaticallyAdjustsScrollViewInsets = false 
    tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0) 
} 
1

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

No more whitespace!

+0

Спасибо, Пабло! Ты лучший! – alexruperez

+4

Это не поможет, если вы хотите, чтобы контроллер поиска имел отдельное представление для результатов поиска. Этот пробел появляется в iOS 10, но не iOS 7-9. – Molanda

0

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

automaticallyAdjustsScrollViewInsets = false 

+0

Я добавил автоматическиAdjustsScrollViewInsets = false как для searchController, так и для searchResultsController и все еще имеет разрыв с iOS 10. – Molanda

1

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

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

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

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

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

1

на основе @yishus ответить здесь: https://stackoverflow.com/a/39871273/4405051

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

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

Этот ответ не очень, но я добавляю это сейчас.

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