Сделать UIView в палитре UIScrollView сверху при прокрутке вверх
Итак, в UITableView, когда у вас есть разделы, секция смотрит вверх, пока следующий раздел не перекрывает ее, а затем заменяет ее сверху. Я хочу иметь аналогичный эффект, где в основном у меня есть UIView в моем UIScrollView, представляющем разделы UIView и когда он попадает в верхнюю часть. Я хочу, чтобы он оставался там и не поднимался. Как мне это сделать? Я думаю, что это нужно делать либо в layoutSubviews, либо в scrollViewDidScroll, и делать манипуляции с UIVIew..
Ответы
Ответ 1
Чтобы создать UIView в UIScrollView, нажмите вверху при прокрутке:
- (void)createHeaderView:(UIView*)headerView {
_headerView = [headerView retain];
_headerViewInitialY = _headerView.frame.origin.y;
[_scrollView addSubview:_headerView];
_scrollView.delegate = self;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGRect headerFrame = _headerView.frame;
headerFrame.origin.y = MAX(_headerViewInitialY, scrollView.contentOffset.y);
_headerView.frame = headerFrame;
}
Ответ 2
Swift Solution на основе ответа EVYA:
var navigationBarOriginalOffset : CGFloat?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationBarOriginalOffset = navigationBar.frame.origin.y
}
func scrollViewDidScroll(scrollView: UIScrollView) {
navigationBar.frame.origin.y = max(navigationBarOriginalOffset!, scrollView.contentOffset.y)
}
Ответ 3
Если я правильно помню, в презентации 2010 WWDC ScrollView обсуждается, как сохранить представление в фиксированной позиции, пока другие элементы прокручивают его. Посмотрите видео, и у вас должен быть четкий подход к реализации.
Он по существу обновляет фреймы на основе обратных вызовов scrollViewDidScroll (хотя память немного туманна в тонких точках).
Ответ 4
Решение Evya работает очень хорошо, однако если вы используете Auto Layout, вы должны сделать что-то вроде этого (синтаксис Auto Layout написан в Masonry, но вы получите эту идею.):
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
//Make the header view sticky to the top.
[self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.scrollView.mas_top).with.offset(scrollView.contentOffset.y);
make.left.equalTo(self.scrollView.mas_left);
make.right.equalTo(self.scrollView.mas_right);
make.height.equalTo(@(headerViewHeight));
}];
[self.scrollView bringSubviewToFront:self.headerView];
}