Swift - 设置 CALayer 边界或框架不起作用
Posted
技术标签:
【中文标题】Swift - 设置 CALayer 边界或框架不起作用【英文标题】:Swift - Setting CALayer bounds or frame not working 【发布时间】:2018-02-01 18:53:51 【问题描述】:我是 Swift 新手,我似乎无法弄清楚最基本的事情之一 - 为 CALayer 设置框架和边界,因此我可以稍后阅读它们。
我正在尝试查看在 CALayer 上绘制框的位置,以确定它与图层中心的距离。
我会假设 CALayer 与添加到子视图的层/视图的大小相同,但是当我查看 CALayer 的框架或边界时,它是零。超级视图层/视图也是如此。
任何帮助将不胜感激!
目标:检查框在层内的写入位置
伪代码:
create new layer
draw a box on layer
look at box dimensions and compare to layer dimensions
if box near middle of the layer then print success
视图/层层次结构(从上到下)
1. CALayer named shapeLayer
2. CALayer named previewLayer (this is a AVCaptureVideoPreviewLayer)
3. UIView named videoPreview
我无法为 3 个视图/层中的任何一个设置框架或边界。当我读取框架或边界值时,我得到的只是 0。
注意,我也尝试在 viewWillAppear 中调用代码,但结果相同。
override func viewDidLoad()
super.viewDidLoad()
if let previewLayer = self.videoCapture.previewLayer
self.videoPreview.layer.addSublayer(previewLayer)
videoCapture.previewLayer?.frame = videoPreview.bounds
if videoCapture.previewLayer?.frame != nil
videoCapture.previewLayer!.frame = CGRect(x:0, y:0, width:375, height: 667)
let w = videoCapture.previewLayer!.frame.height
let h = videoCapture.previewLayer!.frame.width
NSLog("Print the height and width w:%i, h:%i", w, h);
【问题讨论】:
答案是正确的——你在寻找帧值时为时过早。您也许能够尽快检查viewWillLayoutSubviews
,但在viewDidLoad
中设置框架充其量是非常冒险的。 (与设置自动布局约束相反。)另外,我相信大多数开发人员会说你的层次结构倒退了。 “top”通常表示“parent”或“root”,“bottom”通常表示“subviews”或“sublayers”。
【参考方案1】:
当视图对其子视图进行布局时,您将获得图层的框架:
override func viewDidLoad()
super.viewDidLoad()
if let previewLayer = self.videoCapture.previewLayer
self.videoPreview.layer.addSublayer(previewLayer)
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
if let previewLayer = self.videoCapture.previewLayer
videoCapture.previewLayer?.frame = videoPreview.bounds
if videoCapture.previewLayer?.frame != nil
videoCapture.previewLayer!.frame = CGRect(x:0, y:0, width:375, height: 667)
let w = videoCapture.previewLayer!.frame.height
let h = videoCapture.previewLayer!.frame.width
NSLog("Print the height and width w:%i, h:%i", w, h)
【讨论】:
以上是关于Swift - 设置 CALayer 边界或框架不起作用的主要内容,如果未能解决你的问题,请参考以下文章