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];
}
}
Надеюсь, это поможет.