亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發中的幾個手勢操作實例分享

2020-07-26 03:33:57
字體:
來源:轉載
供稿:網友

手勢操作---識別單擊還是雙擊
在視圖上同時識別單擊手勢和雙擊手勢的問題在于,當檢測到一個單擊操作時,無法確定是確實是一個單擊操作或者只是雙擊操作中的第一次點擊。解決這個問題的方法就是:在檢測到單擊時,需要等一段時間等待第二次點擊,如果沒有第二次點擊,則為單擊操作;如果有第二次點擊,則為雙擊操作。
檢測手勢有兩種方法,一種是定制子視圖,重寫視圖從UIResponder類中繼承來的事件處理方法,即touchesBegan:withEvent:等一系列方法來檢測手勢;另一個方法是使用手勢識別器,即UIGestureRecognizer的各種具體子類。
一.重寫事件處理方法

復制代碼 代碼如下:

- (id)init { 
    if ((self = [super init])) { 
        self.userInteractionEnabled = YES; 
        self.multipleTouchEnabled = YES; 
        // ... 
    } 
    return self; 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 
 
    if (touch.tapCount == 1) { 
        [self performSelector:@selector(handleSingleTap:) withObject:[NSValue valueWithCGPoint:touchPoint] afterDelay:0.3]; 
    }else if(touch.tapCount == 2) 
    { 
        [self handleDoubleTap:[NSValue valueWithCGPoint:touchPoint]]; 
    } 

 
-(void)handleSingleTap:(NSValue*)pointValue 

    CGPoint touchPoint = [pointValue CGPointValue]; 
    //... 

 
-(void)handleDoubleTap:(NSValue*)pointValue 

    CGPoint touchPoint = [pointValue CGPointValue]; 
    //... 

首先確認定制視圖的userInteractionEnabled和multipleTouchEnabled屬性都為YES.
在touchesEnded:withEvent:方法中,如果是第一次觸摸結束,則cancelPreviousPerformRequestsWithTarget:方法不會起作用,因為self未調度任何方法,此時tapCount為1,使用performSelector:withObject:afterDelay:調用單擊事件處理方法,在0.3s鐘后執行。

復制代碼 代碼如下:

[self performSelector:@selector(handleSingleTap:) withObject:[NSValue valueWithCGPoint:touchPoint] afterDelay:0.3];


如果這是一個單擊操作,則后面0.3鐘內不會再有觸摸事件,則handleSingleTap:方法執行,這樣識別出了單擊操作。
如果這是一個雙擊操作,則第二次點擊在0.3s內觸發,在第二次觸摸操作的touchesEnded:withEvent:方法中,cancelPreviousPerformRequestsWithTarget:首先會取消之前對handleSingleTap:方法的調度,使之不會執行,然后在調用handleDoubleTap:方法處理雙擊操作。
二.使用Gesture Recognizer
使用Gesture Recognizer識別就會簡單許多,只需添加兩個手勢識別器,分別檢測單擊和雙擊事件,設置必要的屬性即可。

復制代碼 代碼如下:

- (id)init { 
    if ((self = [super init])) { 
    self.userInteractionEnabled = YES; 
        UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTap:)]; 
        singleTapGesture.numberOfTapsRequired = 1; 
        singleTapGesture.numberOfTouchesRequired  = 1; 
        [self addGestureRecognizer:singleTapGesture]; 
 
        UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTap:)]; 
        doubleTapGesture.numberOfTapsRequired = 2; 
        doubleTapGesture.numberOfTouchesRequired = 1; 
        [self addGestureRecognizer:doubleTapGesture]; 
 
        [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture]; 
    } 
    return self; 

