Приличная строка поиска и поведение заголовка раздела, аналогичное положению с родными приложениями

Я хотел бы воспроизвести липкое поведение панели поиска в приложении iPhone Contacts.

Нормальный этап

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

Пользователь прокручивает вид вниз

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

(1) строка поиска остается фиксированной вверху и
(2) последующий заголовок раздела останавливается соответственно под панелью поиска :

Пользователь прокручивается вверх

Когда заголовок следующего раздела появляется, предыдущий заголовок исчезает под панелью поиска:

Пользователь прокручивает вверх

Примечание. Элемент управления индексом раздела (az с правой стороны) также отображается поверх строки поиска . Эрго, возиться с contentInset будет толкать contentInset управления индексами вместе с ним.

Я создал пользовательский UIViewController , добавил UITableView , установил свой contentInset в высоту строки поиска. Я создал UIView , добавил панель поиска в качестве своего поднабора, а затем добавил UIView в UITableView . Однако, как отмечено выше, когда пользователь прокручивается, заголовки разделов по-прежнему удерживаются в нулевом положении y, а не на высоте заголовка. Кроме того, неблагоприятное влияние на позицию управления индексом заголовка секции.

Я был бы признателен за решение этой проблемы.

2 Solutions collect form web for “Приличная строка поиска и поведение заголовка раздела, аналогичное положению с родными приложениями”

Это была некоторая работа, чтобы все было в порядке, но мне просто нужно было доказать, что можно воссоздать это поведение, по крайней мере, почти .
Проверьте этот проект GitHub, который я создал: https://github.com/fabiankr/TableViewSearchBar

На самом деле, это даже не так сложно:
1) Добавьте строку поиска непосредственно в представление таблицы и задайте содержимое contentInset
2) In -scrollViewDidScroll: отрегулируйте рамку панели поиска

Есть некоторые оговорки, о которых вы должны заботиться, хотя:
1) При прокрутке табличного вида вверх, заголовки разделов вскоре появляются над панелью поиска. Чтобы решить эту проблему, установите строку поиска zPosition при прокрутке вверх
2) Контроллер содержимого должен быть подклассом UIViewController а не UITableViewController , потому что UISearchDisplayController добавляет вид затемнения к виду контроллера. Поскольку представление диспетчера табличных представлений view собой табличный вид, представление затемнения будет находиться в неправильном положении при прокрутке просмотра таблицы.

Одна вещь, которая невозможна с использованием только публичного API, заключается в том, чтобы сделать управление индексом раздела справа от таблицы перекрытием строки поиска. Это лишь незначительная вещь, и даже без нее поведение очень похоже на поведение, обнаруженное в приложении «Контакты».

Чтобы достичь такого же поведения, вам придется использовать частный API. В UITableView есть метод, называемый _setPinsTableHeaderView: должен использоваться. Примерный проект содержит реализации для обоих: 1) только открытый API и 2) частный API, чтобы получить контроль индекса раздела, перекрывающий панель поиска.
Напоминание : вы не должны использовать частный API, когда планируете отправить приложение в App Store!

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

 - (void)viewDidLoad { // add floating cell to tableview FloatingCell *cell = [[FloatingCell alloc] init]; [self.tableView addSubview:cell]; self.floatingCell = cell; } // overwrite scrollViewDidScroll - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGRect floatingCellFrame = floatingCell.frame; CGFloat floatingCellHeight = floatingCellFrame.size.height; // when contentOffset is is more then cellHeight scroll floating cell if (scrollView.contentOffset.y > floatingCellHeight) { floatingCellFrame.origin.y = -scrollView.contentOffset.y + floatingCellHeight; // when contentOffset is less then cellHeight stick it to the top of UITableView else if (scrollView.contentOffset.y < floatingCellHeight) floatingCellFrame.origin.y = 0; floatingCell.frame = floatingCellFrame; } 

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

  • ios swift: Как создать одну статическую ячейку в динамическом представлении таблицы?
  • Сортировка NSDictionary от JSON для UITableView
  • Программно эмулировать выбор в UITableViewController в Swift
  • Обновление таблиц «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк?
  • On Tap UILabel (распознаватель жестов) находит нуль в ячейке прототипа tableview для одной ячейки и ее рабочий тон для других двух ячеек
  • Как добавить дополнительную информацию в раздел NSFetchedResultsController
  • В Swift данные таблицы TableView, загруженные из JSON, загружаются в 80% случаев
  • UITableViewCell не отменяется при быстром обращении
  • Невозможно присвоить значение типа 'UITableViewCell' в '(AppName). (CustomCellName)'
  • Подвью UITableViewCell возвращает только UITableViewCellScrollView в iOS7
  • Когда в подкласс UITableView?
  • Interesting Posts

    Как настроить UIStackView в зависимости от его содержимого?

    InAppPurchase перестает получать ответ productRequest после удаления и повторной установки приложения

    iOS: определить, установлен ли мой SDK в других приложениях на устройстве

    Проблемы с мультимедийными запросами CSS с устройствами iOS

    Разрешение на создание папки на iPhone

    Кордова 3.4 белый экран iOS после всплеска

    SFSpeechRecognizer, который распознает несколько командных слов вместо цельной фразы?

    Кнопка «Назад» отключена iOS

    как изменить размер UIView с помощью угловых ручек – похоже на «Страницы», «Keynote»,

    Горизонтальное направление флип в раскопках iOS

    Как обрезать UIImageView в новый режим UIImage в режиме «fit fit»?

    SDK для iOS: объединенные текстовые поля

    Приложение начало рушиться на iOS 9.1 Beta 2

    MPNowPlayingInfoCenter не реагирует должным образом при приостановке воспроизведения

    Проблема с layer.shadowColor и UIColors

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.