有人要求我提供解决方案的代码,所以我将其发布在这里作为答案。这个想法的功劳应该归于NobodyNada。
在我的UITableViewController 中,我实现了这个委托方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[[NSNotificationCenter defaultCenter] postNotificationName:@"TableViewScrolled" object:nil userInfo:scrollUserInfo];
}
scrollUserInfo 是一个NSDictionary,我将UITableView 与通知一起传递(我在viewDidLoad 中执行此操作,因此我只需执行一次):
scrollUserInfo = [NSDictionary dictionaryWithObject:self.tableView forKey:@"scrollView"];
现在,在具有我想要在滚动时移出屏幕的视图的视图控制器中,我在 viewDidLoad 中执行此操作:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleScroll:) name:@"TableViewScrolled" object:nil];
最后我有了方法:
- (void)handleScroll:(NSNotification *)notification {
UIScrollView *scrollView = [notification.userInfo valueForKey:@"scrollView"];
CGFloat currentOffset = scrollView.contentOffset.y;
CGFloat height = scrollView.frame.size.height;
CGFloat distanceFromBottom = scrollView.contentSize.height - currentOffset;
if (previousOffset < currentOffset && distanceFromBottom > height) {
if (currentOffset > viewHeight)
currentOffset = viewHeight;
self.topVerticalConstraint.constant += previousOffset - currentOffset;
previousOffset = currentOffset;
}
else {
if (previousOffset > currentOffset) {
if (currentOffset < 0)
currentOffset = 0;
self.topVerticalConstraint.constant += previousOffset - currentOffset;
previousOffset = currentOffset;
}
}
}
previousOffset 是一个实例变量CGFloat previousOffset;。
topVerticalConstraint 是设置为 IBOutlet 的 NSLayoutConstraint。它从视图的顶部到其父视图的顶部,初始值为0。
这并不完美。例如,如果用户非常积极地向上滚动,则视图的移动可能会有点生涩。对于大视图,这个问题更糟;如果视图足够小,则没有问题。