1

사용자 지정보기 클래스가 있습니다. 내보기 컨트롤러 내에서이보기 개체에 Tap 제스처 인식기를 추가합니다. 이제 탭 제스처의 핸들러에서 뷰 클래스의 drawRect에서 가져 오려고하는 뷰 객체의 속성을 설정하고 있습니다. 이제 놀랍게도 "handleGesture"& "drawRect"에서 뷰 객체를 인쇄 할 때 두 개의 다른 객체를 얻습니다. 이 때문에 내 drawRect 내부 조건이 실행되지 않습니다. 그 이유는 무엇일까요?사용자 지정보기에서 UITapGestureRecognizer 처리

상태 UIGestureRecognizerStateBegan에 제공되지 않습니다. 항상 UIGestureRecognizerStateEnded 안에 들어갑니다.

// Adding Gesture in my view 
MyCustomView *customView= [[[MyCustomView alloc] init] autorelease]; 
UIGestureRecognizer *GestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
     [customView addGestureRecognizer:GestureRecognizer]; 
     [GestureRecognizer release]; 

// Handling tap on my view 
- (void)handleGesture:(UIGestureRecognizer *)GestureRecognizer; { 
    MyCustomView *aView= (MyCustomView *)GestureRecognizer.view; 
switch (iGestureRecognizer.state) { 
    case UIGestureRecognizerStateBegan: 
     NSLog(@"Began"); 
     [aView setNeedsDisplay]; 
     aView.touchDown = YES; 
     break; 
    case UIGestureRecognizerStateEnded:  
     NSLog(@"Ended"); 
     aView.touchDown = NO; 
     [aView setNeedsDisplay]; 
     break; 
    default: 
     break; 
} 
} 

// Inside my view class 
- (void)drawRect:(CGRect)iRect { 
    if (self.touchDown) { 
// Do something here 
} 
} 

답변

2

drawRect 메서드를 호출하는 방법은 없습니다. 이 작업을 직접하고 싶지는 않지만 handleGesture 메서드에서 [aView setNeedsDisplay]를 호출하면 뷰의 drawRect가 다음 드로잉 사이클에서 호출됩니다.

+0

약간의 리팩토링을 원한다면 사용자 정의보기에서 고유 한 제스처 인식기와 handleGesture 구현을 만들 수 있습니다. 그렇게하면 뷰 내부에서이 논리를 모두 처리 할 수 ​​있으므로 사용중인 touchDown 플래그가 필요하지 않을 수 있습니다. 아마도 당신은 drawRect를 재정의 할 필요조차 없앨 수 있습니다 : – picciano

+0

예 ... 저는 그렇게 생각하고 시도했지만 도움을주지 않았습니다. 이유는 내 사용자 정의보기의 다른 개체를 만드는 내 "handleGesture"안에 내 테이블을 다시 그려야합니다. 그러면 모든 것이 엉망이됩니다. – Abhinav

+0

아, 더 많은 이유가 컨트롤러에서보기로 제스처 인식. 어쨌든 사용자 정의보기의 추가 인스턴스를 생성해서는 안됩니다. – picciano

관련 문제