2011-10-16 4 views
6

며칠 전 iPad를 5.0으로 업그레이드하고 Xcode를 4.2로 업그레이드하여 동시에 내 앱을 테스트 할 수있었습니다. 이제 이전 버전의 Xcode에서 작동했던 여러 앱에서 터치 코드에 문제가 있습니다.UIView 터치 처리 동작이 Xcode 4.2에서 변경 되었습니까?

-(void)TouchesBegan-(void)TouchesMoved을 재정 의하여 일부 끌기 기능을 추가하려면 UIImageView를 서브 클래스로 만들었습니다. 이 아니며 하위 클래스에서는 -(void)TouchesEnded이지만 이미지보기가 포함 된보기의보기 컨트롤러에서 처리했습니다.

나는 테스트를 위해 새로운 프로젝트로 서브 클래 싱 UIImageView을 뽑아, 그리고 사실에 문제를 좁혀 그 부모 UIView 뷰 컨트롤러에 전달 터치 이벤트 될 것 같지 않습니다 (엑스 코드에 의해 생성 된 템플릿) (또한 Xcode에서 생성).

내 서브 클래스에이를 추가하는 경우 :

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 

을이 내 부모 뷰의 뷰 컨트롤러 :

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ViewController"); 
} 

나는 내가 화면을 드래그하고있는 이미지 가자, I "touches ended event in ImageToDrag"을 얻되 뷰 컨트롤러의 로그는 가져 오지 마십시오. 내가 의도적으로 서브 클래 싱 된 뷰에서이 작업을 수행하여보기를 건너 뛸 경우

그러나 :

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event]; 
} 

는 둘 다 로그 항목을 얻을.

내가 설명 할 수있는 유일한 이유는 UIViewtouchesEnded 이벤트를 소비하고이를보기 컨트롤러에 전달하지 않는다는 것입니다.

내가 exclusiveTouchNO로 설정되어 있는지 확인한

userInteractionEnabled는 부모 뷰에 YES로 설정하고이 UIImageView를 서브 클래스입니다.

또한 iOS 5.0 및 iOS 4.2 용 컴파일을 테스트하고 iOS 5 iPad 및 iOS 4.3.1 iPad에 테스트 응용 프로그램을 배포했습니다.

터치 이벤트를 viewController으로 가져올 수있는 유일한 방법은 뷰를 건너 뛰고 서브 클래스에서 double nextResponder을 사용하는 것입니다. 그 방법이 기능을하지만, 그것은 나에게 해킹처럼 보이고 나중에 나에게 물지 않기 위해 다시 올 것이라고 확신한다.

이 동작을 본 사람이 있습니까? UIView이 (가) 터치 이벤트로 무엇을하는지 찾을 수있는 방법이 있습니까?

덕분에, 댄

답변

5

저는 지난 몇 시간 동안 유사한 문제를 추적하려고했습니다. 마지막으로 나는 단지 그것을 해결하기 위해 관리 같은 사실은 이전 https://devforums.apple.com/message/519690#519690
에서 힌트를 사용하여, 보이는 this post

의 도움으로 그것을 해결하기 위해 관리, 난 그냥 self.nextResponder에 touchesEnded 이벤트를 전달. touchesBegan, Moved, touchesEnded와 같은 구현이 인 취소 된 처리기를 추가하면 이벤트가 뿌리보기 컨트롤러에 맞춰져 보입니다.
그래서 iOS5에서 관련 touchesBegan을 보지 못한 경우보기 touchesEnded 이벤트 을 무시합니다.

Moved/etc를 추가 할 필요가 없습니다. TouchesBegan을 전달한 후 TouchesEnded가 다시 시작됩니다.

+0

이것은 트릭을 만들었습니다. 핵심은 내가 이벤트를 처리 한 후 슈퍼 뷰로 이벤트를 전달해야한다는 것이 었습니다. 한 가지 다른 참고 사항은 작동 시키려면 "self.nextResponder"대신 "super"를 사용해야한다는 것입니다. – dlenhard

+0

이 답변을 해주셔서 감사합니다. 이것에 내 머리카락을 찢어 버리고 있었다. –

2

일부 터치 처리는 아이폰 OS 5.0에서 기회를했다; 특히 응용 프로그램을 5.0 SDK에 다시 링크하는 경우

는 (일반적인 사용 패턴) 경우에만, 당신은 또한, 터치 이벤트를 처리하기위한 다른 방법을 오버라이드 (override) 할 필요가 슈퍼를 호출하지 않고이 메소드를 오버라이드 (override)하는 경우 :이 말한다 섹션의 UIView의 터치 처리 방법이있다

스텁 (empy) 구현으로.

그렇다면 모든 작업을 수행해야합니다. UIKit이 5.0의 경우인지 확인하기위한 조치를 취하기 시작했습니다.

그래서 저는 거기에서 시작할 것입니다. 여러분의 관점에서 모든 방법을 오버라이드하고 어떤 일이 일어나는 지보십시오.

+0

나는 touchesBegan을 무시하고 서브 클래스에서 touchesMoved ...하지만 touchesCancelled. 내가 그것을 지워지는지 지켜 볼 것입니다. – dlenhard

+0

뷰에서 touchesCancelled를 재정의하려고 시도했지만 double nextResponder를 사용하지 않으면 여전히 작동하지 않습니다. – dlenhard