UIScrollView - установить отрицательный contentOffset при запуске отказов анимации

Я использую UITableView чтобы добиться эффекта масштаба / размытия на профиле моего пользователя (как в приложении Spotify), когда я опускаю UITableView к негативу contentOffset.y, Это все отлично работает...

Теперь, когда пользователь опускается до contentOffset.y меньше или равно определенному значению maintainOffsetY = 70.0- и он "отпускает" мнение, я хотел бы сохранить это contentOffset до тех пор, пока пользователь снова не "поднимает" представление вверх, вместо того, чтобы оно автоматически возвращалось к contentOffset = (0,0) снова.

Чтобы достичь этого, я должен знать, когда касания начинались и заканчивались, что я могу сделать с помощью следующих методов делегата:

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    // is like touches begin
    if ([scrollView isEqual:_tableView]) {
        NSLog(@"touches began");
        _touchesEnded = NO;
    }
}
- (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
// is like touches ended
NSLog(@"touches ended");
if ([scrollView isEqual:_tableView]) {
    _touchesEnded = YES;
}

}

Затем в

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

Я проверяю, если contentOffset.y меньше или равно maintainOffsetY и если пользователь уже "отпустил" таблицу, значит, он собирается отскочить (или уже отскакивает) назад к contentOffset = (0,0),

Кажется невозможным позволить этому отскочить назад только к maintainOffsetY, Кто-нибудь знает обходной путь или есть идеи, как это решить?

Любая помощь высоко ценится!

1 ответ

Чтобы установить отрицательное смещение для вида прокрутки, вы можете использовать это.

Вам необходимо сохранить начальную вставку содержимого представления прокрутки. Это может быть уже не 0, если у вас есть полупрозрачная навигационная панель, например.

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];

        contentInsetTopInitial = self.tableView.contentInset.top;
    }

Тогда напиши это.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    CGPoint contentOffset = scrollView.contentOffset; // need to save contentOffset before changing contentInset
    CGFloat contentOffsetY = contentOffset.y + contentInsetTopInitial; // calculate pure offset, without inset

    if (contentOffsetY < -maintainOffsetY) {
        scrollView.contentInset = UIEdgeInsetsMake(contentInsetTopInitial + maintainOffsetY, 0, maintainOffsetY, 0);
        [scrollView setContentOffset:contentOffset animated:NO];
    }
}

Надеюсь, это поможет.

Другие вопросы по тегам