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

Posted

技术标签:

【中文标题】ScrollView - 手势识别器 - 垂直滑动【英文标题】:ScrollView - Gesture Recognizer - Swipe vertically 【发布时间】:2016-12-13 22:55:26 【问题描述】:

我有一个 UIScrollView 可以在向左或向右滑动时工作,但是我已经减小了 scrollView 的大小,所以现在显示区域没有完全占据超级视图的框架,并且只能在滚动视图的框架内滑动.

我希望即使在缩小滚动视图的水平边界之外上下滑动时也能够垂直滚动。

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

【问题讨论】:

见***.com/a/43328905/5173807 【参考方案1】:

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

您可以设置滚动视图的超级视图(更大...)以将触摸传递给滚动视图。它正在工作 M-A-G-I-C-A-L-Y =]

首先,选择将所有触摸都传递给滚动视图的视图。如果您的父视图已经可以使用,您可以使用它。否则你应该考虑添加一个你想要的尺寸的新视图来吸引人。

现在创建一个新类(我将使用 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”连接到情节提要上的滚动视图。所有连接正确=]

就是这样!!无需手势识别器!! 新视图会将它的所有内容传递给滚动视图,它的行为就像你在其中平移一样 =]

在我的回答中,我使用了that answer

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

【讨论】:

它的工作。但是你能用手势识别器来做吗? 教练要求用手势来做。这就是为什么。 它更难(而且不太优雅 - 只适合学习),我认为你应该打开一个新问题.. 希望你能找到它【参考方案2】:

    搜索名为 SwipeGestureRecognizer 的组件:

    抓取它并将其放在视图顶部(使用层次结构确保 你把它放在它上面,如果你把它放在另一个元素上,这个代码将不起作用):

    在层次结构中选择SwipeGestureRecognizer 之一并转到其属性页面。将滑动更改为向右。

    确保其他识别器具有向左滑动属性

    选择UIScrollView 并取消选中启用滚动

    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

【讨论】:

【参考方案3】:

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

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

提示:在组合框中将动作更改参数类型从Any 连接到UIPanGestureRecognizer

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

【讨论】:

您好,谢谢您的回答。我回家后会尝试一下,如果可行,请发表评论。 对你有帮助?? 我已经尝试过了,但我没有时间再次对此发表评论,抱歉。我试图理解你所说的内容,并据我所知对其进行了编码。现在,我现在真的不知道手势识别器属性是什么,所以我只是将这段代码放在 ViewController.swift 中:@IBAction func ScrollOver(_ sender: UIPanGestureRecognizer) scrollView.frame.size.width = 320 正如我说scrollView比superView小,但是scrollView有颜色,所以我写了这个额外的代码,scrollView的大小会变大,颜色也会变大,所以这不是我想做的。 它是否按照您的要求捕捉到颜色之外的触摸? 不,它没有。仅在颜色范围内。

以上是关于ScrollView - 手势识别器 - 垂直滑动的主要内容,如果未能解决你的问题,请参考以下文章

如何拦截垂直滑动手势

ui scrollview 中没有手势识别器 uiimageview

滑动垂直手势无法使用UITableView

iOS解决嵌套在ScrollView中的TableView滑动手势冲突问题

仅在滚动内容到达边缘时识别 UIScrollView 中的滑动手势

UISwipeGestureRecognizer 垂直于 UIWebView 滚动:如何避免对角滑动?