草庐IT

iOS CAlayer 方向 AVCaptureVideoPreviewLayer 不旋转

coder 2023-09-22 原文

总结: 我无法强制 CALayer 正确响应方向变化。 每当我尝试使用 cgaffinetransform 时,我都会得到奇怪的结果(图层不居中)。 任何帮助将不胜感激! 谢谢,

过程 我正在使用 AVCaptureVideoPreviewLayer 子类添加视频预览。当设备处于纵向时,一切看起来都很好。当设备旋转到横向(向左或向右)或纵向倒置时会出现问题。

我正在使用 AVCaptureVideoPreviewLayer 子类添加视频预览。当设备处于纵向时,一切看起来都很好。当设备旋转到横向(向左或向右)或纵向倒置时会出现问题。

我正在使用以下代码添加预览层:

CGRect layerRect = [[[self view] layer] bounds];
[[[self captureManager] previewLayer] setBounds:layerRect];
[[[self captureManager] previewLayer]setFrame:CGRectMake(0, height, width, height)];
[[[self captureManager] previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),CGRectGetMidY(layerRect))];

并且它在纵向模式下可以正常显示。 当我尝试旋转设备时,预览层的行为很奇怪。它似乎没有自行调整大小,也没有正确旋转。

我尝试通过添加以下方法来修复它

-(void)rotateLayer{
CALayer * stuckview = [[self captureManager] previewLayer];
CGRect layerRect = [[[self view] layer] bounds];

UIDeviceOrientation orientation =[[UIDevice currentDevice]orientation];

switch (orientation) {
    case UIDeviceOrientationLandscapeLeft:
        stuckview.affineTransform = CGAffineTransformMakeRotation(M_PI+ M_PI_2); // 270 degress
        NSLog(@"Landscape Left");
        [stuckview setPosition: CGPointMake(self.view.bounds.size.width /2.0, self.view.bounds.size.height /2.0)];

        break;
    case UIDeviceOrientationLandscapeRight:
        stuckview.affineTransform = CGAffineTransformMakeRotation(M_PI_2); // 90 degrees
        NSLog(@"Landscape Right");
        [stuckview setPosition: CGPointMake(self.view.bounds.size.width /2.0, self.view.bounds.size.height /2.0)];
        break;
    case UIDeviceOrientationPortraitUpsideDown:
        stuckview.affineTransform = CGAffineTransformMakeRotation(M_PI); // 180 degrees
        NSLog(@"Landscape Upside down");
        break;
    default:
        stuckview.affineTransform = CGAffineTransformMakeRotation(0.0);
        break;
}
 float h1 = stuckview.frame.size.height;
   float w1 = stuckview.frame.size.width;

if(UIDeviceOrientationIsPortrait(orientation))
{
  stuckview.position =CGPointMake(h1/2.0, w1/2.0);
    NSLog(@"Portrait");
}
else{
  stuckview.position =CGPointMake(w1/2.0, h1/2.0);
    NSLog(@"Portrait");
}

添加上述方法后,我可以看到一个进度。现在图层会正确旋转以反射(reflect)当前的设备方向,并且它在横向模式下正确显示,但在纵向模式下不正确。

层没有正确定位,它没有在屏幕上居中(查看屏幕截图)。为了查看发生了什么,我添加了以下调试语句:

CALayer * stuckview = [[self captureManager] previewLayer];
CGRect layerRect = [[[self view] layer] bounds];
float h = stuckview.bounds.size.height;
float w = stuckview.bounds.size.width;

float x = stuckview.bounds.origin.x;
float y = stuckview.bounds.origin.y;

float h1 = stuckview.frame.size.height;
float w1 = stuckview.frame.size.width;

float x1 = stuckview.frame.origin.x;
float y1 = stuckview.frame.origin.y;

NSLog(@"%f %f %f %f ", h,w,x,y );
NSLog(@"%f %f %f %f ", h1,w1,x1,y1 );

NSLog(@"Anchor Point: %f  %f",stuckview.anchorPoint.x, stuckview.anchorPoint.y);
NSLog(@"Position: %f  %f",stuckview.position.x, stuckview.position.y);

CGAffineTransform at = stuckview.affineTransform;

NSLog(@"Affine Transform After : %f %f %f %f %f %f %f", at.a,at.b, at.c, at.d, at.tx,at.tx, at.ty);

并得到如下输出:

2012-09-30 13:25:12.067 RotatePreviewLayer[2776:907] 1024.000000 768.000000 0.000000 0.000000 

2012-09-30 RotatePreviewLayer[2776:907] 1024.000000 768.000000 128.000000 -128.000000

2012-09-30 13:25:12.070 RotatePreviewLayer[2776:907] Portrait
2012-09-30 13:25:12.072 RotatePreviewLayer[2776:907] Anchor Point: 0.500000  0.500000
2012-09-30 13:25:12.074 RotatePreviewLayer[2776:907] Position: 512.000000  384.000000
2012-09-30 13:25:12.076 RotatePreviewLayer[2776:907] Affine Transform after: -1.000000 0.000000 -0.000000 -1.000000 0.000000 0.000000 0.000000

注意调试输出的第二行。预览图层的边框移动128,-128。 谁能解释为什么会这样以及如何解决预览层的方向问题? 谢谢你, 雅努斯

最佳答案

这个呢?

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    _videoPreviewLayer.connection.videoOrientation = toInterfaceOrientation;
}

