当我将UITableView
下拉为负UITableView
时,我正在使用contentOffset.y
对我的用户的个人资料图片(如Spotify应用中)实现缩放/解除混乱效果。这一切都很好......
现在,当用户下拉到contentOffset.y
小于或等于某个值时,-let称之为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
。有人知道解决方法或对如何解决这个问题有所了解吗?
非常感谢任何帮助!
答案 0 :(得分:2)
要为滚动视图设置负偏移,您可以使用此功能。
您需要保存滚动视图的初始内容插入。如果您有半透明导航栏,则它可能不是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];
}
}
希望这会有所帮助。