it-roy-ru.com

UISearchController неправильная позиция из-за вставки табличного представления

Я работаю над функцией, которая имеет пользовательское представление над UITableView, похоже, что TableView имеет contentInset. Я добавил SearchController в TableViewHeader, но когда я нажимаю на searchTextView SearchController перемещается вверх с анимацией (около 20 пикселей). Я хочу, чтобы UISearchBar был в верхней части ViewController, как в «Constacts»

Этот скриншот показывает, как сейчас:

 enter image description here

это то, что я хочу:

 enter image description here

Что я должен делать? Мне нужен contentInset после поиска (пользователь нажал на отмену), но во время поиска он мне не нужен.

Я хочу предоставить пример приложения, который демонстрирует все это -> введите описание ссылки здесь

5
Nosov Pavel

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

                      **OR**

Установите флажки «Под верхними полосами» и «Под непрозрачными полосами» и оставьте флажки «Под нижними полосами» непроверенными.

Сделай это :

 option 1

ИЛИДЕЛАЙТЕ это:

 option2

7
Samarth Kejriwal

Попробуйте поиграть с Adjust Scroll View Insets, Under Top Bars и Under Bottom Bars в конструкторе интерфейса. У меня была та же проблема с collectionView, и отключение их работало для меня. Ваш пример проекта работает для меня, но когда я переключаюсь между этими настройками, он ломается.

 enter image description here

 enter image description here

5
Harry Singh

Добавьте приведенный ниже код в viewWillAppear()

self.automaticallyAdjustsScrollViewInsets = false
1
roy
  1. Создайте временный UISearchBar и назначьте его как tableHeaderView

    searchbar   =   UISearchBar(frame: CGRect(x: 0, y: 0, width: 375, height: 44))
    searchbar?.delegate =   self
    tableView.tableHeaderView = searchbar
    
  2. и перед нажатием панели поиска представьте UISearchController для копирования анимации

    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    
        if searchBar == searchbar {
    
           self.tableView.tableHeaderView  =   nil
    
           UIView.animate(withDuration: 0.33, animations: {
               // 64+44 is due because the navigation gets hidden and also because of the temp searchBar as tableHeaderView
               self.tableView.contentInset =   UIEdgeInsets(top: 64+44, left: 0, bottom: 0, right: 0)
           }, completion: { _ in
    
           })
           self.present(searchController, animated: true, completion: nil)
       }
    
       return false
    
    }
    
  3. И, наконец, кнопка отмены поиска UISearchControllerBar сбрасывает tableView contentInset

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        if searchBar == searchController.searchBar {
            UIView.animate(withDuration: 0.33, animations: {
                self.tableView.contentInset =   UIEdgeInsets(top: 100+44, left: 0, bottom: 0, right: 0)
            }, completion: { _ in
    
            })
    
            self.searchbar?.isHidden    =   false
            self.tableView.tableHeaderView  =   self.searchbar
        }
    }
    
1
Vinod Rathod

Как насчет настройки вставки содержимого каждый раз после запуска searchBar для начала/окончания редактирования:

// MARK: - UISearchBarDelegate
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    UIView.transition(with: self.tableView,
                      duration: 0.6,
                      options: .curveLinear,
                      animations: {
                        self.tableView.contentInset = UIEdgeInsets.zero
    }, completion: { success in })
    return true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    UIView.transition(with: self.tableView,
                      duration: 0.6,
                      options: .curveLinear,
                      animations: {
                        self.tableView.contentInset = UIEdgeInsets(top: 100, left: 0, bottom: 0, right: 0)
    }, completion: { success in })
}
1
Allen

Я думаю, что ваш YourVC (VC, у которого есть SearchBar и Table View) встроен в NavigationController или просто выдвинут VC, который встраивается.

Пожалуйста, посмотрите на это Образец , я создал для вас.

