【问题标题】:UIImagePickerController Overlay Buttons Not FiringUIImagePickerController 覆盖按钮未触发
【发布时间】:2014-03-04 04:21:45
【问题描述】:

当用户登陆页面时,我有一个相机类型的 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 事件发送到下面列出的出口函数。附加到按钮的 TakePhotoViewController 中的代码如下,其中没有任何日志被触发:

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

【问题讨论】:

  • 将按钮与此目标和此操作方法挂钩的代码在哪里?
  • 我已将按钮从 CameraOverlay 控制拖动到此操作方法。在出口方法旁边,圆圈被填充,上面写着“CameraOverlay.xib - 出口按钮测试”
  • 尽管如此,我还是持怀疑态度。毕竟,您自己说过outlet 方法没有触发。我敦促你在代码中形成这个动作连接——在你说self.cameraOverlayView = self.overlayView;之后,在按钮上调用addTarget:action:forControlEvents:,形成连接。
  • 嗯。我必须在这里缺少更大的东西,因为那也不起作用。 [self.takePhotoButton addTarget:self action:@selector(outlet:) forControlEvents:UIControlEventTouchUpInside];而 takePhotoButton 是在 CameraOverlay.xib 中定义的。当我单击方法旁边的黑色实心按钮旁边时,它甚至会将我带到 CameraOverlay 中的按钮。
  • self.takePhotoButton 本身是否可能在该代码中为零?添加NSLog查看...

标签: ios iphone uiimagepickercontroller


【解决方案1】:

问题出在这一行:

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

我们的cameraOverlayView 为零;它没有框架,因为它甚至还不存在。所以我们给overlayView 一个零帧。它是无量纲的。该按钮出现,但它的超级视图大小为零,因此无法点击。

现在,您可能会问,这是为什么呢?这是因为触摸交付在 iOS 中的工作方式。为了可触摸,子视图的父视图也必须是可触摸的,因为父视图在子视图之前进行了触摸测试。但是零尺寸的视图是不可触摸的:你的触摸错过了overlayView,所以它也错过了按钮。

解决方案可能就像给overlayView 一个合理的真实框架一样简单。 可能存在关于何时你这样做的时间问题(例如,在图像选择器即将出现之前,你可能无法真正设置框架 - viewWillAppear:) ,但无论如何这是开始的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2021-07-08
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多