无法正确布局 CALayer 框架
Cannot layout CALayer frame correctly
我正在尝试设置一些 CALayers 的框架,但是当我 运行 这段代码时,它们似乎向右移动了。
框架坐标和阴影是正确的。
我将此 class 用作故事板视图中的 UIView class。
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)
}
}
这是针对您的问题的简单解决方法,提供 bounds
而不是 frame
作为 CALayer
的框架,方法如下:
darkShadow.frame = bounds
要了解其工作原理,您需要了解 UIKit
布局的基础知识以及 frame
和 bounds
之间的区别(您可能想要 google 这个)。简单来说,frame 是视图相对于 super 的坐标,bounds 是相对于自身的坐标。
注意:(我在这里添加这个只是作为指导)这是一个常见的初学者错误。有很多在线资源可以解释 frame 和 bounds 之间的区别。尽管一开始您可能会觉得有点不知所措,但您最终会了解其中的区别。以下是我发现有用的内容,也可能对您有所帮助:- Youtube Video of Saun Alen and Article from hacking with swift.
我正在尝试设置一些 CALayers 的框架,但是当我 运行 这段代码时,它们似乎向右移动了。
框架坐标和阴影是正确的。 我将此 class 用作故事板视图中的 UIView class。
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)
}
}
这是针对您的问题的简单解决方法,提供 bounds
而不是 frame
作为 CALayer
的框架,方法如下:
darkShadow.frame = bounds
要了解其工作原理,您需要了解 UIKit
布局的基础知识以及 frame
和 bounds
之间的区别(您可能想要 google 这个)。简单来说,frame 是视图相对于 super 的坐标,bounds 是相对于自身的坐标。
注意:(我在这里添加这个只是作为指导)这是一个常见的初学者错误。有很多在线资源可以解释 frame 和 bounds 之间的区别。尽管一开始您可能会觉得有点不知所措,但您最终会了解其中的区别。以下是我发现有用的内容,也可能对您有所帮助:- Youtube Video of Saun Alen and Article from hacking with swift.