我正在编写一个允许用户使用 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 尝试替代方案,但没有运气。
任何人都知道如何实现这一目标,或者我做错了什么?
谢谢你。