-(void)handleSingleTap:(UIGestureRecognizer *)sender{ 
    CGPoint touchPoint = [sender locationInView:self]; 
    //... 

-(void)handleDoubleTap:(UIGestureRecognizer *)sender{ 
    CGPoint touchPoint = [sender locationInView:self]; 
    //... 

唯一需要注意的是

復制代碼 代碼如下:

[singleTapGesture requireGestureRecognizerToFail:doubleTapGesture]; 


這句話的意思時,只有當doubleTapGesture識別失敗的時候(即識別出這不是雙擊操作),singleTapGesture才能開始識別,同我們一開始講的是同一個問題。


UIGestureRecognizer小應用
1、輕拍手勢:雙指、單擊,修改imageView的frame為(0,0,320,200)
2、長按手指:單指,修改imageView的alpha=0.5
3、實現平移、旋轉、捏合
4、輕掃:豎向輕掃實現圖:像隨機切換顯示;橫向輕掃實現:圖像消失,隨機修改imageview的背景顏色
5、imageview每次只能添加一種手勢識別器。

復制代碼 代碼如下:

#define _originalRect CGRectMake(10, 50, 300, 450) 
#define _originalImageName  @"h4.jpeg" 
 
#import "HMTRootViewController.h" 
 
@interface HMTRootViewController (){ 
 
    UITapGestureRecognizer       * _tapGesture; 
    UILongPressGestureRecognizer * _longGesture; 
    UIPanGestureRecognizer       * _panGesture; 
    UIRotationGestureRecognizer  * _rotateGesture; 
    UIPinchGestureRecognizer     * _pinchGesture; 
    UISwipeGestureRecognizer     * _verticalSwipeGesture; 
    UISwipeGestureRecognizer     * _horizontanlSwipeGesture; 
    BOOL isTopDownOfRightLeft;    // 垂直滑動是YES,水平滑動是NO 
     

 
@property (nonatomic,retain) UIButton * button; 
@property (nonatomic,retain) UIImageView * imageView; 
 
@end 
 
@implementation HMTRootViewController 
 
- (void)dealloc{ 
     
    RELEASE_SAFELY(_imageView); 
    RELEASE_SAFELY(_button); 
    [super dealloc]; 
 

 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
        // Custom initialization 
        isTopDownOfRightLeft = YES; 
    } 
    return self; 

 
- (void)viewDidLoad 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
     
    [self createButtonView]; 
    [self createImageView]; 
 

 
#pragma mark - 設置圖像 
- (void)createImageView{ 
     
    self.imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:_originalImageName]]; 
    _imageView.frame = CGRectMake(10, 50, 300, 450); 
    _imageView.userInteractionEnabled = YES; 
    [self.view addSubview:_imageView]; 
    [_imageView release]; 

 
 
 
#pragma mark - 設置手勢 
 
#pragma mark  點擊手勢 
- (void)createTapGestureRecognizer{ 
    
 
    _tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapGestureRecognizer:)]; 
    _tapGesture.numberOfTapsRequired = 1; 
    _tapGesture.numberOfTouchesRequired = 2; 
    [self.imageView addGestureRecognizer:_tapGesture]; 
    [_tapGesture release]; 
 

 
- (void)TapGestureRecognizer:(UITapGestureRecognizer *)tapGesture{ 
 
    self.imageView.frame = CGRectMake(0, 0, 320, 200); 
    NSLog(@"%@",NSStringFromCGRect(self.imageView.frame)); 
 
}  
 
#pragma mark  長按手勢 
- (void)createLongGestureRecognizer{ 
     
    _longGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longGestureRecognizer:)]; 
    _longGesture.numberOfTouchesRequired = 1; 
    _longGesture.minimumPressDuration = 1.0; 
    [self.imageView addGestureRecognizer:_longGesture]; 
    [_longGesture release]; 
     

 
- (void)longGestureRecognizer:(UILongPressGestureRecognizer *)longGesture{ 
 
    self.imageView.alpha = 0.5; 
    NSLog(@"%s",__FUNCTION__); 
 

 
#pragma mark 平移拖拽手勢 
- (void)createPanGestureRecognizer{ 
     
    _panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureRecognizer:)]; 
    [self.imageView addGestureRecognizer:_panGesture]; 
    [_panGesture release]; 
     

 
- (void)panGestureRecognizer:(UIPanGestureRecognizer *)panGesture{ 
     
    NSLog(@"%s",__FUNCTION__); 
  
    CGPoint txty = [panGesture translationInView:self.view]; 
    self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, txty.x, txty.y); 
     
    [panGesture setTranslation:CGPointMake(0, 0) inView:self.view]; 
     

 
#pragma mark 旋轉手勢 
- (void)createRotationGestureRecognizer{ 
     
     
    _rotateGesture = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGestureRecognizer:)]; 
    [self.imageView addGestureRecognizer:_rotateGesture]; 
    [_rotateGesture release]; 
     

 
- (void)rotationGestureRecognizer:(UIRotationGestureRecognizer *)rotateGesture{ 
     
    NSLog(@"%s",__FUNCTION__); 
    self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotateGesture.rotation); 
    rotateGesture.rotation = 0; 
     

 
#pragma mark 捏合縮放手勢 
- (void)createPinchGestureRecognizer{ 
     
    _pinchGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchGestureRecognizer:)]; 
    [self.imageView addGestureRecognizer:_pinchGesture]; 
    [_pinchGesture release]; 
     

 
