- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我编写了一个静态框架,其中有一个名为 ViewfinderViewController 的类,它使用 AVCaptureSession 设置相机。这个 ViewController 还添加了一个 AVCaptureVideoPreviewLayer 作为它自己 View 层的子层:
// code in ViewfinderViewController.m
previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
previewLayer.frame = self.view.bounds;
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:previewLayer];
ViewfinderViewController 还进行一些视频处理,并为框架的用户提供注册一些委托(delegate)方法的机会,以防在处理的帧之一中发现或找不到感兴趣的内容。
在我的实际应用程序的 viewDidLoad 方法中,我创建了一个 ViewfinderViewController 实例,设置它的框架并将它的 View 添加为 subview :
// code in the app's view controller viewDidLoad method
ViewfinderViewController *vfVC = [[ViewfinderViewController alloc] init];
vfVC.view.frame = self.view.bounds;
[self.view addSubview:vfVC.view];
只要我不考虑旋转(到目前为止我一直这样做),这就可以正常工作。我的主要问题是,ViewfinderViewController.view 会调整其框架的大小,但 AVCaptureVideoPreviewLayer 不会。我有点疑惑:previewLayer 不应该自动调整大小,因为它的 superLayer 对应的 View 调整大小正确吗?
有什么想法吗?我很乐意提供更多信息,但为了缩短问题的长度,我暂时不会再谈了。谢谢。
最佳答案
最后,我发现以下内容最适合我的应用。在我的应用程序中,我现在将 ViewFinderViewController 添加为 subview Controller :
- (void)viewWillAppear:(BOOL)animated;
{
if ([self.childViewControllers containsObject:self.viewfinderViewController] == NO) {
[self addChildViewController:self.viewfinderViewController];
self.viewfinderViewController.view.frame = self.view.bounds;
[self.view addSubview:self.viewfinderViewController.view];
[self.viewfinderViewController didMoveToParentViewController:self];
}
}
这样,将自动调用 willAnimateRotationToInterfaceOrientation: 方法,这是我之前从添加取景器 View 作为 subview 的 View Controller 转发的。
此外,我在 ViewfinderViewController 的这个方法中更新了 previewLayer 的大小:
- (void)viewWillLayoutSubviews;
{
self.previewLayer.frame = self.view.bounds;
}
我通过实现这两种方法来处理 previewLayer 的旋转:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[CATransaction begin];
[CATransaction setAnimationDuration:duration];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[self updatePreviewLayerForOrientation:toInterfaceOrientation];
[CATransaction commit];
}
- (void)updatePreviewLayerForOrientation:(UIInterfaceOrientation)interfaceOrientation;
{
// correct position of previewLayer
CGSize newSize = self.view.bounds.size;
self.previewLayer.position = CGPointMake(0.5 * newSize.width, 0.5 * newSize.height);
// rotate the previewLayer, in order to have camera picture right
switch (interfaceOrientation) {
case UIInterfaceOrientationPortrait:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(0)];
break;
case UIInterfaceOrientationLandscapeLeft:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI/2)];
break;
case UIInterfaceOrientationLandscapeRight:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(-M_PI/2)];
break;
case UIDeviceOrientationPortraitUpsideDown:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI)];
break;
default:
break;
}
}
我希望这对所有将 AVCaptureVideoPreviewLayer 添加为子层并且在界面旋转时遇到调整大小和方向问题的人有所帮助。
关于ios - 旋转时自动调整 AVCaptureVideoPreviewLayer 大小的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641330/
我有这段代码,它发出黄色警告。我不知道如何编码,所以黄色警告消失了。从 Swift-2 -> 3 -> 4 转换后尝试清理我的代码。 if let previewLayer = AVCaptureVi
如何一次在屏幕上显示多个相机预览? 如果我开始一个新的 AVCaptureSession,另一个就会停止。如果我使用与另一个 session 相同的 session 初始化一个新的 AVCapture
我正在开发一个允许用户拍照的应用程序。我已经开始使用AVCam苹果提供了,但我实际上有一个问题只是我无法将相机层放置在我想要的位置,但它会自动放置在 View 的中心 在左侧,您可以看到我实际拥有的内
我在将 AVCaptureVideoPreviewLayer 安装在其父级范围内时遇到问题。 这是上下文代码: capturePreview = AVCaptureVideoPreviewLa
当我尝试扫描条形码时,我仍然将 AVCaptureVideoPreviewLayer 添加到我的整个 View 中,如果我将条形码放在 View 中心,它会扫描。请帮我解决问题 最佳答案 AVCapt
我试图首先让我的应用程序显示广角相机的相机预览。但我所做的只是没有显示出来。 (该应用程序具有视频和音频权限,正在 iPhone 7 Plus 上进行测试) 这是我的 session 配置代码: fu
我正在使用一个库,使用相机和视频在我的 swift 应用程序上创建自定义相机 https://github.com/yonat/CameraBackground 但是我遇到了延迟,当闪光灯设置关闭时,
是否可以像裁剪图像一样裁剪视频预览层? image .clipShape(Circle()) .overlay(Circle().stroke(Color.gr
我在 AVCaptureVideoPreviewLayer 方面遇到问题。我是这样创建的: self.previewLayer = [AVCaptureVideoPreviewLayer layerW
我正在尝试从 ios 设备的摄像头获取提要以显示在屏幕上,但我不想使用 ImagePickerController,因为我想更好地控制屏幕上 View 的外观,并且我想要更多地控制相机的光圈和采样率。
当我将我的设备从横向向左旋转到横向或从横向向右旋转时,AVCaptureVideoPreviewLayer 会上下颠倒。当我将设备从纵向模式旋转到横向模式时,它工作得很好。这是我的代码 { ov
我正在设置带有预览层的自定义相机。一切正常。我设置了方向和所有内容。请问如何设置自动对焦?第二,如何启动摄像头录制视频?(因为它只是显示前置摄像头显示的内容,你看到你了)...但是我想开始录制。 我更
我正在尝试在我的应用程序中显示自定义摄像头 View 的视频预览,但目前预览非常偏离中心 - 使用前置摄像头时尤其明显。 我是这样定位的: if let previewLayer = AVCaptur
我使用 AVCaptureVideoPreviewLayer 来显示预览视频层、来自该预览的样本图像并对其进行一些处理。该处理识别图像上的一些点并将它们返回。我想(几乎)实时地在预览层上显示这些点。
我有一个 iPhone 相机应用程序,我在其中使用了 AVCaptureVideoPreviewLayer。当有人拍摄照片/静止图像时,这会显示在新的 ViewController 中。一旦这个 Vi
我有一个 AVCaptureVideoPreviewLayer,我想将它填充到我的 UIView 的边界。不过,它似乎无法正常工作。它只显示在大约 3/4 的屏幕上。 CGRect bounds=se
我有一个应用程序可以添加一些实时动画和图像以在 AV Foundation 相机中预览 View 。我可以做“硬件屏幕截图”(按住侧边按钮和提高音量按钮),没问题。但是,我需要一个制作屏幕截图的按钮。
我正在使用 AVCaptureVideoPreviewLayer 来允许用户从 iPhone 相机拍摄照片。所以我有一个 AVCaptureSession,输入为 AVCaptureDeviceInp
如何获取 AVCaptureVideoPreviewLayer 中的图像大小: self.cameraPreviewLayer.frame = self.cameraView.frame; // (0
我目前正在我的 Swift 应用程序中处理 QR 扫描 View 。我想将 VideoPreview 置于 View 中间。 View 看起来像这样: View (白色)称为 ScanView,我想让
我是一名优秀的程序员,十分优秀!