关于iOS CAlayer 方向 AVCaptureVideoPreviewLayer 不旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663913/

有关iOS CAlayer 方向 AVCaptureVideoPreviewLayer 不旋转的更多相关文章

  1. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  2. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  3. 欧拉角、旋转矩阵及四元数 - 2

    欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋

  4. 华为OD机试 -旋转骰子(Python) | 机试题算法思路 【2023】 - 2

    最近更新的博客华为OD机试-卡片组成的最大数字(Python)|机试题算法思路华为OD机试-网上商城优惠活动(一)(Python)|机试题算法思路华为OD机试-统计匹配的二元组个数(Python)|机试题算法思路华为OD机试-找到它(Python)|机试题算法思路华为OD机试-九宫格按键输入(Python)|机试算法备考思路华为OD机试-身高排序(Python)|备考思路使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:blog.csdn.net/hihell/catego

  5. ruby - 如何使用 prawn 更改现有 pdf 的方向? - 2

    我有一个pdf文件。我想将其所有页面向右旋转90度。如何使用Prawngem实现此目的?当我尝试使用现有的pdf作为模板并尝试对其进行旋转时,它不起作用。我徒劳地尝试了以下。require'prawn/core'require'prawn/layout'require'prawn/measurement_extensions'pdf=Prawn::Document.new(:page_size=>[4.in,6.in],:template=>'orig.pdf',:layout=>'potrait')do|p|p.rotate(90)endpdf.render_file("./test

  6. 图形学-变换(平移矩阵,旋转矩阵,缩放矩阵,线性变换,仿射变换,齐次坐标) - 2

    1.变换1.1什么是变换?变换(Transform)是计算机图形学中非常重要的一部分。变换包含模型变换(Modelingtransform)以及视图变换(Viewtransform)。模型变换指的是变换模型(被拍摄物体)的位置,大小和角度;视图变换指的是变换照相机的位置和角度。从相对运动的角度来看,两种变换是可以相互转化的。1.2模型变换1.2.1二维变换缩放变换缩放变换(Scale)中,如果一个图片以原点(0,0)为中心缩放𝑠倍。那么点(𝑥,𝑦)变换后数学形式可以表示为写成矩阵形式为:当然,我们也可以给x轴和y轴不同的缩放倍数𝑠𝑥和𝑠𝑦。在非均匀情况下,缩放变换的矩阵形式为反射变换反射变换(

  7. ruby-on-rails - 在 Rails 中旋转后台任务 - 2

    为Rails应用程序创建后台任务的首选方法是什么?我听说过Starling/Workling和优秀的ol'script/runner,但我很好奇哪种正在成为满足这一需求的实际方式?谢谢!澄清:我喜欢后台Rake的想法,但问题是,我需要持续运行或每10小时运行一次的东西。我不会奢侈地等待Web请求,它需要由服务器启动,与我网站上发生的事件异步。 最佳答案 RyanBates制作了三个可能真正对您有帮助的精彩截屏视频:RakeinBackgroundStarlingandWorklingCustomDaemon他谈到了使用每一种方法的各

  8. ruby - 在控制台中打印 ASCII 旋转 "cursor" - 2

    我有一个Ruby脚本可以执行一些耗时较长的工作。它只是命令行,我想证明脚本仍在运行并且没有停止。我以前喜欢所谓的“旋转光标”,我设法在Windows下用Ruby重现了它。问题:这在其他操作系统中是否有效?如果没有,是否有独立于操作系统的方法来完成此任务?请不要使用IRB解决方案。10.times{print"/"sleep(0.1)print"\b"print"-"sleep(0.1)print"\b"print"\\"sleep(0.1)print"\b"print"|"sleep(0.1)print"\b"} 最佳答案 是的,这

  9. iphone - 如何从视频中提取方向信息? - 2

    在网络上浏览了大量文档后,iPhone似乎总是以480x360的纵横比拍摄视频,并在视频rails上应用变换矩阵。(480x360可能会改变,但对于给定设备而言始终相同)这是一种在iOS项目中修改ffmpeg源代码并访问矩阵http://www.seqoy.com/correct-orientation-for-iphone-recorded-movies-with-ffmpeg/的方法这是在iOS-4中查找转换矩阵的更清晰的方法Howtodetect(iPhoneSDK)ifavideofilewasrecordedinportraitorientation,orlandscape.

  10. javascript - 在 IE 中使轮子旋转 - 2

    我有以下使用JS和CSS旋转轮子的代码:varprefix=(function(){if(document.body.style.MozTransform!==undefined){return"MozTransform";}elseif(document.body.style.WebkitTransform!==undefined){return"WebkitTransform";}elseif(document.body.style.OTransform!==undefined){return"OTransform";}else{return"transform";}}()),ro

随机推荐