V1r*_*ru8 19 cocoa-touch objective-c uigesturerecognizer uipangesturerecognizer uilongpressgesturerecogni
我喜欢将UILongPressGestureRecognizer与UIPanGestureRecognizer结合使用.
UIPanGestureRecognizer应该从长按开始.有一个简单的方法吗?还是我真的要写自己的手势识别器?
我不喜欢在主屏幕上.你按下一个图标,一段时间后图标开始摇晃.之后我没有从屏幕上松开手指,我可以开始拖动手指下的图标.
小智 21
实际上,您不必组合手势识别器 - 您只能使用UILongPressGestureRecognizer执行此操作...一旦您的触摸在'allowableMovement'中保持'minimumPressDuration',您就进入StateBegan.只要你不抬起任何手指,你就会保持连续的longPressGesture - 所以你可以开始移动手指并通过StateChanged跟踪运动.
长按手势是连续的.当指定时间段(minimumPressDuration)按下允许的手指数(numberOfTouchesRequired)并且触摸不超出允许的移动范围(allowableMovement)时,手势开始(UIGestureRecognizerStateBegan).每当手指移动时,手势识别器转换到改变状态,并且当任何手指被抬起时,手势识别器结束(UIGestureRecognizerStateEnded).
And*_*y B 18
我遇到这个问题有点困难.接受的答案还不够.无论我在该方法中使用什么,都会调用pan或longpress处理程序.我找到的解决方案如下:
UIGestureRecognizerDelegate
.将以下委托方法添加到您的类中(根据上面的答案):
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
Run Code Online (Sandbox Code Playgroud)将以下委托方法添加到您的类:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)然后添加一个属性或ivar,它将跟踪是否应该允许平底锅开始(参见上面的方法).就我而言BOOL shouldAllowPan
.
将BOOL设置为NO
您的init
或viewDidLoad
.在你的longPress处理程序中设置BOOL为YES
.我是这样做的:
- (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
if(UIGestureRecognizerStateBegan == gesture.state) {
shouldAllowPan = NO;
}
if(UIGestureRecognizerStateChanged == gesture.state) {
shouldAllowPan = YES;
}
}
Run Code Online (Sandbox Code Playgroud)在panHandler中我检查BOOL:
- (void)panHandler:(UIPanGestureRecognizer *)sender{
if(shouldAllowPan) {
// do your stuff
}
Run Code Online (Sandbox Code Playgroud)最后在panHandler中重置BOOL:
else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
shouldAllowPan = NO;
}
Run Code Online (Sandbox Code Playgroud)然后去喝啤酒祝贺自己.;)
V1r*_*ru8 16
我找到了一个解决方案:这个UIGestureRecognizerDelegate方法完全符合我的要求:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
Run Code Online (Sandbox Code Playgroud)
Andy B在Swift中的方法,
将UIGestureRecognizerDelegate委托添加到类中
class ViewController: UIViewController, UIGestureRecognizerDelegate
Run Code Online (Sandbox Code Playgroud)添加成员变量
var shouldAllowPan: Bool = false
Run Code Online (Sandbox Code Playgroud)添加手势并需要将平移手势委托添加到VC.这需要触发shouldRecognizeSimultaneouslyWithGestureRecognizer和gestureRecognizerShouldBegin函数
// long press
let longPressRec = UILongPressGestureRecognizer(target: self, action: "longPress:")
yourView.addGestureRecognizer(longPressRec)
// drag
let panRec = UIPanGestureRecognizer(target: self, action: "draggedView:")
panRec.delegate = self
yourView.addGestureRecognizer(panRec)
Run Code Online (Sandbox Code Playgroud)允许同时手势
func gestureRecognizer(UIGestureRecognizer,
shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
// println("shouldRecognizeSimultaneouslyWithGestureRecognizer");
return true
}
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
// We only allow the (drag) gesture to continue if it is within a long press
if((gestureRecognizer is UIPanGestureRecognizer) && (shouldAllowPan == false)) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)在长按处理机内:
func longPress(sender: UILongPressGestureRecognizer) {
if(sender.state == .Began) {
// handle the long press
}
else if(sender.state == .Changed){
shouldAllowPan = true
}
else if (sender.state == .Ended) {
shouldAllowPan = false
}
}
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
10230 次 |
最近记录: |