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 边界或框架不起作用的主要内容,如果未能解决你的问题,请参考以下文章

什么时候为 Swift 中的视图/图层设置边界和框架?

在 NSView 边界更改中托管的 CALayer

CALayer subLayer 边界舍入错误?

如何在更改其边界的动画期间强制重绘 CALayer

动画边界更改时具有 CALayer 有线效果的自定义视图

动画边界更改时具有 CALayer 有线效果的自定义视图