gpt4 book ai didi

iOS CAlayer 方向 AVCaptureVideoPreviewLayer 不旋转

转载 作者:可可西里 更新时间:2023-11-01 03:36:26 28 4
gpt4 key购买 nike

enter image description here总结:我无法强制 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com