当用户登陆页面时,我有一个相机类型的 UIImagePickerController。我已在 UIImagePickerController 顶部放置了一个自定义相机覆盖层,但没有触发任何按钮事件。我知道大部分代码都来自 Apple 基本代码,所以我对发生的事情感到困惑。
@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 事件发送到下面列出的 socket 功能。附加到按钮的 TakePhotoViewController 中的代码如下,其中没有日志被触发:
- (IBAction)outlet:(id)sender {
NSLog(@"outlet");
}
最佳答案
问题出在这一行:
self.overlayView.frame = self.cameraOverlayView.frame;
我们的cameraOverlayView
为零;它没有框架,因为它还不存在。所以我们给overlayView一个零帧。它是无量纲的。该按钮出现,但它的 super View 大小为零,因此无法点击。
现在,您可能会问,这是为什么?这是因为 iOS 中触摸传递的工作方式。为了可触摸, subview 的父 View 也必须是可触摸的,因为父 View 在 subview 之前进行了触摸测试。但是零尺寸 View 是不可触摸的:您的触摸错过了overlayView,因此它也错过了按钮。
解决方案可能就像为 overlayView
提供一个合理的真实框架一样简单。当您这样做时,也可能会出现计时问题(例如,在图像选择器即将出现之前,您可能无法真正设置框架 - viewWillAppear :
),但无论如何,这是开始的地方。
关于ios - UIImagePickerController 覆盖按钮未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162857/