UIKit 프레임 워 크(16)제스처 인식 기

  • UIGestureRecognizer

  • 제스처 인식 기 를 이용 하여 사용자 가 특정한 view 에서 흔히 볼 수 있 는 제스처 를 하 는 것 을 쉽게 식별 할 수 있다.
    UIGesture Recognizer 는 추상 적 인 클래스 로 모든 제스처 의 기본 행 위 를 정의 합 니 다.하위 클래스 를 사용 해 야 구체 적 인 제스처 를 처리 할 수 있 습 니 다.
         UITapGestureRecognizer                두드리다
         UIPinchGestureRecognizer            손짓 을 맞추다
         UIPanGestureRecognizer               끌다
         UISwipeGestureRecognizer           가볍게 쓸다
         UIRotationGestureRecognizer       빙빙 돌다
         UILongPressGestureRecognizer    길 게 누르다
    4.567917.제스처 식별 기 가 사용 하 는 일반적인 절차(두 드 리 는 제스처 를 예 로 들 면)제스처 인식 기 대상 만 들 기
    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] init];

         
    제스처 식별 기 대상 의 구체 적 인 속성 설정:
    //    2           
    tap.numberOfTapsRequired = 2;
    tap.numberOfTouchesRequired = 2;

    view 에 제스처 인식 기 추가 하기:
    [self.iconView addGestureRecognizer:tap];

    감청 제스처 의 촉발:
    [tap addTarger:self action:@selector(tapIconView:)];

    촉발 을 실현 하 는 방법
    - (void) tapIconView:(UITapGestureRecognizer*) tapGR
    {
        NSLog(@"tap  ");
    }

         
    제스처 인식 기의 상태
        
    제스처 인식 기의 대리
    에이전트 프로 토 콜
    //      touch  (    YES),                   
    - (BOOL) gestureRecognizer:(UIGestureRecognizer*) gestureRecognizer shouldReceiveTouch:(UITouch*) touch;
    //                  
    - (BOOL) gestureRecognizer:(UIGestureRecognizer*) gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*) otherGestureRecognizer;

    예:UITabBarController 의 미끄럼 제스처 제어1)UITabBarController 하위 클래스,모든 하위 컨트롤 러 캡 처 저장
        UIImage 개체 배열 추가
    @property (nonatomic, strong) NSMutableArray * picArray;

        배열 이 빈 대상 으로 초기 화 됨
    NSMutableArray * arr1 = [NSMutableArray array];
    for ( int i =0; i 
      

         selectedIndex setter : ,

    - (void)setSelectedIndex:(NSUInteger)selectedIndex
    {
        //    
        float width = [UIScreen mainScreen].bounds.size.width;
        float height = [UIScreen mainScreen].bounds.size.height;
        UIGraphicsBeginImageContext(CGSizeMake(width, height));
        CGContextRef context = UIGraphicsGetCurrentContext();
        [[UIApplication sharedApplication].keyWindow.layer renderInContext:context];
        UIImage *p_w_picpath = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        //         
        NSLog(@"selectedIndex=%ld", self.selectedIndex);
        self.picArray[self.selectedIndex] = p_w_picpath;
    
        [super setSelectedIndex:selectedIndex];
    }

        현재 하위 컨트롤 러 의 앞 뒤 두 하위 컨트롤 러 캡 처 방법 을 제공 합 니 다.
    - (UIImage *) p_w_picpathForCurrentViewControllerLeft
    {
        if ( self.selectedIndex == 0 ) {
            return nil;
        }
        return self.picArray[self.selectedIndex-1];
    }
    - (UIImage *) p_w_picpathForCurrentViewControllerRight
    {
        if ( self.selectedIndex == self.viewControllers.count - 1 ) {
            return nil;
        }
        return self.picArray[self.selectedIndex+1];
    }

    2)하위 컨트롤 러 의 공용 부모 클래스 추가
        UITab BarController 의 모든 하위 컨트롤 러 유형 은 공용 부모 클래스 에서 계승 하 는 것 입 니 다.
        부모 클래스 에 미끄럼 제스처 식별 기 추가
    UIPanGestureRecognizer * gr1 = [[UIPanGestureRecognizer alloc] init];
    [gr1 addTarget:self action:@selector(panGR:)];
    [self.view addGestureRecognizer:gr1];

        부모 클래스 에 UIImageView 속성 을 추가 하여 현재 페이지 좌우 두 개의 캡 처 p 저장w_picpathView
    @property (nonatomic, weak) UIImageView * ivLeft;
    @property (nonatomic, weak) UIImageView * ivRight;

        제스처 인식 기:제스처 시작 시 현재 view 좌우 캡 처
    UIImage * imgLeft = [((ViewController*)self.tabBarController) p_w_picpathForCurrentViewControllerLeft];
    if ( imgLeft == nil ) {
        self.ivLeft = nil;
    }
    else {
        if ( [imgLeft isKindOfClass:[NSNull class]] ) {
            //   *** 
            imgLeft = [UIImage p_w_picpathNamed:@"white_bg"];
        }
        UIImageView * ivLeft = [[UIImageView alloc] initWithImage:imgLeft];
        self.ivLeft = ivLeft;
        [self.view addSubview:ivLeft];
        self.ivLeft.frame = CGRectMake(-self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
    
    UIImage * imgRight = [((ViewController*)self.tabBarController) p_w_picpathForCurrentViewControllerRight];
    if ( imgRight == nil ) {
        self.ivRight = nil;
    }
    else {
        if ( [imgRight isKindOfClass:[NSNull class]] ) {
            imgRight = [UIImage p_w_picpathNamed:@"white_bg"];
        }
        UIImageView * ivRight= [[UIImageView alloc] initWithImage:imgRight];
        self.ivRight = ivRight;
        [self.view addSubview:self.ivRight];
        self.ivRight.frame = CGRectMake(self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height);
    }

        제스처 인식 기:제스처 가 미 끄 러 질 때 현재 view 가 미 끄 러 집 니 다.
    if ( p.x > 0 && self.ivLeft == nil ) {
        return ;
    }
    if ( p.x  
      

         , ,

    if ( self.view.transform.tx > self.view.frame.size.width/2 && self.ivLeft != nil ) {
        self.view.transform = CGAffineTransformIdentity;
        self.tabBarController.selectedIndex--;
        if ( self.ivLeft != nil ) {
            [self.ivLeft removeFromSuperview];
            self.ivLeft = nil;
        }
        if ( self.ivRight != nil ) {
            [self.ivRight removeFromSuperview];
            self.ivRight = nil;
        }
        return ;
    }
    if ( self.view.transform.tx  
      





    좋은 웹페이지 즐겨찾기