Objective c 自定义iOS手势

Objective c 自定义iOS手势,objective-c,ios,uigesturerecognizer,Objective C,Ios,Uigesturerecognizer,我是iOS/objective-C新手,我想知道如何构建自定义手势。特别是,如果用户轻触屏幕右上角并将手指从设备边缘滑到底部(左手侧的手势相同)。我通读了以下内容: 但是我想我很难弄清楚如何将它应用到我的具体案例中。你可以通过在触摸屏的x轴和y轴上看到正三角形或负三角形来实现。例如,复选标记手势(√) 在y方向上会有一个负的三角形,然后是一个正的三角形,而在x方向上总是有一个负的三角形,并且触摸结束时的高度比开始时低。添加更多的手指可以添加更多的检查 伪代码: bool firstStroke

我是iOS/objective-C新手,我想知道如何构建自定义手势。特别是,如果用户轻触屏幕右上角并将手指从设备边缘滑到底部(左手侧的手势相同)。我通读了以下内容:


但是我想我很难弄清楚如何将它应用到我的具体案例中。

你可以通过在触摸屏的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;
}
bool firstStroke、secondStroke、motion、override;
同时(接地){
如果(yDelta<0){firstStroke=TRUE;}
如果(firstStroke&&yDelta>0){secondStroke=TRUE;}
如果(xDelta<0){motion=TRUE;}
如果(xDelta>0 | |(firstStroke&&secondStroke&&yDelta<0)){override=TRUE;}
}
if(第一笔划和第二笔划和运动和开始.y>end.y&&!覆盖){
返回TRUE;
}否则{
返回FALSE;
}
while命令意味着在按下触摸键时,检查三件事:

-如果触碰向下移动

-如果在触摸向下移动后,它再次向上移动

-如果触摸正在从右向左移动

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

触摸完成后,再进行一次检查,查看手势是否正确移动,点是否在正确的位置开始和结束,手势是否以错误的动作移动(覆盖)


希望这能有所帮助。

创建一个
UIGestureRecognitizer
子类需要一点扎实的工作。我非常推荐观看有关主题的WWDC2010视频
第120课时-使用手势识别器简化触摸事件处理
第121课时-高级手势识别
我做得很好

但对于一个非常简单的示例,基于您的问题,我创建了一个非常简单的手势识别器,当用户触摸附加视图的左上象限并将其手指向下滑动到附加视图的右下象限并拾取其手指时,该识别器将启动,而不会滑动到附加视图的左侧

rightlidedown.h:

#import <UIKit/UIGestureRecognizerSubclass.h> // This import is essential
@interface RightSlidedown : UIGestureRecognizer
@end
因此,基本上手势识别器会获得标准的触摸事件(它们不是,但它们的动作是那样的)。当你对动作做出反应时,你会更改手势识别器的
状态
属性

识别器有两种基本类型,“离散”(思考轻触手势)和“连续”(思考平移手势)。这两种类型都会在开头的
UIgestureRecognitizerState中自动启动

对于像这样的“离散”类型,您的目标是尽快获得状态
UIgestureRecognitizerStateRecognited
UIgestureRecognitizerStateFailed

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

[self.view addGestureRecognizer:[[RightSlidedown alloc] initWithTarget:self action:@selector(rightSlide:)]];
然后只需要一个简单的操作方法,如下所示:

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

感谢您的完整回复。我遇到了两个问题:1)无论出于何种原因,无论何时我做手势,我都不会进入“结束触摸”功能。我想知道是否有某种时间限制,你必须在整个屏幕上滑动手指。2) 目前,我的视图上还有另一个长按手势识别器(只需按住处理程序)。我如何区分这两种手势?我对我的回答做了一些编辑。另外1)此手势识别器没有时间限制。如果识别器出现故障(可能是长按识别器导致的故障),则无法触摸提示提示:
是正常的。2) 手势识别器通过调用其关联的动作方法来区分自己。好的,所以我确定了我在touchesend方面遇到的问题:。我想在桌面视图上使用这个滑动手势。它可以在普通视图上正常工作,但不能在表视图上正确执行。协调多个手势识别器已经够棘手的了,它涉及到
uigestureRecognitzerDelegate
方法的实现和
requiregestureRecognitzerToFail:
的调用。但是,创建第一个识别器来和苹果在表视图中使用的多个识别器一起使用将是一件棘手的事情。认真地说,试试这个
NSLog(@“%@”,self.tableView.gesturecognizers)UITableViewController
子类中选择code>并查看有多少个奇怪的识别器需要处理。我想问题是,当我做这个手势时,表视图认为我正在向下滚动。这当然没关系,但它掩盖了这种姿势,使其无法开火。难道没有一个简单的方法使两者兼容吗?
-(void)rightSlide:(RightSlidedown *)rsd{
    NSLog(@"right slide");
}