カスタムカメラオーバーレイの場合、アイリスが開いているときに見つける必要があります。これは、アイリスが閉じている間 (そして開くようにアニメーション化されている間) にオーバーレイが常に表示されるためです。
何か案は ?
PLCameraViewIrisAnimationDidEndNotification 通知をリッスンできます。これは公式に文書化されていないため、Apple TOS に違反している可能性がありますが、この通知の名前または契約が変更される可能性に対して防御的であるようにコードを記述している限り (将来的には、イベントを取得できない可能性があります) おそらく問題ありません。つまり、タイマーやその他の手法を使用して、アイリスが開いているときに実行したいことが、通知が届かなくても最終的に確実に行われるようにします...
防御的プログラミングのない簡単な例。(もちろん、この特定の通知に対してのみ関心を登録することもできます。通知センターのドキュメントを参照してください。)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(notificationCallback:)
name:nil
object:nil
];
- (void) notificationCallback:(NSNotification *) notification {
if ([[notification name] isEqualToString:@"PLCameraViewIrisAnimationDidEndNotification"]) {
NSLog(@"Iris open");
// we don't need to listen any more
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
}
PLCameraViewIrisAnimationDidEndNotification が iOS5 で通知されなくなったようです。
アイリスが開き終わったときの適切な解決策がわかりません。3 秒のタイマーを使用するのではなく、別のオプションが必要です。
ここをチェックしてください:https ://devforums.apple.com/message/561008#561008
UIImagePickerController を子ビュー コントローラーとして保持、初期化、および表示する ViewController (ALImagePickerController) があり (ここには表示されていない、撮影した画像を表示するための別の子ビュー コントローラーがあります)、ALImagePickerController を (モーダルとして) 表示します。カメラを使いたい。したがって、この間、ViewContoller の viewDidAppear にアニメーションを追加して、シャッター アニメーションが消えるときにカメラ オーバーレイを適切に表示します。
@interface ALImagePickerController ()
@property (nonatomic) UIImagePickerController *cameraController;
@property (nonatomic) CameraOverlayView *overlayView;
....
@end
@implementation ALImagePickerController
....
- (void)viewDidLoad {
[super viewDidLoad];
[UIApplication sharedApplication].statusBarHidden = YES;
self.cameraController = [UIImagePickerController new];
self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera;
self.cameraController.delegate = self;
self.cameraController.allowsEditing = NO;
self.cameraController.showsCameraControls = NO;
....
self.overlayView = [CameraOverlayView new];
....
self.overlayView.alpha = 0;
self.cameraController.cameraOverlayView = self.overlayView;
....
// add as child view controller
[self addChildViewController:self.cameraController];
[self.view addSubview:self.cameraController.view];
[self.cameraController didMoveToParentViewController:self];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[UIApplication sharedApplication].statusBarHidden = NO;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// smoothly bring in the overlay as the native camera shutter animation opens.
[UIView animateWithDuration:0.2 delay:0.3 options:UIViewAnimationCurveEaseOut animations:^{
self.overlayView.alpha = 1.f;
} completion:nil];
}
....
@end
この問題を解決する方法は、hidden プロパティを YES に設定してすべての要素を初期化し、カメラを呼び出してから 3 秒遅延セレクターを呼び出し、すべての要素を hidden = NO に設定することです。これは理想的な解決策ではありませんが、機能しているようで、アイリスを開いた後の遅延は無視できます。
カメラがいつ写真を撮る準備ができているかは、すでにわかっているはずです。少なくともカスタム カメラ オーバーレイを使用する方法ではself.sourceType = UIImagePickerControllerSourceTypeCamera;
、他の通常のセットアップのようなものでビューを初期化し、その時点でカメラの準備ができています (または「アイリスが開いています」)。
要約すると、私が慣れ親しんだ方法でカスタム カメラ オーバーレイを使用している場合、アイリスはユーザーの制御下にあるため、いつアイリスが開いているかがわかります。