UIImagePickerController を使用して、ユーザーが写真を撮れるようにするアプリを作成しています。
UIImagePicker をカスタマイズして、独自のボタン バーと他のいくつかのボタン/オプション (ビュー) を imagePicker ビューに追加しました。関連するコードは次のとおりです。
self.photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.photoPicker.allowsEditing = NO;
self.photoPicker.showsCameraControls = NO;
[self.photoPicker.view addSubview:topButtonView];
[self.photoPicker.view addSubview:topButtonView2];
1 つの問題を除いて、すべてが期待どおりに機能しています。まず、このアプリの iOS 4 以降をターゲットにしました。必要な機能の 1 つは、UIImagePickerController に組み込まれているタップしてフォーカスする機能です。これが問題です。iOS 4 では、ユーザーがライブ ビューをタップすると、(ピッカー コントローラーによって自動的に表示される) カメラが焦点を合わせて露出を調整しているポイントを示す視覚的なインジケーター (正方形) を取得します。iOS 5 および 6 では、その視覚的なインジケーターはなくなりました。機能 (タップしてフォーカス) はまだありますが、フォーカス ポイントが設定されている場所をユーザーに示す正方形はもうありません。
私はいくつかの同様の質問を検索して読みましたが(完全ではありません)、答えは通常、UIImagePickerライブビューに透明なサブビューを追加し、タッチイベントをキャプチャすることを示しています。それは簡単ですが、問題は、ユーザーのタッチをキャプチャした後、そのタッチを UIImagePicker liveView にリレーする方法が見つからないことです。
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 を使用して代替案を試してみましたが、うまくいきませんでした。
これを達成する方法について誰にもアイデアがありますか、それとも私が間違っているのですか?
ありがとうございました。