添加带有框架显示在错误位置的 CAlayer

Posted

技术标签:

【中文标题】添加带有框架显示在错误位置的 CAlayer【英文标题】:adding CAlayer with frame displays at wrong position 【发布时间】:2018-03-06 17:09:14 【问题描述】:

我正在尝试向我的相机预览层添加一个矩形视图。我通过 UIView 和 CALayer 尝试了两种方式。在这两种情况下,帧值都是相同的,但它们最终都在不同的位置。

黑色边框为CALayer(featureLayer),浅色背景为UIView(_cardHolder)。

在视图中将出现:

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; >

我错过了什么吗?

【问题讨论】:

你在哪里运行 addLayer 代码??? In viewWillAppear @Sh_Khan 在 viewDidAppear 或 viewDidLayoutSubview 中试试 有趣地把它放在 viewDidLayoutSUbvies 工作。 【参考方案1】:

将代码放在viewDidAppear/viewDidLayoutSubviews 以外的方法中的问题是实际帧尚未渲染,因此应该是这样,但请记住将其包装在一个曾经的布尔值中作为这种方法被多次调用

 -(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的主要内容,如果未能解决你的问题,请参考以下文章

带有实体框架和 SQL Server 数据库的 ASP.NET MVC - 图像未显示在视图中......错误显示“无法将“字节”转换为“字符串”

目标 C:以编程方式添加带有约束的 UI 按钮

在 Viewpager 上添加带有标记的 Google 地图

UISearchController 位置错误,因为带有 tableview 插图

Django - 带有休息框架的数据表ajax错误

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