Я намагався наслідувати цю поведінку в ситуації, коли мені потрібен індивідуальний заголовок, що сидить біля UITableView. Я прокрутив власну панель "навігації", тому що вона розташована нижче ряду інших матеріалів на сторінці, і я хотів, щоб заголовки розділів дотримувались стандартної поведінки "стикування". Я думаю, що я знайшов досить розумний та лаконічний спосіб налаштувати UITableView / UIScrollView разом з іншим об’єктом у стилі, подібному до того, що спостерігається у Facebook / Instagram / Chrome / тощо. додатки.
У моєму .xib файлі мої компоненти завантажуються у вільну форму перегляду: http://imgur.com/0z9yebJ (вибачте, у мене немає реплікації для вбудованих зображень)
Зауважте, що на лівій бічній панелі таблиця впорядкована за основним поданням заголовка. З екрана екрана ви не можете розпізнати, але він також має таке ж положення y, як і головний вигляд заголовка. Оскільки воно поширюється з поля зору, властивість contentInset у UITableView встановлено на 76 (висота подання головного заголовка).
Для того, щоб перегляд головного заголовка просувався в унісон з UIScrollView, я використовую методи scrollViewDidScroll UIScrollViewDelegate для виконання деяких обчислень та зміни змісту Inset UIScrollView, а також кадру головного заголовка.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
UIEdgeInsets insets = scrollView.contentInset;
//tableViewInsetDelta and tableViewOriginalInsetValue are NSInteger variables that I set to 0 and 76, respectively, in viewDidLoad
tableViewInsetDelta = tableViewOriginalInsetValue + scrollView.contentOffset.y;
insets.top = tableViewOriginalInsetValue - tableViewInsetDelta;
if (scrollView.contentOffset.y > -76 && scrollView.contentOffset.y < 0) {
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44 - tableViewInsetDelta, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
} else if (scrollView.contentOffset.y > 0) {
insets.top = 0;
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, -32, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
} else if (scrollView.contentOffset.y < -76) {
insets.top = 76;
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
}
}
Перший, якщо заява робить більшу частину важкого підйому, але мені довелося включити два інших, щоб обробити ситуації, коли користувач насильно перетягується, а початкові значення contentOffset, що надсилаються на scrollViewDidScroll, виходять за межі діапазону першого, якщо оператора .
Зрештою, це працює дуже добре для мене. Я ненавиджу завантажувати свої проекти з купою роздутих підкласів. Я не можу говорити, чи це найкраще рішення щодо ефективності рішення (я завжди вагався вводити будь-який код у scrollViewDidScroll, оскільки він постійно називається), але слід коду є найменшим, що я бачив у будь-якому рішення цієї проблеми, і це не передбачає вкладання UITableView в UIScrollView (Apple радить цього не робити в документації, а події дотику в кінцевому підсумку виявляються трохи привабливими для UITableView). Сподіваюся, це допоможе комусь!