2012-10-19 2 views
0

UIView 하위 클래스가 있는데, PopupView를 호출 할 수 있습니다. 이 PopupView 안에는 사용자 정의 uiview와 uibutton이있는 NavigationBar가 있고 (2)이 있습니다. 또한 UIButton (1)이 PopupView 내부에 있습니다. 내가있는 UIButton에 backgroundimages에 대한 capinsets를 사용 아니지만 uibarbuttonitem에 대한 수 있기 때문에프레임 크기 재조정 후 uiviews 버튼의 사용자 동작이 비활성화되었습니다.

PopupView 
    - UIButton (1) 
    - UINavigationBar 
    - UINavigationItem 
     - UIBarButtonItem 
     - UIView 
      - UIButton (2) 

uinavigationbar의 crazyness이있는 UIButton의 이유입니다.

내 문제 :

내가 PopupView 애니메이션이 완료된 후 UIView의 애니메이션과 를 사용하여 크기를 조정, 나는이있는 UIView에 더 이상을 버튼을 클릭 드릴 수 없습니다.

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationCurveEaseOut animations:^{ 
     CGRect popupFrame = self.frame; 
     popupFrame.size.height += 140.0f; 
     popupFrame.origin.y = floorf(popupFrame.origin.y - (140.0f/2)); 
     self.frame = popupFrame; 
    } completion:^(BOOL finished) { 
}]; 

이것은 내가 uiview 애니메이션을 사용하지 않고 새 프레임을 직접 설정하는 경우에도 발생합니다. 또한 그것은 내가 클릭하거나 직접 viewDidLoad viewController 그것에 크기를 조정할 경우 중요하지 않습니다.

왜 그런가?

+1

앱을 실행하고 버튼이 응답하지 않는 상태로 만듭니다.그런 다음 디버거에서 멈추고 다음 명령을 실행하십시오 :'po [[UIApp keyWindow] recursiveDescription]'. 결과를 복사하여 게시물에 붙여 넣으십시오. –

+0

안녕하세요. https://gist.github.com/d9f7bb875be6590b315a를 참조하십시오. 내가 말하는 PopupView는 GIST의 하단에있는 'MoviePopupView'라고합니다. – choise

답변

4

히어의 당신의 recursiveDescription 출력의 관련 부분 :

| | <UIView: 0xaac0480; frame = (0 0; 320 568); tag = 23945; layer = <CALayer: 0xaac04e0>> 
| | | <MJPopupBackgroundView: 0xaac0710; frame = (0 0; 320 568); tag = 23943; layer = <CALayer: 0xaac07c0>> 
| | | <UIButton: 0xaac0aa0; frame = (0 0; 320 568); opaque = NO; layer = <CALayer: 0xaac0b60>> 
| | | <UIView: 0x9d6fea0; frame = (10 204; 300 160); autoresize = W+H; tag = 23942; layer = <CALayer: 0x9d6ff50>> 
| | | | <MoviePopupView: 0xab1aaa0; frame = (0 -70; 300 300); clipsToBounds = YES; layer = <CALayer: 0xab1a070>> 

는 0xaac보기 화면을 다룹니다.

0xaac보기 내에서 0x9d6보기의 높이는 160 포인트이며 0xaac보기에서 세로 가운데에 위치합니다.

0x9d6보기 내에서 0xab1 MoviePopupView의 높이는 300 포인트이며 Y 출처가 -70 인 경우 0x9d6보기의 가운데에 있지만 0x9d6보기의 위쪽 및 아래쪽 가장자리를 지나칠 수 있습니다.

clipsToBounds 속성의 기본값은 NO이므로 0x9d6보기는 해당 0xab1 하위보기의 내용을 시각적으로 클립하지 않습니다. 따라서 버튼은 여전히 ​​화면에 표시됩니다.

그러나 히트 테스트는 항상보기의 경계까지 클립합니다. 따라서 버튼 중 하나를 터치하려고하면 조회수는 0x9d6보기 (160 포인트 만)의 범위를 벗어납니다. 0x9d6보기는 터치가 MoviePopupView 또는 그 아래 버튼에 도착하기 전에 터치를 거부합니다.

이것은 hitTest:withEvent: documentation에서 언급 : 실제로 수신기의 파단 중 하나 내에있는 경우에도 안타 수신기의 경계가보고되지 않습니다 외부에있는

포인트. 현재보기의 clipsToBounds 속성이 NO으로 설정되고 영향을받는 하위보기가보기의 범위를 벗어나는 경우 발생할 수 있습니다.

+0

이 못 박았습니다. 정말 고맙습니다. 'recursiveDescription'을 더 사용해야합니다. 시뮬레이터에 대한 웹킷 관리자와 같은 관리자를보고 싶습니다 :) – choise

+0

sweet !!! 유사한 상황에 갇혔다. 조회 너비와 높이가 필요한 것보다 적게 설정되었지만보기가 완전히 보입니다. 'clipsToBounds'를'YES'로 설정 한 후에 프레임 값이 벗어난 것을 깨달았습니다. 고맙습니다 ! – GoodSp33d

0

우리는 버튼의 위치를 ​​볼 수 없기 때문에 확실하게 말할 수는 없지만 버튼이 포함 된 배경색을 UIView에 주거나 (또는 ​​하위보기를 자르기로 설정 한 경우) 크기를 조절하면 단추가 프레임 외부에있게되어 클립을 쉽게 끊을 수 있습니다.

+0

나는 그것들을 볼 수있다, 나는 그들을 클릭 할 수 없다. – choise

+0

아 나는 이제 이해한다. 보기 안쪽에있는 것처럼 보이지만 클리핑은 여전히 ​​변경되지 않습니다. – choise

+0

예, 뷰가 하위 뷰를 클립하도록 설정되지 않은 경우 프레임 외부에 있어도 볼 수 있습니다. –

관련 문제