【问题标题】:Cannot layout CALayer frame correctly无法正确布局 CALayer 框架
【发布时间】:2020-09-18 16:21:23
【问题描述】:

我正在尝试设置一些 CALayers 的框架,但是当我运行此代码时,它们似乎向右移动。

框架坐标和阴影是正确的。 我将此类用作故事板中视图的 UIView 类。

class Shadows: UIView {

    let darkShadow = CALayer()
    let lightShadow = CALayer()

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override func layoutSublayers(of layer: CALayer) {
        super.layoutSublayers(of: layer)
        shadows()
    }

    private func shadows() {
        let cornerRadius: CGFloat = 30
        let shadowRadius: CGFloat = 8

        layer.cornerRadius = cornerRadius
        layer.masksToBounds = false

        darkShadow.frame = frame
        darkShadow.backgroundColor = UIColor.white.cgColor
        darkShadow.shadowColor = UIColor.black.cgColor
        darkShadow.cornerRadius = cornerRadius
        darkShadow.shadowOffset = CGSize(width: shadowRadius, height: shadowRadius)
        darkShadow.shadowOpacity = 0.2
        darkShadow.shadowRadius = shadowRadius
        layer.insertSublayer(darkShadow, at: 0)

        lightShadow.frame = frame
        lightShadow.backgroundColor = UIColor.white.cgColor
        lightShadow.shadowColor = UIColor.white.cgColor
        lightShadow.cornerRadius = cornerRadius
        lightShadow.shadowOffset = CGSize(width: -shadowRadius, height: -shadowRadius)
        lightShadow.shadowOpacity = 0.7
        lightShadow.shadowRadius = shadowRadius
        layer.insertSublayer(lightShadow, at: 0)
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

【问题讨论】:

    标签: ios swift xcode calayer shadow


    【解决方案1】:

    以下是针对您的问题的简单解决方法,提供bounds 而不是frame 作为CALayer 的框架,方法如下:

    darkShadow.frame = bounds
    

    要了解它的工作原理,您需要了解UIKit 布局的基础知识以及framebounds 之间的区别(您可能想谷歌一下)。简单来说,frame 是视图相对于 super 的坐标,bounds 是相对于自身的坐标。

    注意:(我在这里添加这个只是作为指导)这是一个常见的初学者错误。有很多在线资源可以解释框架和边界之间的区别。虽然一开始你可能会觉得有点不知所措,但最终你会知道其中的区别。以下是我认为有用的,也可能对您有所帮助:- Youtube Video of Saun AlenArticle from hacking with swift

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多