第十三章 UIGestureRecognizer and UIMenuController翻译

来源:互联网 发布:淘宝交易额多少了 编辑:程序博客网 时间:2024/06/17 18:06


A,手势事件是在应用层中处理,它在raw touch中插入识别手势事件

B,默认情况下,一旦识别到了手势,相应的touch事件就不会发送,除非设置cancelsTouchesInView为false

C,两种手势并不能并发处理,但可以在手势的delegata中(实现UIGestureRecognizerDelegate>)实现    gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:.,这个多个手势就可以并发处理

D,可以在多个手势之间设置先入依赖关系,这样一个手势可以等到另外一个手势失败后才触发!


一,UIGestureRecognizer可以用于识别手势

        1,使用target-action设置监听手势的对象和处理方法

        2,UIGestureRecognizer如果识别到手势,相应的UIResponder不会再被处理


二,创建tap手势

UITapGestureRecognizer *doubleTapRecognizer =[[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(doubleTap:)];doubleTapRecognizer.numberOfTapsRequired = 2;[self addGestureRecognizer:doubleTapRecognizer];

此时的事件处理顺序:

touchesBegan:withEvent:   -》  UIResponder
Recognized Double Tap    -》         tap gesture
touchesCancelled:withEvent:  -> UIResponder

当手势被触发后,所有的UIResponder都不会被发送。


三,多手势依赖

        1,如果同时有tap和double tap手势,可以为这2个手势设置依赖关系

        2,可以设置tap只有在double tap手势失败的时候才触发


四,UIMenuController

        1,显示小菜单,该组件为全局组件,显示它的view必须是first responder

        2,需要添加UIMenuItem

   

- (void)tap:(UIGestureRecognizer *)gr{NSLog(@"Recognized tap");CGPoint point = [gr locationInView:self];self.selectedLine = [self lineAtPoint:point];if (self.selectedLine) {// Make ourselves the target of menu item action messages[self becomeFirstResponder];// Grab the menu controllerUIMenuController *menu = [UIMenuController sharedMenuController];// Create a new "Delete" UIMenuItemUIMenuItem *deleteItem = [[UIMenuItem alloc] initWithTitle:@"Delete"action:@selector(deleteLine:)];menu.menuItems = @[deleteItem];// Tell the menu where it should come from and show it[menu setTargetRect:CGRectMake(point.x, point.y, 2, 2) inView:self];[menu setMenuVisible:YES animated:YES];} else {// Hide the menu if no line is selected[[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];}[self setNeedsDisplay];}

五,UILongPressGestureRecognizer 长按手势

        1,内部有一个状态机,有三种状态

               UIGestureRecognizerStatePossible、UIGestureRecognizerStateBegan、UIGestureRecognizerStateEnded.

         2,状态改变的时候都会给它的target发送消息,target根据状态类型进行区分

         3,创建长按手势

UILongPressGestureRecognizer *pressRecognizer =[[UILongPressGestureRecognizer alloc] initWithTarget:selfaction:@selector(longPress:)];[self addGestureRecognizer:pressRecognizer];

          

六,UIPanGestureRecognizer and Simultaneous  Recognizers  pan手势和并存的手势

       1,在Long press的手势触发后,需要有pan的手势移动,所以需要有并存的手势事件;在手势的delegate的方法中

              

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizershouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)other{if (gestureRecognizer == self.moveRecognizer) {return YES;}return NO;}

       2,pan手势的translationInView:可以返回移动的距离

       3,手势的cancelsTouchesInView 设置为NO,可以避免手势“吃掉”touch事件 

      

七,UIMenuController以及 UIResponderStandardEditActions

        1,UIMenuController有默认的menuItem,比如copy  edit等; 

        2,只有实现UIResponderStandardEditActions中声明的方法,相应的menuItem才会显示; UIMenuController会发送canPerformAction:withSender:判断是否需要显示

        3,UIResponderStandardEditActions并没有具体的类,它是在NSObject中声明? 


八,More on UIGestureRecognizer

        1,本章的内容只是入门

        2,手势会“吃掉”touch事件,但你也可以使用delaysTouchesBegan, delaysTouchesEnded, and cancelsTouchesInView设置

        3,每个手势内部都有状态机维护状态,比如possible、began、ended、failed等, 但有些手势可能只触发一种状态

        4,可以通过继承UIGestureRecognizer自定义手势









0 0
原创粉丝点击