2010-11-28 2 views
0

두 가지보기가 있는데, 기본보기에서는 애니메이션을 수행하는 데 CALayers를 사용하고 있습니다. 이 메인 레이어는 터치 이벤트 touchesBegan, touchesMoved 및 touchesEnded를 처리합니다.보기 전환 후 감동을 무시하는 방법?

두 번째보기는 자신 만의 코코아 콩이 있고 앱 지침이 포함 된 정보보기입니다. 때 사용자를 두 번 탭 내가 제자리로 정보보기를 뒤집어 주 화면에서 버튼 ... 사용자가 내가 가진 제자리로 기본보기를 뒤집어 정보보기 버튼을 탭

if (infoView == nil) { 
    NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"InfoView" owner:self options:nil]; 
    infoView = [ nibViews objectAtIndex: 0]; 
    [infoView retain]; 
} 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:1.0]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[self view] cache:YES]; 
[[self view] addSubview:infoView]; 
[UIView commitAnimations]; 

.. .

[UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[self view] cache:YES]; 
    [infoView removeFromSuperview]; 
    [UIView commitAnimations]; 

난 데 문제는 내가 정보보기에있을 때, 터치는 여전히 기본보기가 수신되고 있다는 것입니다 (보기에서 이성을 상실되었다). 정보보기의 단추 및 텍스트 필드가 접촉에 적절하게 응답합니다.

정보보기가 제 위치에 반전되었을 때 기본보기에서 터치 이벤트를 수신하지 못하게하려면 어떻게해야합니까?

업데이트 : 내 문제가 해결 된 것으로 보입니다. 그러나이 과정에서 새로운 문제가 발생했습니다. 내가 뭘하려고 하나의 UIViewController 두 UIVIews를 관리하는 것입니다. 내가 가진 문제는 메인 뷰 컨트롤러가 메인 뷰를로드했고 뷰를 전환 할 때 정보 뷰를 메인 뷰의 서브 뷰로 추가했습니다. 이 계층 구조는 보이는 정보보기에서 사용되지 않은 터치가 기본보기로 전달되는 것 같습니다.

주보기 컨트롤러가 컨테이너보기를로드하도록하여이 문제를 해결했습니다. 그런 다음 기본보기가 컨테이너보기의 하위보기로로드되었습니다. 정보보기에서 뒤집 으면 컨테이너보기의 하위보기로 추가했습니다. 정보보기에서 발생하는 사용하지 않은 접촉은 이제 컨테이너보기로 전달되고 기본보기에는 표시되지 않습니다.

하지만 새로운 문제가 생겼습니다. 기본보기가 표시되면보기의 위쪽 부분에서만 터치 다운 이벤트를받습니다. 나는보기의 위쪽 부분에서 터치 다운하고 아래쪽 부분으로 끌고 touchmoved 및 touchended 이벤트를받을 수 있습니다. 나는 아래 부분에서 터치 다운 이벤트를 얻지 못한다.

도움을 주시면 감사하겠습니다.

답변

0

대신 presentModalViewController : animated :를 사용하여 두 번째보기를 표시하는 것이 좋습니다. 새로운 뷰 컨트롤러가 첫 번째 응답자가되고 모든 터치를 자동으로 처리하므로 반전 효과를 얻을 수 있으며 터치로 문제가 발생하지 않습니다.

MyInfoViewController* infoView = [[MyInfoViewController alloc] initWithNibName:@"MyInfoViewController" bundle:nil]; 
infoView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:infoView animated:YES]; 
쉽게에서 [self dismissModalViewController];를 호출하여 당신은 뷰 컨트롤러를 닫 엑스 코드의 새 파일 명령 (A UIViewController 하위를 확인하고 "사용 펜촉을"확인)

를 사용하여이 새로운 뷰 컨트롤러와 펜촉 파일을 만들 수 있습니다

당신의 메인 뷰 컨트롤러.

사용자가 정보보기 컨트롤러에서 주보기 컨트롤러에 알림을 보내려는 것을 알리려면 두 가지보기 컨트롤러간에 일정 유형의 알림 또는 위임 프로토콜을 설정해야합니다.

xcode의 유틸리티 유형 응용 프로그램에 대한 템플릿 프로젝트에서이 정확한 예제를 볼 수 있습니다.

+0

물론, 지금까지 해 왔던 방식대로하면 BOOL infoViewOnScreen을 설정 한 다음 화면에 표시된 경우 터치하지 않아도됩니다. 그러나 위의 "올바른"방법을 제안합니다. 그것은 훨씬 더 고급 스럽습니다. –

+0

빠른 답장을 보내 주셔서 감사합니다. 불행히도, 현재 구현은 하나의 뷰 컨트롤러와 앞뒤로 뒤집힌 두 개의 UIView입니다. 제공 한 코드 캡처에는 infoView가보기 컨트롤러 여야합니다. UIView에서 UIViewController로 infoView를 변환 할 수있을 것 같습니다. 가능한 솔루션으로 보겠습니다. – Bill

+0

그래, 약간의 변화가 필요하지만 그렇게 많이는 아니야 ... infoView를 UIView로 유지하면서 뷰를 제어하는 ​​UIViewController를 만들 수 있습니다. 이것은 당신이하고 싶은 MVC입니다. :) –

0

터치 이벤트를받는 동안 뷰 계층 구조를 검사 한 다음이 터치를 받거나 그냥 버리는 것이 좋은지 평가할 수 있다고 생각합니다.