繁体   English   中英

ScrollView-手势识别器-垂直滑动

[英]ScrollView - Gesture Recognizer - Swipe vertically

我有一个UIScrollView,可以在向左或向右滑动时使用,但是我减小了scrollView的大小,因此,现在的显示区域不能完全占据超级视图的框架,并且滑动仅在滚动视图的框架内起作用。

我希望即使在缩小的滚动视图的水平范围之外向上或向下滑动时也可以垂直滚动。

建议使用手势识别器,但这超出了我目前对iOS的了解,可以使用更具体的建议或更多指导来开始使用。

有一种更简单的方法,然后使用手势识别器=]

您可以设置滚动视图的超级视图(BIGGER ...),以将触摸传递给滚动视图。 工作正常MAGICALY =]

首先,选择将所有接触传递给滚动视图的视图。 如果您的父视图已经可以,则可以使用它。 否则,您应该考虑以所需大小添加新视图,以吸引触摸。

现在创建一个新类(我将使用swift作为示例)

class TestView: UIView {

    @IBOutlet weak var Scroller: UIScrollView!

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let view = super.hitTest(point, with: event)

        if (view == self) {
            return Scroller
        }

        return view

    }

}

太好了! 现在,如您所见,我们添加了滚动条的出口。 因此,请使用界面生成器,选择新视图,然后在身份检查器中将其类设置为“ TestView ”(或设置为您将用于自定义类的名称)。

设置课程并仍然选择视图后,转到连接检查器,然后将“ Scroller ”连接到情节提要上的滚动视图。 所有连接正确=]

而已!! 无需手势识别器!! 新视图将所有触摸内容传递给滚动视图,并且其行为就像您在其中平移一样=]

在我的答案中,我使用了该答案

编辑:我现在改进了代码,它不能按预期的方式工作,现在它仅在需要时才捕获,而不是像以前一样在应用程序中进行每一次触摸

  1. 搜索一个名为SwipeGestureRecognizer的组件: 在此处输入图片说明

  2. 抓取它并将其放到View的顶部(使用层次结构确保将其放到其上,如果将其放到另一个元素上,则此代码将不起作用):

    在此处输入图片说明

  3. 选择层次结构中的SwipeGestureRecognizer之一,然后转到其属性页面。 将滑动向右更改。

在此处输入图片说明

  1. 确保其他识别器的“向左滑动”属性

在此处输入图片说明

  1. 选择UIScrollView并取消选中已启用滚动

在此处输入图片说明

  1. detectSwipe() (请参见下面的源代码)连接到两个识别器。

-

@IBAction func detectSwipe (_ sender: UISwipeGestureRecognizer) {
    if (currentPage < MAX_PAGE && sender.direction == UISwipeGestureRecognizerDirection.left) {
        moveScrollView(direction: 1)
    }
    if (currentPage > MIN_PAGE && sender.direction == UISwipeGestureRecognizerDirection.right) {
        moveScrollView(direction: -1)
    }
}



func moveScrollView(direction: Int) {
    currentPage = currentPage + direction
    let point: CGPoint = CGPoint(x: scrollView.frame.size.width * CGFloat(currentPage), y: 0.0)
    scrollView.setContentOffset(point, animated: true)      

    // Create a animation to increase the actual icon on screen
    UIView.animate(withDuration: 0.4) {
        self.images[self.currentPage].transform = CGAffineTransform.init(scaleX: 1.4, y: 1.4)
        for x in 0 ..< self.images.count {
            if (x != self.currentPage) {
                self.images[x].transform = CGAffineTransform.identity
            }
        }
    }
}    

有关更多信息,请参阅https://github.com/alxsnchez/scrollViewSwipeGestureRecognizer

我没有时间详细回答,但:

在情节提要中,在滚动视图的超级视图上拖动一个平移手势识别器...将其动作与您的视图控制器相连,并在此动作中使用手势识别器的属性作为参数来更改滚动视图的位置

提示:在组合框中将动作更改参数类型从“ AnyUIPanGestureRecognizer

请不要将此答案作为在问题中使用此方法的建议,我不知道这是否是最佳方法,我只是在帮助您尝试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM