2012-02-19 109 views
2

我是iOS/Objective-C的新手,我想知道如何构建自定义手势。特别是,如果用户轻击屏幕的右上方并将他/她的手指沿着设备的边缘向下滑动(与左手侧相同的手势)。我通过这个阅读:自定义iOS手势

https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizers/GestureRecognizers.html#//apple_ref/doc/uid/TP40009541-CH6-SW2

但我想我有麻烦搞清楚如何将其应用到我的具体情况。

+0

是什么手势? – 2012-02-19 01:25:47

回答

6

创建一个UIGestureRecognizer子类有点涉及到坚实的方式。我非常推荐观看有关这个主题的WWDC2010视频Session 120 - Simplifying Touch Event Handling with Gesture Recognizers & Session 121 - Advanced Gesture Recognition。他们是彻底的,做得很好。

但是对于一个非常简单的例子,根据您的问题,我创建了一个非常简单的手势识别器,当用户触摸附加视图的左上象限并将其手指滑向附件右下象限时触发查看并拿起他们的手指,而不会滑到所附视图的左侧。

RightSlidedown.h:

#import <UIKit/UIGestureRecognizerSubclass.h> // This import is essential 
@interface RightSlidedown : UIGestureRecognizer 
@end 

RightSlidedown.m

​​

所以基本上手势识别得到什么似乎是一个标准的触摸事件。 (他们不是,但他们这样做)。当您响应这些动作时,您将更改手势识别器的state属性。

识别器有两种基本类型:“离散”(思考点按手势)和“连续”(思考平移手势)。这两种类型在开始时都会自动从UIGestureRecognizerStatePossible开始。

对于“离散”类型,与此类似,您的目标是尽快达到UIGestureRecognizerStateRecognizedUIGestureRecognizerStateFailed

此示例的理想用法是将RightSlidedown手势识别器添加到视图控制器的viewDidLoad中新“单视图应用程序”的主视图中。

[self.view addGestureRecognizer:[[RightSlidedown alloc] initWithTarget:self action:@selector(rightSlide:)]]; 

然后进行简单的操作方法是所有的需要,像这样:

-(void)rightSlide:(RightSlidedown *)rsd{ 
    NSLog(@"right slide"); 
} 
+0

谢谢你的非常完整的回应。我遇到了两个问题: 1)无论出于何种原因,每当我做手势时,我都不会对“触摸结束”功能进行操作。我想知道是否有某种时间限制,您不得不在整个屏幕上滑动手指。 2)我目前在我的视图上有另一个长按手势识别器(只需按住按住处理程序)。我如何区分这两种手势? – user1120008 2012-02-19 07:51:54

+0

我编辑了我的答案了一下。另外1)这个手势识别器没有时间限制。如果识别器发生故障(长按识别可能失败),则不会触及'touchesEnded:'是正常的。 2)手势识别器通过调用其相关的动作方法来区分自己。 – NJones 2012-02-19 16:52:59

+0

好吧,所以我确定了我遇到的问题touchesEnded :.我想在表格视图顶部使用此滑动手势。它在普通视图上工作正常,但在表视图顶部不能正确执行。 – user1120008 2012-02-20 19:38:54

1

您可以通过在触摸的x和y轴上查看正面或负面的三角洲来实现。例如,复选标记手势(√)将会是负三角洲,其后是y中的正三角形,而x总是负三角形,并且触摸以比起始位置更低的高度结束。添加更多手指可以添加更多支票。

伪代码:

bool firstStroke, secondStroke, motion, override; 
while (touchdown){ 
if (yDelta < 0){firstStroke = TRUE;} 
if (firstStroke && yDelta > 0){secondStroke = TRUE;} 
if (xDelta < 0){motion = TRUE;} 
if (xDelta > 0 || (firstStroke && secondStroke && yDelta < 0)){override = TRUE;} 
} 
if (firstStroke && secondStroke && motion && start.y > end.y && !override){ 
    return TRUE; 
}else{ 
    return FALSE; 
} 

的同时命令意味着当触摸是下来,检查3两件事:

- 如果所述触摸已经向下移动

- 如果触摸具有后向下移动它已经向上移动

- 如果触摸从右向左移动

第四项检查是查看触摸是否从左向右移动,或者在手势完成后手势向下移动之后。

触摸完成后,还有一项检查以查看手势是否移动正确,点是否在正确位置开始和结束以及手势是否移动不正确(覆盖)。

希望有所帮助。