ios – 在Swift中为两个函数提取手势识别器?

想象一下iOS屏幕,您可以上下移动手指来做某事(想象一下,“缩放”),

要么,

作为一个单独的功能,你可以左右移动你的手指做某事(想象一下,“改变颜色”或“旋转”).

他们是

分离

功能,你只能在一次做一个.

因此,如果它“以”开始“为横向版本,它仍然只是一个横向版本.相反,如果它“开始”为垂直版本,它仍然只是一个垂直版本.

这样做有点棘手,我将在下面介绍如何做到这一点……基本模式是:

if (r.state == .Began || panway == .WasZeros )
    {
    prev = tr
    if (tr.x==0 && tr.y==0)
        {
        panway = .WasZeros
        return
        }
    if (abs(tr.x)>abs(tr.y)) ... set panway
    }

这非常有效,这里是如何在Swift中完成的.

在storyboard中使用UIPanGestureRecognizer,将其拖到相关视图中.将代理连接到视图控制器并将插座设置为此调用ultraPan:

enum Panway
    { 
    case Vertical
    case Horizontal
    case WasZeros
    }
var panway:Panway = .Vertical
var prev:CGPoint!

@IBAction func ultraPan(r:UIPanGestureRecognizer!)
    {
    let tr = r.translationInView(r.view)

    if (r.state == .Began || panway == .WasZeros )
        {
        prev = tr

        if (tr.x==0 && tr.y==0)
            {
            panway = .WasZeros
            return
            }

        if (abs(tr.x)>abs(tr.y))
            {
            panway = .Horizontal
            }
        else
            {
            panway = .Vertical
            }
        }

    if (panway == .Horizontal)  // your left-right function
        {
        var h = tr.x - prev.x
        let sensitivity:CGFloat = 50.0
        h = h / sensitivity
        // adjust your left-right function,example
        someProperty = someProperty + h
        }

    if (panway == .Vertical)    // bigger/smaller
        {
        var v = tr.y - prev.y
        let sensitivity:CGFloat = 2200.0
        v = v / sensitivity
        // adjust your up-down function,example
        someOtherProperty = someOtherProperty + v
        }

    prev = tr
    }

没关系.

但是创建UIPanGestureRecognizer的新子类(或其他东西)肯定会更好,因此有两个新概念……

UIHorizontalPanGestureRecognizer

UIVerticalPanGestureRecognizer

那些基本上是一维的panners.

我完全不知道你是否会……委托子类化?还是上课? (什么类?),或者某种扩展……的确,我基本上对此完全无能为力:)

目标是一个人的代码,你可以有这样的东西……

@IBAction func horizontalPanDelta( ..? )
    {
    someProperty = someProperty + delta
    }
@IBAction func verticalPanDelta( ..? )
    {
    otherProperty = otherProperty + delta
    }

如何以这种方式继承/扩展UIPanGestureRecognizer?

解决方法

But it would surely be better to make a new subclass (or something) of UIPanGestureRecognizer,so that there are two new concepts……

  • UIHorizontalPanGestureRecognizer

  • UIVerticalPanGestureRecognizer

Those would be basically one-dimensional panners

正确.这正是如何做到的,这是正常的做法.实际上,这正是手势识别器的用途:每个g.r.仅识别其自己的手势,并且当它确实时,它会使竞争的手势识别器退避.这就是手势识别器的重点!否则,我们仍然会回到前期.纯粹触动的日子等等(哦,恐怖).

事实上,我的在线书籍讨论了你在这里给出的一个例子:

http://www.apeth.com/iOSBook/ch18.html#_subclassing_gesture_recognizers

这是一个在Swift中实现它的实际可下载示例:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch05p203gestureRecognizers/ch18p541gestureRecognizers/HorizVertPanGestureRecognizers.swift

观察此处使用的策略.我们制作UIPanGestureRecognizer子类.我们覆盖了touchesBegan和touchesMoved:一旦识别开始,我们就会在看到下一次触摸沿着错误的轴时失败. (您应该观看Apple关于此主题的视频;正如他们所说,当您将手势识别器子类化时,您应该“提前失败,经常失败”.)我们还会覆盖translationInView,以便只能直接沿轴移动.结果(如果您下载项目本身就可以看到)是一个可以水平或垂直拖动但不以其他方式拖动的视图.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...