Ios UIPangestureRecognitor在触摸时立即执行某些操作
我是ios新手,所以如果我遗漏了一些明显的东西,我会提前道歉 我正在制作一个拼图,我希望每个拼图块在触摸时变大,松开时变小 目前我有:Ios UIPangestureRecognitor在触摸时立即执行某些操作,ios,uigesturerecognizer,uipangesturerecognizer,Ios,Uigesturerecognizer,Uipangesturerecognizer,我是ios新手,所以如果我遗漏了一些明显的东西,我会提前道歉 我正在制作一个拼图,我希望每个拼图块在触摸时变大,松开时变小 目前我有: -(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{ if(recognizer.state == UIGestureRecognizerStateBegan) else if(recognizer.state == UIGestureRecognizerStateEnded) } 当平移
-(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{
if(recognizer.state == UIGestureRecognizerStateBegan)
else if(recognizer.state == UIGestureRecognizerStateEnded)
}
当平移开始时(也是状态开始时),拼图块的大小增加,当平移结束时,拼图块的大小减小(如预期)。我想大小增加,一旦用户已经接触到的一块和之前的拼图块移动。这可以在选择互动程序时与朋友的文字中看到
我试过了
-(IBAction)handleTap:(UITapGestureRecognizer *)recognizer{
if(recognizer.state == UIGestureRecognizerStateBegan)
else if(recognizer.state == UIGestureRecognizerStateEnded)
}
这只会在手指抬起后增加拼图
我的问题:
有没有一种方法可以在手指接触到拼图块后增加拼图块的大小,然后继续平移手势
提前感谢。根据
UIPangestureRecognitizer
只有在“允许的最小手指数(最小触碰数)移动到足以被视为平移”时,才会进入UIgestureRecognitizer状态。如果您想在触摸时立即发生某些事情,可以尝试将UIPangestureRecognitor子类化,然后跳过触摸开始:withEvent:
我正在尝试做类似的事情,我一直在研究的解决方案是使用视图的touchBegind:withEvent:在用户触摸屏幕时执行我想要执行的操作。一旦触摸变成手势,手势处理程序就会接管。我也需要这样做,杰克的建议对我来说非常有效。为了帮助将来遇到此问题的任何人,下面是我的uipangestrerecognizer
的子类实现(标题保持不变):
我已经实现了George WS的答案。通过一些测试,我意识到在初次触摸之后,但在初次触摸结束之前发生的其他触摸事件没有得到正确处理。这是我更新的实现。这有点幼稚,但可以防止UIgestureRecognitizerState多次出现所导致的奇怪行为
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.state >= UIGestureRecognizerStateBegan) {
return;
}
[super touchesBegan:touches withEvent:event];
self.state = UIGestureRecognizerStateBegan;
}
谢谢George WS&Derrick Hathaway
Swift 2.2
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
if (self.state == UIGestureRecognizerState.Began) {
return
}
super.touchesBegan(touches, withEvent: event)
self.state = UIGestureRecognizerState.Began;
}
override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
if(self.state==UIGestureRecognitizerState.Start){
返回
}
super.touchsbegind(touchs,withEvent:event)
self.state=UIgestureRecognitizerState.Start;
}
您必须将以下内容添加到桥接标头中:
#import <UIKit/UIGestureRecognizerSubclass.h>
#导入
Swift 3/4/5解决方案
class InstantPanGestureRecognizer: UIPanGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
if self.state == .began { return }
super.touchesBegan(touches, with: event)
self.state = .began
}
}
class InstantPangestureRecogener:UIPangestureRecogener{
覆盖func touchesStart(touchs:Set,带有事件:UIEvent){
如果self.state==.start{return}
super.touchesbeated(touches,with:event)
self.state=.start
}
}
我在作为UIScrollView一部分的视图中绘制。我使用UIPangestureRecognitor在视图中绘制。此UIPangestureRecognitor的MinimumNumberOfTouchs和MaximumNumberOfTouchs设置为1
我使用滚动视图中的UIPinchGestureRecognitor和UIPanGestureRecognitor进行平移和缩放。scrollView的UIPangestureRecognitor将MinimumNumberOfTouchs和MaximumNumberOfTouchs设置为2
我使用了George WS的解决方案,我注意到绘图开始得很快,但很难识别用于缩放的捏手势和用于平移的双指平移手势。我稍微更改了解决方案,并使用TouchsMoved来识别绘图的开始。可以更好地识别缩放和平移
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesMoved(touches, with: event)
state = UIGestureRecognizer.State.began
}
override func touchesMoved(touch:Set,带有事件:UIEvent){
super.touchesMoved(touches,with:event)
state=UIgestureRecognitor.state.Start
}
是,缺少“中间”状态。你必须跟踪它,看看它们是否已经开始移动(translationview
)。你是个天才,我从来没有想过要这么做。手势识别器将使用相同的状态值调用其选择器两次…如果我们在本身具有touchesBegind方法的UIview上实现ImmediatePanGestureRecognizer,该怎么办?我们如何区分优先级?@GeorgeWS,如果你看到这条消息,我只是在你的“著名答案”中修正了当前的Swift!显然,请随意回滚、编辑等,干杯!这也是我的情况。谢谢你的主意!
class InstantPanGestureRecognizer: UIPanGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
if self.state == .began { return }
super.touchesBegan(touches, with: event)
self.state = .began
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesMoved(touches, with: event)
state = UIGestureRecognizer.State.began
}