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

Я хотел бы воспроизвести липкое поведение панели поиска в приложении 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; } 

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

  • Высота ячейки TableView при прокручивании
  • Sdwebimage EXC_BAD_ACCESS
  • Шаблоны UITableView дублируются
  • Разверните ячейку при использовании в Swift
  • Количество строк в UILabel в ячейке для отображения размера
  • Splitviewcontroller с двумя табличными представлениями, делегировать проблему
  • Горизонтальный UIScrollView внутри пользовательского UITableViewCell - с использованием раскадровки IB - не прокрутка
  • dequeueReusableCellWithIdentifier продолжает возвращать ноль
  • xamarin.iOS Вертикальная прокрутка изображений
  • NSFetchedResultsController sectionIndexTitles неправильно, а не английские буквы
  • Многоразовая ячейка прототипа UITableView
  • Изменение высоты UITableView динамически
  • Interesting Posts

    Как выполнить какой-то код после выполнения segue?

    Как заблокировать пользователя в режиме Single App в iOS 6, программно?

    IOS Animation не работает с моим блоком анимации

    Выход из входного списка AccessViewView после закрытия клавиатуры

    Где я могу найти комплект Sprite Доступные шрифты?

    Как создать представление коллекции строк, которое прокручивается горизонтально, но фиксировано по вертикали?

    form onsubmit с UIWebView

    Добавление внутренней тени на uitextfield и uitextview

    Swift enum как параметр в функции

    Быстрая ошибка компиляции. Выражение было слишком сложным для решения в разумные сроки

    iPhone iOS как перевернуть / отразить любой UIView на месте?

    Создайте приложение iPad, которое может отправлять / получать данные через USB-кабель?

    Google Analytics Pod устанавливает слишком много зависимостей

    Alamofire No такой модуль (CocoaPod)

    iOS Переключение между 2 навигационными контроллерами

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