Странный режим отображения UISearchDisplayController в iOS 7 при вставке в панель навигации

Я создаю приложение для iOS 7. Я пытаюсь установить UISearchDisplayController в панель навигации.

У меня он настроен так: В раскадровке я добавил "Панель поиска и поисковый контроллер дисплея" в представление контроллера просмотра и установил ее в (0,0) относительно верхнего руководства по макету. Я установил ограничения для вывода налево, сверху и справа. (Я играл с ограничениями, я удалил их полностью, это не имеет значения) Кроме того, у меня есть мой вид в таблице. Когда я добавил панель поиска в представление в раскадровке, она автоматически настраивает выходные точки для делегата searchDisplayController и searchBar. В коде у меня есть self.searchDisplayController.displaysSearchBarInNavigationBar = YES; У меня две проблемы:

1) Без каких-либо кнопок, отображаемых для строки поиска (Interface builder → выберите панель поиска → Параметры: не выбрано), строка поиска находится посередине экрана:

enter image description here

Если я нажму на панель навигации, он начнет редактирование строки поиска:

enter image description here

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

2) Некоторое время я общался с ним и решил проверить, есть ли кнопка отмены. Теперь у меня есть панель поиска, встроенная в навигационную панель, но наложение все еще сдвинуто вниз:

enter image description here

Опять же, когда появится представление таблицы результатов поиска, оно сдвигается вниз на ту же величину (обратите внимание на полосу прокрутки в правой части):

enter image description here

Еще более странно, я установил границу на уровне таблицы просмотра контроллера отображения, и он выглядит правильно:

enter image description here

Я никогда раньше не использовал UISearchDisplayController, и я не знаком с его настройкой, но функционально он отлично работает. Я прочитал некоторые другие подобные сообщения, но единственный совет - взломать его, отрегулировав фреймы и установив вручную смещения. Я бы предпочел знать, что вызывает это, это ошибка? Что-то я делаю неправильно? Если это ошибка, я могу дождаться исправления. Похоже, что такая основная вещь, что тысяча человек, должно быть, сделала без проблем, поэтому я чувствую, что я не правильно ее настраиваю. Спасибо за ваш вклад.

Ответ 1

Я помню, что вы столкнулись с одной и той же точной проблемой, которую вы наблюдаете. Могут быть несколько решений, которые вы можете попробовать.

  • Если вы используете раскадровку Вы должны щелкнуть на контроллере представления или контроллере TableView, который вы настроили для своего табличного представления, и перейти к его инспектору атрибутов и посмотреть в разделе ViewController и установить раздел "Расширить края" под верхними барами.

  • Если вы не используете раскадровку, вы можете вручную установить параметры с помощью свойства edgeReviewLayout для объектов viewcontrollers, и это должно сделать трюк. Я использовал раскадровки.

Ответ 2

В моем случае, используя раскадровки, мне пришлось проверять как Под верхними барами, так и Под непрозрачными барами, и оставить Under Bottom Bars непроверенным.

Ответ 3

В моем случае мне действительно нужно было снять отметку со всех полей Extended Edges (по сути, так же, как программно установить Extended Edges на UIRectEdgeNone, я считаю) в моей раскадровке, чтобы остановить мою панель поиска от смещения. Спасибо, ребята!

Ответ 4

У меня была такая же проблема. И я решу эту проблему с добавлением объекта просмотра в представлении таблицы.

  • Добавить новый ViewController на раскадровке
  • Перетащите TableView в новый VC
  • Перетащите ячейку таблицы в TableView
  • Сделать подключение для TableView DataSource, TableView Делегат к новому VC

Ответ 5

определяетPresentationContext = true

override func viewDidLoad() {
        super.viewDidLoad()

        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.dimsBackgroundDuringPresentation = true
        searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
        self.tableView.tableHeaderView = searchController.searchBar

        definesPresentationContext = true

или см. UISearchBar, представленный UISearchController в представлении заголовка таблицы, слишком затягивается, когда активен

Ответ 6

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

Эта ссылка помогла:

http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/

Я поставил код ниже для удобства:

static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
    if (!view || classNameSuffix.length == 0) return nil;

    UIView *theView = nil;
    for (__unsafe_unretained UIView *subview in view.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
            return subview;
        }else {
            if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
        }
    }
    return theView;
}

- (void)correctSearchDisplayFrames {
    // Update search bar frame.
    CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
    superviewFrame.origin.y = 0.f;
    self.searchDisplayController.searchBar.superview.frame = superviewFrame;

    // Strech dimming view.
    UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
    if (dimmingView) {
        CGRect dimmingFrame = dimmingView.superview.frame;
        dimmingFrame.origin.y = self.searchDisplayController.searchBar.frame.size.height;
        dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.origin.y;
        dimmingView.superview.frame = dimmingFrame;
    }
}

- (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
    [UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
        for (UIView *view in self.tableView.subviews) {
            if (view != self.searchDisplayController.searchResultsTableView &&
                view != self.searchDisplayController.searchBar) {
                view.alpha = hidden ? 0.f : 1.f;
            }
        }
    }];
}

// This fixes UISearchBarController on iOS 7. rdar://14800556
- (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
    if (PSPDFIsUIKitFlatMode()) {
        [self.navigationController setNavigationBarHidden:beginSearch animated:YES];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self correctSearchDisplayFrames];
        });
        [self setAllViewsExceptSearchHidden:beginSearch animated:YES];
        [UIView animateWithDuration:0.25f animations:^{
            self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
        }];
    }
}

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    [self correctFramesForSearchDisplayControllerBeginSearch:YES];
}

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    [self correctSearchDisplayFrames];
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    [self correctFramesForSearchDisplayControllerBeginSearch:NO];
}

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    // HACK: iOS 7 requires a cruel workaround to show the search table view.
    if (PSPDFIsUIKitFlatMode()) {
        controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
    }
}

Ответ 7

У меня было очень похожее поведение. Для меня решение состояло в том, чтобы снять флажок Extend Edges Under Top Bar в настройках раскадровки для родительского контроллера представления (я отключил прозрачные навигаторы, не уверен, что это что-то влияет). Если вы не используете раскадровку, вам нужно установить [UIViewController edgeForExtendedLayout].

Из документов Apple:

Это свойство применяется только к контроллерам представлений, которые встроены в контейнеры, такие как UINavigationController или UITabBarController. Контроллеры просмотра, установленные в качестве контроллера корневого представления, не реагируют на это свойство. Значение по умолчанию - UIRectEdgeAll.

Ответ 8

Моя проблема была просто Настроить вставки прокрутки. После изменения false у меня не было проблем