- (void)pinchGestureRecognizer:(UIPinchGestureRecognizer *)pinchGesture{ 
     
    NSLog(@"%s",__FUNCTION__); 
    self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinchGesture.scale, pinchGesture.scale); 
    pinchGesture.scale = 1; 
     

 
#pragma mark - 輕掃手勢 
#pragma mark 上下 豎 垂直輕掃 
- (void)createVerticalSwipeGestureRecognizer{ 
    
    _verticalSwipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGestureRecognizer:)]; 
    _verticalSwipeGesture.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown; 
    [self.imageView addGestureRecognizer:_verticalSwipeGesture]; 
    [_verticalSwipeGesture release]; 

 
#pragma mark 水平 左右輕掃 
- (void)createHorizontanlSwipeGesture{ 
     
    _horizontanlSwipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGestureRecognizer:)]; 
    _horizontanlSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft |UISwipeGestureRecognizerDirectionRight; 
    [self.imageView addGestureRecognizer:_horizontanlSwipeGesture]; 
     

 
- (void)swipeGestureRecognizer:(UISwipeGestureRecognizer *)swipeGesture{ 
     
    NSLog(@"%s",__FUNCTION__); 
    
    if (swipeGesture.direction == (UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionDown)) { 
        self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"h%i.jpeg",arc4random()%7+1]]; 
        ; 
 
    }else if (swipeGesture.direction == (UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight)){ 
     
        self.imageView.image = nil; 
        self.imageView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1.0]; 
    } 

 
 
