English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

iOS UIButton 클릭 무응답 해결 방법

머리말

일상 개발에서 우리는 종종 버튼과 상호작용하지만, 때로는 버튼이 클릭 이벤트에 응답하지 않는 어려운 문제를 만날 수 있습니다. 이 경우 다음과 같은 면에서 조사해야 합니다;

버튼이 응답하지 않는 이유

1버튼이 사용자 인터랙션을 시작하지 않은 부모 뷰에 추가되었습니다. 예를 들어 UIImageView. 이 경우 부모 뷰의 인터랙션을 시작합니다. view.userInteractionEnabled = YES

YES로 설정하면 문제를 해결할 수 있습니다;

2버튼 자체가 가려져 있어 클릭할 때 button을 클릭한 것이 아니라 그 위의 레이어의 View를 클릭한 것입니다. 자연스럽게 응답하지 않습니다;

이곳에는 레이어를 확인하는 방법이 있습니다. 아래 그림에서 빨간 상자의 버튼을 클릭하면 현재 실행 인터페이스의 UI 요소를 볼 수 있습니다. view가 button을 가려줄지 확인할 수 있습니다;

3버튼의 frame이 부모 뷰의 frame을 벗어났습니다. 이는 가장 쉽게 발생할 수 있는 문제입니다. 버튼의 frame은 부모 뷰의 frame 내부에서 클릭해야 합니다. 아래 그림에서 버튼 클릭이 빨간 상자의 区域에 해당하지 않으면 응답하지 않습니다;

이 문제를 만나면 어떻게 합니까? 더 내려가서 확인해 보세요;

클릭 区域을 초과하는 문제를 해결합니다;

이런 상황은 매우 가능성이 높습니다. 제가 만난 예를 들어, 채팅 영역의 높이가 키보드의 높이보다 작고, 입력 텍스트 뷰가 채팅 영역의 자식 뷰라면 키보드가 펼쳐지면 입력 텍스트 뷰가 상승하고 부모 뷰의 frame을 벗어나면 그때 클릭할 때 빨간 상자의 버튼을 터치하여 감정 키보드 액션을 전환하는 응답이 없습니다;

해결 방법

이곳에는 두 가지 메서드가 있습니다. 터치 동작이 발생할 때마다 이 두 메서드를 호출합니다;

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

메서드를 재정의합니다; - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

이는 View 내의 메서드로, 처리 과정은 다음과 같습니다;

  • 먼저 현재 뷰의 pointInside:withEvent: 메서드를 호출하여 터치 포인트가 현재 뷰 내에 있는지 확인합니다;
  • NO를 반환하면 hitTest:withEvent:가 nil을 반환합니다;
  • YES를 반환하면 현재 뷰의 모든 자식 뷰(subviews)에 hitTest:withEvent: 메시지를 전송합니다. 모든 자식 뷰의 순회 순서는 top에서 bottom으로, 즉 subviews 배열의 마지막에서부터 앞으로 순회합니다. 자식 뷰 중 비어 있지 않은 객체가 반환되거나 모든 자식 뷰가 순회되면 그쳐집니다;
  • 첫 번째로 자식 뷰가 비어 있지 않은 객체를 반환하면 hitTest:withEvent: 메서드가 이 객체를 반환하고 처리가 끝납니다;
  • 모든 자식 뷰가 비를 반환하면, hitTest:withEvent: 메서드는 자신(self)을 반환합니다.
  • 마지막으로, 이 터치 이벤트는 메인 창의 hitTest:withEvent: 메서드가 반환한 뷰 객체에 의해 처리됩니다.

따라서 nil을 반환할 때 처리할 수 있습니다. 이때 button은 부모 View 외에 있습니다.

//이벤트에 응답하기 위해 view를 반환
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
 UIView *view = [super hitTest:point withEvent:event];
 if (view == nil){
  //좌표 변환
  CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self];
  //클릭한 점이 버튼 영역 내에 있는지 확인
  if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){
   //뒤로 가는 버튼
   return _testBtn;
  }
 }
 return view;
}

이제 区域 외에서 버튼을 클릭하면 반응이 나타납니다.

요약

위에 설명한 것은 편집자가 여러분께 소개한 iOS UIButton 클릭 무반응 문제 해결 방법입니다. 여러분이 어떤 질문이나 의문이 있으면, 댓글을 남겨 주시기 바랍니다. 편집자는 즉시 여러분의 질문에 답변드리겠습니다. 또한, 여러분의 지지에 깊이 감사드립니다.呐喊 교본에 대한 지지에 감사합니다!

선언: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 모두에게 있습니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공적인 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 있는 내용을 발견하면, 메일을 notice#w로 보내 주시기 바랍니다.3codebox.com(메일을 보내는 경우, #을 @으로 변경하여 신고하시고 관련 증거를 제공해 주세요. 일단 확인되면, 이 사이트는 즉시 위반된 내용을 삭제합니다.)

추천 합니다