2011-09-12 5 views
1

기본 UITextField보기 및 제출 단추가 있습니다. 사용자가 UITextField를 탭하면 키보드가 나타납니다. 유용한 비트가 키보드에 의해 막히지 않도록 키보드보기가 바뀌고 키보드가 사라지면 키보드 쇼/숨기기 알림에 등록 된 항목이 다시 아래로 이동합니다.UITapGestureRecognizer 탭 위치 불황

사용자가보기에서 아무 곳이나 눌러서 키보드를 버리 길 원합니다. 그래서 UITapGestureRecognizer를 추가하고 텍스트 필드에 resignFirstResponder를 호출합니다. 훌륭한 작품들 .... 대부분.

"제출"버튼을 누르면 작동하지 않습니다. 그건 취소가 아니에요 .TouchInInView, 그걸 NO로 설정했습니다. 그것은 움직이는 관점입니다. "탭"은 포스트 시프트 다운 뷰에 등록됩니다. 따라서 뷰를 80 포인트 아래로 슬라이드 시키면 사용자가 "버튼 위에"만든 탭이 버튼 위의 80 포인트가됩니다.

제스처 인식기 이벤트가 발생하기 전에이 탭을 통과시켜 뷰가 이동하게하려면 어떻게해야합니까?

답변

3

나를 위해 가장 잘 맞는 수정 프로그램을 발견했습니다.

UIGestureRecognizerDelegate에는 제스처 인식기가 터치를 수락해야하는지 여부를 선택할 수있는 – gestureRecognizer:shouldReceiveTouch: 메서드가 있습니다. 탭은 UIControl 객체의 하위 클래스입니다 아무것도 일어난 경우

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     if ([touch.view isKindOfClass:[UIControl class]]) 
      return NO; 
     return YES; 
    } 

본질적으로, 그렇지 않으면 내 제스처 인식기를 얻을, 그 객체가 클릭을 처리 할 수 ​​있습니다.

1

보기가 UIControl을 사용하여 단추처럼 동작하도록하려면 UIButton 이벤트처럼 작동하고 UIView의 하위 클래스이므로보기를 탭하고 키보드를 닫을 때 touchUpInside 이벤트를 추가하고 키보드를 닫을 수도 있습니다 사용자가 제출 버튼을 탭하면 트릭을해야합니다. 희망이 도움이

1

나는 많은 애플 리케이션에서 동일한 기능을 사용합니다. GestureRecognizer를 사용하는 대신 UIView 대신 내보기를 UIControl으로 설정했습니다. UIView을 사용하여 수행 할 작업을 계속 수행 할 수 있지만보기와 상호 작용할 때 수행 할 IBActions를 할당 할 수도 있습니다.

다음과 같이하십시오. Interface Builder에서보기를 선택하십시오. 그런 다음 해당 클래스를 UIControl에 할당하십시오. (현재 UIView으로 설정되어 있습니다.)

해당 뷰의 ViewController에서 backgroundAccess 메소드를 작성하여 backgroundTaps를 감지하십시오. 광산은 다음과 같습니다

- (IBAction)backgroundTap:(id)sender 
{ 
    if ([textField1 isEditing]) { 
     [textField1 resignFirstResponder]; 
    } else if ([textField2 isEditing]) { 
     [textField2 resignFirstResponder]; 
    } 
} 

을 마지막으로, 인터페이스 빌더에서, 당신은 UIControl로 만든 IBAction를 연결합니다.

+0

이것은 매우 우아한 해결책입니다. 내 유일한 관심사는 UIControl 이외의 개체에 대한 탭만 등록한다는 것입니다. 다른 컨트롤을 탭하면 현재 컨트롤 (예 : UITextField)에서 자동으로 활성 상태가됩니다. 나는 그것을 시도해 보겠다. – DBD

+0

잘 작동했지만, 페이지에 여러 개의 하위보기 (많은 동적)가 있고 작업을 모두 설정하는 것이 엉망이된다. 일부는 User Interaction Enabled = NO로 설정할 수 있었지만 다른 사용자에게는 컨트롤이있어 옵션이 아닙니다. 따라서 이것이 훌륭한 대답 인 반면,이 경우에는 효과가 없을 것입니다. – DBD