2013-06-27 5 views
4

나는 도청 될 때 확인 상태가되며, 다시 두드리면 원하는 동작을 수행하는 사용자 정의 UIControl을 사용합니다.비 침습적으로 UIControl 외부의 어디에서나 상호 작용을 어떻게 감지 할 수 있습니까?

사용자가 화면의 다른 곳에서 상호 작용하는 경우이 컨트롤을 초기 상태로 되돌리고 싶습니다. 이것을 달성하기위한 비침 범성 방법이 있습니까?

설명 : 설명 :이 컨트롤 내에 코드를 포함 할 수없는 경우 코드 침해가 발생한다고 생각합니다. 다른 앱의 개발자에게이 코드를 제공하고 싶습니다.이 코드는 앱의 컨트롤을 추가 할 때 사용할 수 있습니다. 앱의 다른 곳에서 코드를 사용하지 않고도 사용할 수 있습니다. 이것이 가능하지 않다면, 괜찮지 만 문제는 이것을 비 침습적으로 달성하는 방법입니다.

답변

1

UITapGestureRecognizer은 바깥 쪽에서 터치가 발생했을 때만 해제를 유발하는 모든 항목 위에 놓여 있다고 생각할 수 있습니다. UIControl 범위입니다.

- (void)presentConfirm { 
    // whatever 

    self.dismissRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss:)]; 
    self.dismissRecognizer = self; 
    [self.view addGestureRecognizer:self.dismissRecognizer]; 
} 

- (void)dismiss:(UIGestureRecognizer *)gestureRecognizer { 
    // do stuff 

    [self.view removeGestureRecognizer:self.dismissRecognizer]; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    CGPoint touchPoint = [touch locationInView:self.view]; 
    return !CGRectContainsPoint(self.control.frame, touch)); 
} 

는 기본적 터치가 UIControl 프레임 밖에서 일어나는에만 dismiss 방법을 트리거하고 같은

뭔가 (내가 당신의 통제가 self.control으로 참조되는 가정).

은 또한 당신이 dismissRecognizer 속성을 필요 해요 것은
@property (nonatomic, strong) UITapGestureRecognizer *dismissRecognizer; 

로 선언하고 또한 당신의 컨트롤러가 UIGestureRecognizerDelegate 프로토콜을 준수 함을 선언해야 경고를 방지 할 수 있습니다.

0

당신은 touchesBegan 방법으로이를 수행을 시도 할 수 있습니다 :이 도움이

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    if(myUIControl.isInConfirmState){ // check if your control is in confirmed state 

    UITouch* touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInView:self.view]; 

     if(!CGRectContainsPoint(myUIControl.frame, touchLocation)){ 
    // set myUIControl to it's initial state 
     } 
    } 
} 

희망을.

+1

이 방법은 침입성이있는 전체 창을 덮는 뷰에 배치해야합니다. –

+0

글쎄, 버튼을 그리는 것은 모든 터치에서 if 표현식을 검사하는 것보다 천 배나 더 많은 비용이들 것입니다. – nemesis

+0

침입 형 프로젝트에 통합하기 위해 내 코드를 다른 사람에게 제공하고 싶습니다. 가능한 경우 다른 코드를 엉망으로 만들고 싶지 않습니다. –