添加CAlayer与帧显示在错误的位置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添加CAlayer与帧显示在错误的位置相关的知识,希望对你有一定的参考价值。

我正在尝试将矩形视图添加到我的相机预览图层。我试过UIView和CALayer两种方式。在这两种情况下,帧值都相同,但它们最终都处于不同的位置。 enter image description here

一个黑色边框是CALayer(featureLayer),浅色背景是UIView(_cardHolder)。

在viewWillAppear中:

CALayer *featureLayer = [[CALayer alloc]init];
featureLayer.borderWidth=3;
featureLayer.backgroundColor=[[UIColor orangeColor]CGColor];
featureLayer.opacity = 0.5;
featureLayer.position = CGPointMake(0, 0);
[featureLayer setFrame:self.cardHolder.frame];

[self.videoPreviewLayer addSublayer:featureLayer];



(lldb) po featureLayer <CALayer:0x1c4423b20; position = CGPoint (160 283.5); bounds = CGRect (0 0; 288 181); allowsGroupOpacity = YES; opacity =
0.5; backgroundColor = <CGColor 0x1c40b1d00> [<CGColorSpace 0x1c00bb120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 1 0.5 0 1 ); borderWidth = 3>

(lldb) po featureLayer.frame
(origin = (x = 16, y = 193), size = (width = 288, height = 181))

(lldb) po self.cardHolder <UIView: 0x123dcbc50; frame = (16 193; 288 181); autoresize = RM+BM; layer = <CALayer: 0x1c043eb40>>

(lldb) po self.videoPreviewLayer <AVCaptureVideoPreviewLayer:0x1c0623ae0; position = CGPoint (187.5
333.5); bounds = CGRect (0 0; 375 667); sublayers = (<CALayer: 0x1c0623800>, <CALayer: 0x1c4423b20>); masksToBounds = YES; allowsGroupOpacity = YES; inheritsTiming = NO; >

我错过了什么吗?

答案

将代码放在viewDidAppear / viewDidLayoutSubviews以外的方法中的问题是真实的帧还没有渲染,所以它应该是这样的,但要记住将它包装在一次bool中,因为这个方法被多次调用

 -(void)viewDidLayoutSubviews
    if(once)
    {
       once = No;
       CALayer *featureLayer = [[CALayer alloc]init];
       featureLayer.borderWidth=3;
       featureLayer.backgroundColor=[[UIColor orangeColor]CGColor];
       featureLayer.opacity = 0.5;
       featureLayer.position = CGPointMake(0, 0);
       [featureLayer setFrame:self.cardHolder.frame];
       [self.videoPreviewLayer addSublayer:featureLayer]
    }
  }

以上是关于添加CAlayer与帧显示在错误的位置的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的异常:CALayer 位置在做动画时包含 NaN

是啥导致了这个错误? “CALayer 位置包含 NaN:[240 nan]”

调试 Firebase 崩溃报告 - CALayer 位置包含 NAN

调试 'CALayer 位置包含 NaN: [nan nan]'

iOS CALayer.zPosition 不会超越视图层次结构吗?

在 solr 3.4 中放置突出显示片段配置的位置