iOS - CALayer 在方向变化时突出边界
iOS - CALayer protruding bounds on orientation change
我有一个简单的CustomView
。我有一个要添加到 layer
.
的 CAGradientLayer
@IBDesignable
class CustomView: UIView {
override init (frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
setupView()
}
private func setupView() {
let gradient = CAGradientLayer()
gradient.frame = bounds
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
下面是 Storyboard
设置
下面是 iPad 上的纵向结果,很好。
当设备方向改变时,CustomView
的层从其边界突出。
当我检查 Xcode 中的视图层次结构时,CustomView
的框架相应地进行了调整,但是突出的是图层。为了交叉检查,我删除了 setupView
中的所有代码并仅设置了背景颜色,在方向更改时,CustomView
已按预期进行了调整。但是,为什么图层会发生这种情况?
每次 layoutSubviews
方法调用时,您都在插入一个新层。也就是说它显示了第一层的线。
只需更新 layoutSubviews
的框架并调用 awakeFromNib
的设置方法。
class CustomView: UIView {
private let gradient = CAGradientLayer()
override init (frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
gradient.frame = bounds
}
override func awakeFromNib() {
super.awakeFromNib()
setupView()
}
private func setupView() {
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
我有一个简单的CustomView
。我有一个要添加到 layer
.
CAGradientLayer
@IBDesignable
class CustomView: UIView {
override init (frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
setupView()
}
private func setupView() {
let gradient = CAGradientLayer()
gradient.frame = bounds
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
下面是 Storyboard
设置
下面是 iPad 上的纵向结果,很好。
当设备方向改变时,CustomView
的层从其边界突出。
当我检查 Xcode 中的视图层次结构时,CustomView
的框架相应地进行了调整,但是突出的是图层。为了交叉检查,我删除了 setupView
中的所有代码并仅设置了背景颜色,在方向更改时,CustomView
已按预期进行了调整。但是,为什么图层会发生这种情况?
每次 layoutSubviews
方法调用时,您都在插入一个新层。也就是说它显示了第一层的线。
只需更新 layoutSubviews
的框架并调用 awakeFromNib
的设置方法。
class CustomView: UIView {
private let gradient = CAGradientLayer()
override init (frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
gradient.frame = bounds
}
override func awakeFromNib() {
super.awakeFromNib()
setupView()
}
private func setupView() {
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}