Сделать 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];
}