要么,
作为一个单独的功能,你可以左右移动你的手指做某事(想象一下,“改变颜色”或“旋转”).
他们是
分离
因此,如果它“以”开始“为横向版本,它仍然只是一个横向版本.相反,如果它“开始”为垂直版本,它仍然只是一个垂直版本.
这样做有点棘手,我将在下面介绍如何做到这一点……基本模式是:
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中实现它的实际可下载示例:
观察此处使用的策略.我们制作UIPanGestureRecognizer子类.我们覆盖了touchesBegan和touchesMoved:一旦识别开始,我们就会在看到下一次触摸沿着错误的轴时失败. (您应该观看Apple关于此主题的视频;正如他们所说,当您将手势识别器子类化时,您应该“提前失败,经常失败”.)我们还会覆盖translationInView,以便只能直接沿轴移动.结果(如果您下载项目本身就可以看到)是一个可以水平或垂直拖动但不以其他方式拖动的视图.