如何使用swift实现UIPanGestureRecognizer来翻译和解除UITableViewController?

时间:2015-06-30 19:30:49

标签: ios swift uipangesturerecognizer

我正在尝试使用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")
    }
}

0 个答案:

没有答案