我试图找到一种限制用户在我的UITableView中的某些部分滚动的好方法。例如,当选择第3部分时(按照我的逻辑),我想将它锁定在屏幕顶部,这样你就不能滚动它直到它被解锁,但重要的部分是我仍然想要保持响应感觉UIScrollView(即反弹互动)。
我试图自己重建逻辑,如下所示(效果很好,但我没有找到相同的反弹感觉):
override func scrollViewDidScroll(scrollView: UIScrollView) {
let sectionRect = tableView.rectForSection(activeHeaderSection)
let topY = sectionRect.origin.y
let bottomY = topY + sectionRect.height
let frameSize = self.tableView.frame.size.height - self.navigationController!.navigationBar.frame.size.height
let translation = scrollView.panGestureRecognizer.translationInView(scrollView)
if (scrollView.contentOffset.y + frameSize > bottomY) && (frameSize < sectionRect.size.height) && (translation.y < 0) {
UIView.animateLinear(0.7, initialSpringVelocity: 0, animations: { self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: self.checkTuple[self.activeHeaderSection].pickChecks.count-1, inSection: self.activeHeaderSection), atScrollPosition: .Bottom, animated: false) }, completion: nil)
} else if (frameSize > sectionRect.size.height) || (scrollView.contentOffset.y < topY) {
UIView.animateLinear(0.7, initialSpringVelocity: 0, animations: { self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: self.activeHeaderSection), atScrollPosition: .Top, animated: false) }, completion: nil)
}
}
所以我在这里进行了一些搜索,并且有些问题指向限制scrollView的contentView高度和位置(即类似这样的内容):
override func scrollViewDidScroll(scrollView: UIScrollView) {
var activeHeaderSection = 4
let sectionRect = tableView.rectForSection(activeHeaderSection)
tableView.contentOffset.y = sectionRect.origin.y // Set once when locked
tableView.contentSize.height = sectionRect.size.height
tableView.clipsToBounds = false
}
但是这并没有真正给我我想要的行为,因为它始终坚持我的UITableView的顶部(具有正确的高度),但不向下滚动到正确的部分。如果可能的话,我更喜欢使用像第二种方法那样简单的东西,我不确定是否有更简单的方法来完成这样的事情所以我想我会在这里问。
答案 0 :(得分:2)
我想这个
tableView.contentOffset.y = sectionRect.origin.y
tableView.contentSize.height = sectionRect.size.height
应该是:
tableView.contentInset.top = -sectionRect.origin.y
tableView.contentSize.height = sectionRect.origin.y + sectionRect.size.height