我正在尝试使用UIPanGestureRecognizer来翻译和关闭UITableViewController。我希望手势在到达滚动视图底部时触发TableView 的转换,并在将其翻译为屏幕高度的1/3时解除TableView。当TableView到达其滚动视图的底部时,我尝试添加GestureRecognizer,但应用程序最终添加了手势识别器并禁用在TableView中向上滚动的自由。
我可以根据要求提供代码,但我应该能够遵循您可能拥有的一般解决方案。
提前致谢。
需要注意的几件事:
我已将手势识别器添加到表格视图
我想在Facebook的iPhone应用程序中为特定视图创建类似的效果。在他们的应用程序中,每当您从相册中选择一张照片时,它都会显示一个TableView,当您到达其滚动视图中的任何边缘时,它允许您翻译和关闭它。
这是我目前拥有的代码:
override func scrollViewDidScroll(scrollView: UIScrollView) {
// MARK: - Scrollview dismiss from bottom
let scrollViewHeight = scrollView.frame.height
let scrollContentSizeHeight = scrollView.contentSize.height
let scrollOffset = scrollView.contentOffset.y
// Detects if scroll view is at bottom of table view
if scrollOffset + scrollViewHeight >= scrollContentSizeHeight {
println("Reached bottom of table view")
self.panGesture = UIPanGestureRecognizer(target: self, action: "slideViewFromBottom:")
self.imageTableView.addGestureRecognizer(panGesture)
}
}
func slideViewFromBottom(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(imageTableView).y
let velocity = recognizer.velocityInView(self.imageTableView)
var centerOfImageTableView = self.imageTableView.center.y
switch recognizer.state {
case .Began:
// Touches begin
println("Touches began")
case .Changed:
// Limits view translation to only pan up
if velocity.y < 0.0 {
centerOfImageTableView = self.screenbounds.height/2 + translation
}
case .Ended:
// Determines length of translation to be animated
let moveToTop = screenbounds.height + translation
// Animates view depending on view location at end of gesture
if translation <= -UIScreen.mainScreen().bounds.height/2 {
UIView.animateWithDuration(0.2) {
self.imageTableView.transform = CGAffineTransformMakeTranslation(0.0, -moveToTop)
return
}
delay(0.3) {
self.presentingViewController?.dismissViewControllerAnimated(false, completion: nil)
}
}
else {
UIView.animateWithDuration(0.3) {
self.imageTableView.transform = CGAffineTransformMakeTranslation(0.0, -translation)
return
}
recognizer.enabled = false
}
default:
println("Default executed")
}
}