2014-03-04 3 views
1

사용자가 페이지에 착륙 할 때 카메라 유형의 UIImagePickerController가 있습니다. UIImagePickerController 위에 맞춤형 카메라 오버레이를 넣었지만 버튼 이벤트 중 아무 것도 실행되지 않습니다. 이 코드의 대부분은 기본 Apple 코드에서 가져온 것이라는 것을 알고 있으므로 어떤 일이 일어나고 있는지 당황 스럽습니다.UIImagePickerController 오버레이 단추가 실행되지 않음

@interface TakePhotoViewController : UIImagePickerController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 
... 

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType 
{ 
if (self.capturedImages.count > 0) 
{ 
    [self.capturedImages removeAllObjects]; 
} 

self.sourceType = sourceType; 
self.delegate = self; 

if (sourceType == UIImagePickerControllerSourceTypeCamera) 
{ 
    /* 
    The user wants to use the camera interface. Set up our custom overlay view for the camera. 
    */ 
    self.showsCameraControls = NO; 

    /* 
    Load the overlay view from the OverlayView nib file. Self is the File's Owner for the nib file, so the overlayView outlet is set to the main view in the nib. Pass that view to the image picker controller to use as its overlay view, and set self's reference to the view to nil. 
    */ 
    [[NSBundle mainBundle] loadNibNamed:@"CameraOverlay" owner:self options:nil]; 
    float scale = [self getScaleForFullScreen]; 
    self.cameraViewTransform = CGAffineTransformMakeScale(scale, scale); 
    self.overlayView.frame = self.cameraOverlayView.frame; 
    self.cameraOverlayView = self.overlayView; 
    self.overlayView = nil; 
} 

}

CameraOverlay의 소유자는 TakePhotoViewController입니다. CameraOverlay 내부의 버튼 중 하나는 Touch Up Inside 이벤트를 아래 나열된 출력 함수로 보냅니다.

- (IBAction)outlet:(id)sender { 
NSLog(@"outlet"); 
} 
+1

버튼을이 대상과이 동작 방법에 연결하는 코드는 어디에 있습니까? – matt

+0

저는 CameraOverlay에서이 액션 메소드로 컨트롤을 드래그했습니다. 콘센트 메서드 옆에 원이 채워지고 "CameraOverlay.xib - 콘센트 단추 테스트" –

+0

그럼에도 회의적입니다. 결국, 당신은 자신이'outlet' 메소드가 실행되지 않는다고 말했습니다. 나는 당신이 코드에서이 액션 연결을 형성 할 것을 촉구한다. - 당신이'self.cameraOverlayView = self.overlayView;'라고 말한 후, 단추에'addTarget : action : forControlEvents :'를 호출하여 연결을 형성한다. – matt

답변

4

문제는이 라인 : 버튼에 부착 된 TakePhotoViewController의 코드는있는 더 로그는 발사되지 않으며, 다음과 같습니다

self.overlayView.frame = self.cameraOverlayView.frame; 

우리 cameraOverlayView이 전무하다; 아직 존재하지 않기 때문에 프레임이 없습니다. 따라서 우리는 overlayView에 제로 프레임을 제공합니다. 그것은 무 차원이다. 버튼이 나타나지만 제로 크기의 수퍼 뷰가 있으므로 탭 할 수 없습니다.

이제 왜 그런지 물어볼 수 있습니다. iOS에서 터치 전송 방식이 작동하기 때문입니다. 터치 할 수 있으려면 하위보기의 수퍼 뷰를 터치 할 수 있어야합니다. 수퍼 뷰는 하위보기 이전의 터치에 대해 적중 테스트를 거쳐야하기 때문입니다. 하지만 크기가 0 인보기는 터치 할 수 없습니다. 터치하면 overlayView이 누락되어 버튼도 누락됩니다.

솔루션은 overlayView에 합리적인 실제 프레임을 제공하는 것처럼 간단 할 수 있습니다. 일 수 있습니다. 일 때 일 때 타이밍 문제가 발생할 수 있습니다 (예 : 이미지 선택기가 나타날 때까지 실제로 프레임을 설정할 수 없음 - viewWillAppear:).이 경우 시작하는 곳입니다.

관련 문제