无法正确布置CALayer框架

问题描述 投票:0回答:1

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

帧坐标和阴影正确。我从情节提要的视图中将此类用作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个回答
3
投票

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

darkShadow.frame = bounds

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

注意:(我将其添加为指导原则),这是一个常见的初学者错误。有很多在线资源可以解释框架和界限之间的差异。尽管一开始您可能会觉得有些不知所措,但最终您将了解到它们之间的区别。以下是我发现有用的内容,也可能对您有帮助:-Youtube Video of Saun AlenArticle from hacking with swift

© www.soinside.com 2019 - 2024. All rights reserved.