2

我正在编写一个允许用户使用 UIImagePickerController 拍照的应用程序。

我使用自己的按钮栏和在 imagePicker 视图上添加的一些其他按钮/选项(视图)自定义了 UIImagePicker。以下是相关代码:

self.photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.photoPicker.allowsEditing = NO;
self.photoPicker.showsCameraControls = NO;

[self.photoPicker.view addSubview:topButtonView];
[self.photoPicker.view addSubview:topButtonView2];

除了一个问题外,一切都按预期工作。我首先针对 iOS 4 及更高版本的这个应用程序,我需要具备的功能之一是嵌入在 UIImagePickerController 中的点击对焦功能。这是问题所在。在 iOS 4 上,当用户点击实时视图时,会获得(由选取器控制器自动呈现)一个视觉指示器(方形),显示相机正在对焦和调整曝光的点。在 iOS 5 和 6 上,视觉指示器消失了。功能(点击聚焦)仍然存在,但不再向用户显示设置焦点的位置。

我已经搜索并阅读了几个类似的问题(但不完全),答案通常指向在 UIImagePicker 实时视图上添加透明子视图并捕获触摸事件。这很容易,但问题是,在我捕捉到用户的触摸之后,我发现没有办法将该触摸传递给 UIImagePicker liveView。

我试图创建一个自定义视图类来添加 de imagepicker 视图,但无法使其工作。这是自定义类代码:

@interface touchGrabberViewController : UIViewController 
<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

{
CGPoint tapPoint;
__unsafe_unretained IBOutlet UIImageView *tapFocusIndicator;
NSTimer *indicatorDismisser;

}

@property (unsafe_unretained, nonatomic) UIImagePickerController *photoPicker;

@end



@implementation touchGrabberViewController

@synthesize photoPicker;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    tapFocusIndicator.hidden = YES;
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    return photoPicker.view;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = touches.anyObject;

   tapPoint = [touch locationInView:self.view];
    [self showTapFocusIndicator];

    [super touchesBegan:touches withEvent:event];
}


- (void)showTapFocusIndicator
{

    if (!indicatorDismisser)
    {
        tapFocusIndicator.center = tapPoint;

        tapFocusIndicator.hidden = NO;

        indicatorDismisser = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                           target:self
                                                         selector:@selector(hideTapFocusIndicatorWithTimer:)
                                                         userInfo:nil
                                                          repeats:NO];
    }

}

- (void)hideTapFocusIndicatorWithTimer:(NSTimer *)timer
{
    tapFocusIndicator.alpha = 1.0;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelay:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(resetTapFocusIndicator)];
    tapFocusIndicator.alpha = 0.0;

    [UIView commitAnimations];

    [indicatorDismisser invalidate];
    indicatorDismisser = nil;
}

- (void)resetTapFocusIndicator
{
    tapFocusIndicator.hidden = YES;
    tapFocusIndicator.alpha = 1.0;
}

在这个类中,当用户点击时,我会看到一个非常相似的视觉指示器,但是用户的触摸永远不会被转发回实时视图,因此失去了焦点功能。

最近我决定放弃 iOS 4,只针对版本 5 和 6,但我错过了那个视觉指示器。作为相机应用程序用户,该指标非常有用。

我一直在用 (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 尝试替代方案,但没有运气。

任何人都知道如何实现这一目标,或者我做错了什么?

谢谢你。

4

0 回答 0