#pragma mark - 設置按鈕 
- (void)createButtonView{ 
     
    NSArray * buttonArray = @[@"輕點",@"長按",@"平移",@"旋轉",@"捏合",@"輕掃"]; 
     
    for (int i = 0; i < [buttonArray count]; i++) { 
         
        self.button = [UIButton buttonWithType:UIButtonTypeSystem]; 
        _button.frame = CGRectMake(10+50*i, 500, 50, 48); 
        [_button setTitle:[buttonArray objectAtIndex:i] forState:UIControlStateNormal]; 
        [_button addTarget:self action:@selector(onClikButton:) forControlEvents:UIControlEventTouchUpInside]; 
        _button.tag = i; 
        [self.view addSubview:_button]; 
    } 
   

 
- (void)onClikButton:(UIButton *)button{ 
     
    [self resetImageView]; 
    switch (button.tag) { 
        case 0: 
   
            [self createTapGestureRecognizer]; 
            break; 
        case 1: 
  
            [self createLongGestureRecognizer]; 
            break; 
        case 2: 
         
            [self createPanGestureRecognizer]; 
            break; 
        case 3: 
            
            [self createRotationGestureRecognizer]; 
            break; 
        case 4: 
             
            [self createPinchGestureRecognizer]; 
            break; 
        case 5: 
            if (isTopDownOfRightLeft == YES) { 
                [self createVerticalSwipeGestureRecognizer]; 
                isTopDownOfRightLeft = NO; 
            } else { 
                [self createHorizontanlSwipeGesture]; 
                isTopDownOfRightLeft = YES; 
            } 
            break; 
        default: 
            break; 
    } 
     

 
#pragma mark - 重置imageView 
- (void)resetImageView 

    for (int i = 0; i < [self.imageView.gestureRecognizers count]; i++) { 
        [self.imageView removeGestureRecognizer:[self.imageView.gestureRecognizers objectAtIndex:i]]; 
    } 
    self.imageView.alpha = 1.0; 
    self.imageView.transform = CGAffineTransformIdentity; 
    self.imageView.frame = _originalRect; 
    self.imageView.image = [UIImage imageNamed:_originalImageName]; 

 
 
- (void)didReceiveMemoryWarning 

    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 

 
@end 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线免费观看| 国产亚洲欧洲高清一区| 久久久精品中文字幕| 在线成人免费网站| 欧美性做爰毛片| 亚洲人成电影网站| 亚洲激情国产精品| 久久久久久久激情视频| 欧美激情第1页| 一区二区三区回区在观看免费视频| 亚洲欧洲一区二区三区在线观看| 午夜精品一区二区三区在线视| 欧美多人爱爱视频网站| 亚洲国产91色在线| 97香蕉超级碰碰久久免费软件| 久久夜色撩人精品| 911国产网站尤物在线观看| 国产亚洲视频在线| 国产亚洲欧美日韩一区二区| 日韩人体视频一二区| 伊人伊成久久人综合网小说| 亚洲天堂av综合网| 日韩成人在线网站| 国内精品久久久久久久久| 欧美韩日一区二区| 97视频人免费观看| 亚洲欧美日韩国产精品| 26uuu另类亚洲欧美日本一| 91在线观看免费高清| 国产精品美女久久久免费| 亚洲视频视频在线| 91日本在线观看| 国产成人精品日本亚洲| 亚洲精品91美女久久久久久久| 国产日韩欧美视频| 欧美激情视频三区| 456亚洲影院| 欧美精品中文字幕一区| 国语自产精品视频在免费| 久久高清视频免费| 亚洲欧洲日产国码av系列天堂| 久久久精品久久久久| 日韩在线播放视频| 91精品国产91久久久久福利| 国产成人精品999| 欧美中文字幕在线视频| 成人免费视频在线观看超级碰| 深夜福利国产精品| 日韩欧中文字幕| 亚洲一区二区久久久久久| 国产精品色视频| 久久99久久99精品中文字幕| 日韩中文字幕免费视频| 成人观看高清在线观看免费| 日韩精品在线视频| 日韩成人激情在线| 欧美综合在线第二页| 欧美激情国产精品| 欧美在线视频免费观看| 日韩欧美中文在线| 午夜精品一区二区三区在线| 日韩精品欧美激情| 国产精品一二区| 精品亚洲一区二区三区在线播放| 欧美日韩国产丝袜美女| 91中文字幕在线| 亚洲免费av片| 亚洲精品www久久久久久广东| 亚洲bt天天射| 日韩av日韩在线观看| 在线成人免费网站| 国产成人欧美在线观看| 最新日韩中文字幕| 91豆花精品一区| 一本色道久久综合狠狠躁篇的优点| 久久精品一区中文字幕| 久久久免费精品| 91久久久精品| 欧美成人性色生活仑片| 欧美综合在线观看| 韩国福利视频一区| 91国产在线精品| 亚洲国产精品久久久久秋霞蜜臀| 国产精品久久不能| 国产视频欧美视频| 欧美视频在线观看免费网址| 亚洲成人教育av| 最近2019年好看中文字幕视频| 97香蕉超级碰碰久久免费软件| 久久久影视精品| 亚洲国产精品资源| 色悠久久久久综合先锋影音下载| 91国内揄拍国内精品对白| 亚洲欧美激情在线视频| 国产欧美精品va在线观看| 国产精品九九久久久久久久| 国产午夜精品全部视频在线播放| 一区二区亚洲精品国产| 91成人在线观看国产| 国产精品无码专区在线观看| 91性高湖久久久久久久久_久久99| 91精品国产高清久久久久久| 亚洲bt天天射| 亚洲精品一区二区三区婷婷月| 国产免费观看久久黄| 国产亚洲一区二区在线| 欧美丰满少妇xxxxx做受| 亚洲理论片在线观看| 在线视频欧美性高潮| 精品久久久久久中文字幕| 国产精品欧美激情在线播放| 亚洲精品国产综合久久| 久久伊人精品天天| 中文字幕欧美日韩va免费视频| 久久影院资源网| 久久成年人免费电影| 久久久久久久一区二区| 午夜剧场成人观在线视频免费观看| 日韩精品中文字幕在线播放| 成人激情视频在线播放| 国产精品视频区| 国内成人精品视频| 黑人极品videos精品欧美裸| 992tv成人免费影院| 尤物九九久久国产精品的特点| 久久视频在线观看免费| 在线视频欧美性高潮| 国产精品美女主播在线观看纯欲| 欧美丰满老妇厨房牲生活| 欧美日韩国产中文字幕| 午夜精品一区二区三区在线视频| 久久久999精品| 狠狠爱在线视频一区| 国产成人自拍视频在线观看| 久久亚洲欧美日韩精品专区| 日韩成人在线网站| 中文字幕日韩在线视频| 中文字幕一区二区三区电影| 成人做爰www免费看视频网站| 国产精品欧美激情在线播放| 亚洲第一黄色网| 日韩在线资源网| 久久免费视频观看| 国产有码在线一区二区视频| 日本精品中文字幕| 亚洲一级片在线看| 一区二区三区四区在线观看视频| 精品中文字幕在线观看| 成人有码在线视频| 国产精品夜间视频香蕉| 青青久久av北条麻妃海外网| zzijzzij亚洲日本成熟少妇| 精品丝袜一区二区三区| 国产日韩欧美在线看| 91欧美精品成人综合在线观看| www.xxxx精品| 亚洲最大激情中文字幕| 日韩在线免费av| 91亚洲国产精品| 日韩av中文字幕在线免费观看| 亚洲自拍小视频免费观看| 午夜精品福利在线观看| 91天堂在线观看| 日韩一二三在线视频播|