2015-01-16 1 views
0

메인 화면에 하위보기 컨트롤러로 UINavigationController을 추가 한 iOS 앱이 있습니다. 수직으로 배치되어 탐색 컨트롤러가 주 뷰의 높이의 하단 부분을 차지하고 전체 너비입니다. 숨기기 및 표시하는 데 사용되는 nav 바로 위에있는 버튼 (실제로는 탭 인식기가있는 사용자 정의보기)이 있습니다. 탐색이 숨겨져있을 때 버튼은 기본 화면의 맨 아래에 있으며 탐색이 표시되면 버튼이 탐색 막대의 상단 바로 위에 있습니다.VC 포함의 UINavigationController 탭 영역 문제

문제는 네비게이션 바가 버튼의 아래쪽 10 점을 터치하는 것을 가로 채는 것처럼 보입니다. 왜 이런거야? 아이를 추가 할 수

코드는 다음과 같습니다

UIViewController *root = [[[UIViewController alloc]init]autorelease]; //some VC 
UINavigationController *nav = [[[UINavigationController alloc]initWithRootViewController:root]autorelease]; 
[self addChildViewController:nav]; 
CGRect rect = self.view.frame; 
CGFloat height = 500; 
nav.view.frame = CGRectMake(0, rect.size.height - height, rect.size.width, height); 
[self.view addSubview:nav.view]; 
[nav didMoveToParentViewController:self]; 

//Now the button 
UIView *view = [[[UIView alloc]initWithFrame:CGRectZero]autorelease]; 
view.backgroundColor = [UIColor greenColor]; 
[self.view addSubview:view]; 
view.frame = CGRectMake(0, rect.size.height - 500 - 40, rect.size.width, 40); 
UITapGestureRecognizer *recog = [[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(onToggleSplit)]autorelease]; 
[view addGestureRecognizer:recog]; 

onToggleSplit는 위아래로 탐색을 애니메이션. 그것이 끝나면, "버튼"의 바닥 10 점 정도의 도청은 아무 것도하지 않습니다. 내 사용자 정의 "버튼"보기에서 touchesBegan을 무시하려고 시도했지만 호출되지 않았습니다.

자식 VC에 일반 UIViewController (또는 하위 클래스)을 사용하는 경우 단추가 예상대로 응답합니다.

+0

'nav.view'의 색상을 지정할 때 버튼과 겹치지 않습니까? –

+0

@IanMacDonald no. –

답변

0

이 질문에 답변했으며 here입니다. 기본적으로 iOS의 컨트롤에는 사용자의 부분에 부주의 한 터치 정확도를 허용하도록 설계된 "슬롭 영역"이 있습니다. 이것이 컨트롤의 뷰 컨트롤러 바운드 바깥에 도달해서는 안되는 버그에 대해 설명 할 것입니다.

업데이트 : 내 레이더가 열려 8,088,542의 중복으로 표시되었습니다 : 레이더 19504573.

업데이트 2로 제기했다. 또한 제 경우는 다소 단순합니다 (탐색 모음 상단에있는 하나의보기). 그래서이 문제를 극복 할 수있었습니다. 나는 hitTest:withEvent:을 무시하고 탭이 발생하면 두 번 호출된다는 사실에 주목했습니다. 처음에는 터치 좌표가 예상대로이며 super을 호출하면 예상 한 뷰가 반환됩니다. 두 번째는 이벤트에 동일한 timestamp 값을 갖지만 y 좌표는 더 높고 (화면의 아래쪽에 있음) super은 탐색 모음을 반환합니다. 따라서 :

  • 하위 클래스 UIView을 입력하고 viewToWatch 속성을 추가하십시오.
  • 주보기 컨트롤러의 nib/스토리 보드에서보기 클래스를 내 하위보기로 설정하십시오.
  • 내 메인보기 컨트롤러에서 viewDidLoad보기를 움켜 잡고 캐스팅하고 터치 이벤트가 채워지는보기로 viewToWatch을 설정하십시오.
  • 사용자 지정보기에서 NSTimeInterval lastTimestampBOOL isInView의 두 가지 개인 속성을 정의하십시오.
  • 덮어 쓰기 hitTest:withEvent:. 수퍼 전화를 걸면 viewToWatch이 표시되고 lastTimestamp을 이벤트 스탬프로 설정하고 isInViewYES으로 설정합니다. 그렇지 않고 super이 탐색 표시 줄을 반환하는 경우 이벤트의 스탬프가 일치하고 isInView이 여전히 YES 인 경우 두 속성을 모두 다시 설정하고 viewToWatch을 반환합니다.

지금까지 작동 중입니다.