2011-03-04 7 views
0

작동하는 탭 막대 앱이 있습니다. 각 탭은 UINavigationController이며 루트보기는 UIViewController 인 경우가 많으며 UITableViewController 인 경우가 많습니다.터치 이벤트를 사용하지 않는 전체 화면 UIView 하위 클래스

일부 작업이 완료 될 때까지 무슨 일이 일어나고 있는지에 대한 메시지가있는 전체 화면 "베일"을 표시하려는 인스턴스가 있습니다. 요점은 작업 시작 지점에서 벗어날 UI의 모든 터치를 삼키는 것입니다.

베일은 UIView 하위 클래스입니다. 클래스의 싱글 톤 인스턴스가 하나 있습니다. 표시되면 UITabBarController보기의 하위보기로 삽입합니다. 보기가 포함 된 전체 UI, 탭 표시 줄에 나타납니다. 큰!

여기에 문제가 있습니다. 탭과 UI 변경 사항을 탭할 수 있습니다. 내가 예상했던 것은 베일의 견해가 그 감동을 삼킨 것일뿐입니다.

저는 베일 클래스에 {Began | Ended | Moved | Canceled} 메서드 (무방 방법)를 구현했지만 터치는 여전히 탭 막대에 의해 선택되고 솔직히 모든 객체에 의해 선택됩니다 언제든지 만날 수 있습니다.

나는 또한 nextResponder, hitTest : withEvent : 등등을 비롯한 여러 가지 다른 메소드를 무효화하려고 시도했습니다.

나는이 시점에서 다소 혼란 스럽다. 나는 누군가가 현자를 조언 해주기를 바라고있다. :-)

감사합니다.

답변

3

프레임 워크 클래스의 뷰 계층 구조를 수정하는 것은 안전하지 않습니다. 단순히 창 자체의 하위보기로 추가하는 것이 훨씬 더 효과적입니다. 이 변경을 적용해도 효과가 없다면보기에서 userInteractionEnabled이 YES로 설정되어 있는지 확인해야합니다. 실제로 터치 관련 메소드를 구현할 필요는 없습니다.

+0

@ Kevin-Ballard : 고마워요. 그래서 저는 베일을 베네치아 창문의 서브 뷰로 삽입하는 것과 같은 시각 효과를 얻었습니다. 그리고 베일의'userInteractionEnabled' 플래그가 YES로 설정됩니다. 터치 처리 메서드의 null 구현을 주석 처리했습니다. 접촉은 계속해서 기본보기로 전달됩니다. 다른 생각? –

+0

@MarkGranoff : null 구현을 그대로두면 실패한다고도 가정합니까? 창문에 그걸 넣었 니? 슈퍼 뷰에 UIGestureRecognizer가 있다면 당신의 행동에 대해 생각할 수있는 가장 큰 이유는 당신이 윈도우의 루트에 있다면 그렇다고 볼 수 없습니다. 제가 생각할 수있는 유일한 또 다른 것은 당신의 알파입니다. 보기에 '알파'속성을 설정 했습니까? 'alpha'가'0.05' 이하이면, 뷰를 건너 뜁니다. 그것은'1'로 설정되어야하며 뷰는 배경색이 없어야합니다. –

+0

@ Kevin-Ballard : 네, 구현이 null이거나없는 경우에도 동일한 동작입니다. 최소한 UIGestureRecognizers는 사용하고 있지 않습니다. alpha 속성이 설정되지만 0.65로 설정됩니다. 그래서 1로 설정하고 clearColor를 사용하여 어떤 일이 벌어지는지를 볼 수있었습니다. 여전히 실패합니다. 그런데보기에는 다음과 같은 코드가 삽입됩니다. [[myApp delegate] .window addSubview : [Veil theVeil]]'. 그것은 확실히 작동합니다 (나는 베일을 봅니다). 그리고 저는 그것을 "올바른 방법"으로 할 다른 방법을 생각할 수 없습니다. 정말 기괴한. –

1

나는 또한이 문제가있어서 해키 한 해결책을 찾았다. 사용자 정의 UIView 클래스의 init에서 히트 할 수없는 가짜 UIView를 만듭니다 (예 : [[UIView alloc] initWithFrame:CGRectMake(-1, -1, 0, 0)]). 또는 실제로, 모든 UIView 창에 연결된 생각합니다. 그런 다음 hitTest:withEvent:에 관심 분야가 아닌 모든 지점에 대해 더미보기를 반환하십시오.

관련 문제