в iOS 9 строку поиска исчезает из поля зрения заголовок таблицы, когда UISearchController является активный


структура:

View1 (нажмите кнопку) - > присутствует модально (MyModalView: UITableViewController)

mymodalview имеет встроенный UISearchController. Панель поиска UISearchController находится в MyModalView.tableView.tableHeaderView.

он отлично работает с iOS 8.0. Однако в iOS 9 панель поиска исчезает, когда активен UISearchController. Пожалуйста, взгляните на эти фотографии ниже

модальный вид:

uisearchcontroller активен на iOS 8:

uisearchcontroller активен на 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...

любая идея / указатель будут глубоко оценены

Ура.

13 52

13 ответов:

Я не уверен в чем именно проблема, но я норм:

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;

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

кажется, все мы получили ту же проблему, но они были решены по-разному. Однако ни один из предложенных ответов не работал для меня :(. Тем не менее спасибо всем за ваше время.

У меня есть решение, которое решает мою проблему. Он устанавливает Extend Edge-под непрозрачными полосами my (MyModalView: UITableViewController) в true в раскадровке с помощью Interface Builder.

в итоге:

MyModalView: UITableViewController, в раскадровке с помощью Интерфейс строителя

Расширить Края: - Под верхней планкой ставили галочку - Под нижними брусьями ставили галочку - Под непрозрачной решеткой ставили галочку

screenshot

Я обнаружил, что это имитация метрики (верхняя панель) в раскадровке, которая вызывает эту проблему. В моем случае работают следующие строки, но я до сих пор не знаю, почему.

- (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;
}

Я должен

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

Я нашел аналогичный вопрос здесь но в моем случае это не было на методе viewDidLoad. Я должен был попробовать разные взгляды, пока это не сработало. Теперь я могу иметь как пользовательский цвет панели навигации, так и панель поиска,

спасибо @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;
}

я исправил это в моем случае, удалив

definesPresentationContext = true

Я еще не проверял, есть ли какие-либо недостатки удаления этого!

У меня нет навигации в этом месте приложения. Ни один из других сообщений SO не помог мне, поэтому я исправил это следующим образом:

- (void)layoutSubviews
{
    [[[self searchController] searchBar] sizeToFit];
}

у меня была та же проблема, и когда я отладил пользовательский интерфейс на 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)
}

установка навигационной панели постоянно полупрозрачной в раскадровке решила мою проблему.

Он работает

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}

Если вы хотите скрыть панель навигации и представить контроллер поиска в полноэкранном режиме, установите на панели навигации следующее, и панель поиска не исчезнет:

navigationController?.navigationBar.translucent = true
sc.hidesNavigationBarDuringPresentation = false

делает трюк для меня

lazy var searchController:UISearchController = {
        let sc = UISearchController(searchResultsController: nil)
        sc.searchResultsUpdater = self
        sc.obscuresBackgroundDuringPresentation = false
        sc.searchBar.placeholder = "Search"
        sc.hidesNavigationBarDuringPresentation = false
        return sc
    }()

ни один из них не работал на меня, я исправил это с помощью этого хака

func position(for bar: UIBarPositioning) -> UIBarPosition {
    if UIDevice.current.userInterfaceIdiom == .pad {
        return .top
    } else {
        if iOSVersion <= 9 {
            return .top
        }
        return .topAttached
    }


}