2012-11-16 1 views
5

다음 작업을 수행하고 싶습니다.탭을 캡처하지만 다른 모든 제스처에 투명하게 나타나는 UIView 만들기

시나리오 : 사용자가 특정 텍스트 필드에 입력하는 동안 iOS 키보드가 화면 상에 표시됩니다. 사용자는 키보드와 텍스트 필드 바깥 쪽 아무 곳이나 눌러 키보드를 닫을 수 있습니다 (보이는 버튼을 활성화하지 않고). 또한 을 키보드 외부로 드래그하고 스크롤 가능한보기의 일부 배열에서 일반적인 끌기 동작을 관찰 할 수 있습니다.

개념적으로, 나는이 작동하는 화면의 대부분 UIView "포함"배치하고 있습니다 있도록 : 사용자가 커버에 도청

  1. 경우에, 나는 그 탭을 캡처 (나는 할 수 있도록 예 : 키보드를 닫습니다. UIView 하위 클래스의 터치 이벤트를 가로 채거나 탭 제스처 인식기를 사용하면 쉽게 달성 할 수 있습니다.

  2. 사용자가 커버를 드래그 후 커버 또는 앞으로 이러한 접촉이 무시하면

    ; 이것들은 커버가없는 것처럼 아래의 레이어들에 의해 수신됩니다.

그래서 사용자는 표지 아래의 콘텐츠를 스크롤 할 수 있지만 표지 아래의 콘텐츠는 스크롤 할 수 없어야합니다. 키보드 및 텍스트 필드의 "외부"탭은 키보드 (및 커버)를 닫아야하지만 아무 것도 활성화하지 않아야합니다.

어떻게하면됩니까?

+0

터치 위임 메서드를 구현하고 스 와이프하기 위해 뷰 뒤에있는 뷰에 터치를 전달하는 것을 고려해야합니다. '- (void) touchesBegan : (NSSet *)은 withEvent : (UIEvent *) 이벤트를 터치합니다. { [otherView touchesBegan : touches withEvent : event]; } 또 다른 방법은 UIPanGestureRecognizer를 구현하고 cancelsTouchesInView = YES를 'UIPanGestureRecognizer * gr = [[UIPanGestureRecognizer alloc] initWithTarget : self action : @selector (handlePan)];으로 설정하는 것입니다. [gr setCancelsTouchesInView : 예]; [myButton addGestureRecognizer : gr]; [gr 출시]; ' – iDev

+1

@mjh, 혹시 이것에 대한 해결책을 찾았습니까? – kpozin

답변

0

1 :보기에 탭 제스처 인식기를 추가

2

//Adding tap gesture 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
    tapGesture.numberOfTapsRequired = 1; 
    [self.view addGestureRecognizer:tapGesture]; 
: handleTapGesture에서는 키보드

- (void)handleTapGesture:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateRecognized) { 
     //Resign first responder for keyboard here 
    } 
} 

정교 위의 대답에 약간의 resignFirstResponder. UIGestureRecognizerStateRecognized는 인식되는 단일 탭 이벤트인지 확인합니다.

이 기능은 나중에 어디에서 사용할 수 있습니까?

+0

그의 질문은 "사용자가 표지를 드래그하면 표지가 모든 터치를 무시하고 표지가없는 것처럼 레이어 아래에 수신됩니다." 그는 이미 접촉을 감지하는 방법을 알아 냈습니다. – iDev

+0

'UIView'가 탭을 인식 할 수 있으면 '.userInteractionEnabled'는'YES '여야하며 모든 터치 이벤트를 처리하므로 아래에있는 것으로 드래그를 인식하지 못합니다. – mjh

2

탭 제스처를 일반적인 방법으로 추가

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; 
[self.view addGestureRecognizer:tapGesture]; 

을하지만 당신이 찾고 될 수있다 이것이다 :

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    {  
     return YES; 
    } 

문서는 말한다 :이 방법은 하나에 의해 제스처의 경우 인식이라고 gestureRecognizer 또는 otherGestureRecognizer는 다른 제스처 인식기가 제스처를 인식하지 못하게합니다. (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate)

이렇게하면 완전히 투명하고 인식기가 호출되지 않도록 할 수 있습니다.

0

는 수신 모든 접촉을 전달하는 사용자 정의보기 :

class CustomView: UIView { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 

     var hitView = super.hitTest(point, withEvent: event) 

     if hitView == self { 
      return nil 
     } 

     return hitView 
    }  
} 

은 거기에서 당신은 단지 탭 동작을 활용하는 다양한 방법을 갈 수 있습니다. 닿은 UIEvent를 관찰하거나 제스처 인식기를 사용하십시오.