Замечания: 

  1. Поместите ограничение высоты CustomView (верх: 0, начало: 0, трейлинг: 0, высота: 60).
  2. Переведите панель поиска в пользовательское представление, добавьте ограничение на панель поиска как (верхняя часть: 20, начальная: 0, конечная: 0, нижняя: 0).
  3. Используйте Минимальный SearchBarStyle для searchBar.
  4. Включить кнопку «Отмена» в панели поиска.
  5. Присвойте цвет фона пользовательскому представлению так же, как цвет панели поиска, используя палитру цветов.
  6. Поместите TableView ниже customView и задайте ограничение как (вертикальный интервал для пользовательского представления: 0, начальный: 0, конечный: 0, нижний: 0).
  7. Снимите флажок «Настроить вкладки просмотра прокрутки», как показано на рисунке ниже .  Uncheck the "Adjust scroll View Insets"

Надеюсь, что это решит вашу проблему.

0
Amit

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

 storyBoard

Я знаю, что это какая-то хакка, но это решит вашу проблему, для реализации searchController я использую это в своем проекте, и он отлично работает

var searchController: UISearchController?

override func viewDidLoad() {
    super.viewDidLoad()

    searchController?.isActive = true
    searchController = initSearchController()
}

func initSearchController() -> UISearchController {
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self
    searchController.hidesNavigationBarDuringPresentation = true
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true


    searchController.searchBar.searchBarStyle = .minimal
    searchController.searchBar.sizeToFit()
    self.tableView.tableHeaderView = searchController.searchBar
    tableView.contentOffset = CGPoint(x: 0, y: 
    searchController.searchBar.frame.size.height)
    return searchController
}

Надеюсь, это поможет

0
Arashk

Ну, во-первых, я посмотрел оба проекта, которые вы связали, и в версии Objective-C нет вставки содержимого, это просто обычное табличное представление.

Что касается вашей проблемы, позвольте мне убедиться, что я понимаю. Вот что вам нужно:

  1. Табличное представление
  2. Изображение над этим табличным представлением, которое не меняет положение, не прокручивает, просто остается там
  3. Панель поиска в верхней части таблицы, но под фиксированным изображением
  4. Когда пользователь выполняет поиск, спрячьте картинку и доведите представление таблицы до конца.
  5. Когда пользователь завершит поиск, вы хотите, чтобы таблица опустилась, чтобы изображение снова могло отображаться вверху

Правильно?

Предполагая, что это правда, вот моя идея.

Прежде всего, я бы отказался от UITableViewController и изменил бы его на просто UIViewController. Добавьте табличное представление как подпредставление и управляйте его положением от контроллера представления. Это означает, что вы не возитесь со вставками контента, вы просто размещаете таблицу под изображением и все. Я не уверен, хотите ли вы, чтобы панель поиска находилась над изображением или под ней, но, предполагая, что она находится ниже, все равно просто сохраняйте ее как заголовок представления таблицы, а когда она станет активной, просто анимируйте представление таблицы и изображение, чтобы перемещаться вверх до изображения ушел, и табличное представление находится наверху. Если вы хотите, чтобы панель поиска находилась над изображением, не добавляйте ее в представление таблицы, а добавьте ее в качестве подпредставления основного представления, отдельно от всего, и управляйте ее положением с помощью кода, а не позволяйте ОС обрабатывать ее. , Кроме того, может быть проблема с контроллером поиска, я не очень часто его использую, поэтому я не уверен, но вам может быть лучше просто использовать UISearchBar и обрабатывать весь поиск самостоятельно.

Удачи!

0
Denis Balko

У меня была похожая проблема, я исправил ее, установив edgesForExtendedLayout в none, , Но после исследования также решение может отличаться, в зависимости от вашей реализации вашей иерархии, вы можете снять Extend Edges Under Top Bar с раскадровки.

0
Hady Nourallah

На самом деле контроллер представления пытается автоматически настроить вставки содержимого вашей UITableView равными высоте панели навигации.

Снятие отметки с Adjust Scroll View Insets должно решить вашу проблему. У меня также была эта проблема при использовании раскадровок. 

0
Sourav Chandra

Я просто установил self.extendedLayoutIncludesOpaqueBars как true, решил мою проблему.

0
Anders Lau

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

  1. скрыть панель навигации с помощью,

    self.navigationController.navigationBarHidden = YES; // (Цель C) self.navigationController.navigationBarHidden = true; // (Swift)

  2. измените рамку таблицы, изменив его Origin.y с 0 на -44 (так как высота панели навигации равна 44), как показано ниже,  enter image description here

0
cnu