Swift UICollectionReusableView 重用时没有更新框架
Swift UICollectionReusableView didn't update the frame when reuse
我尝试使用与装饰项相同的 UICollectionReusableView 构建多个部分。但是当视图在滚动过程中被重用时,ReusableView 中的 gradientLayer 没有更新以满足新的部分大小。我不知道是什么问题。如何在重用 UICollectionReusableView 时重置 gradientLayer 框架。
class RoundedBackgroundView: UICollectionReusableView {
private var insetView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.layer.cornerRadius = 6
view.clipsToBounds = true
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
let gradientLayer = CAGradientLayer()
// Set the size of the layer to be equal to size of the display.
gradientLayer.frame = self.bounds
// Set an array of Core Graphics colors (.cgColor) to create the gradient.
gradientLayer.colors = [UIColor(red: 246, green: 186, blue: 58).cgColor, UIColor(red: 233, green: 115, blue: 58).cgColor]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
// Rasterize this static layer to improve app performance.
gradientLayer.shouldRasterize = true
insetView.layer.addSublayer(gradientLayer)
addSubview(insetView)
NSLayoutConstraint.activate([
insetView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0),
insetView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0),
insetView.topAnchor.constraint(equalTo: topAnchor),
insetView.bottomAnchor.constraint(equalTo: bottomAnchor)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
对于可重复使用的视图,我总是建议制作一个单独的视图,在该视图中进行所有布局并将其添加到 cell/reusableView。
无论如何,问题可能是在初始化方法中没有设置边界。
解决它的一种方法是将此功能添加到您的可重用视图中。
override func layoutSubviews() {
super.layoutSubviews()
if insetView.bounds.height > 0 {
gradientLayer.frame = insetView.bounds
}
}
我尝试使用与装饰项相同的 UICollectionReusableView 构建多个部分。但是当视图在滚动过程中被重用时,ReusableView 中的 gradientLayer 没有更新以满足新的部分大小。我不知道是什么问题。如何在重用 UICollectionReusableView 时重置 gradientLayer 框架。
class RoundedBackgroundView: UICollectionReusableView {
private var insetView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.layer.cornerRadius = 6
view.clipsToBounds = true
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
let gradientLayer = CAGradientLayer()
// Set the size of the layer to be equal to size of the display.
gradientLayer.frame = self.bounds
// Set an array of Core Graphics colors (.cgColor) to create the gradient.
gradientLayer.colors = [UIColor(red: 246, green: 186, blue: 58).cgColor, UIColor(red: 233, green: 115, blue: 58).cgColor]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
// Rasterize this static layer to improve app performance.
gradientLayer.shouldRasterize = true
insetView.layer.addSublayer(gradientLayer)
addSubview(insetView)
NSLayoutConstraint.activate([
insetView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0),
insetView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0),
insetView.topAnchor.constraint(equalTo: topAnchor),
insetView.bottomAnchor.constraint(equalTo: bottomAnchor)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
对于可重复使用的视图,我总是建议制作一个单独的视图,在该视图中进行所有布局并将其添加到 cell/reusableView。
无论如何,问题可能是在初始化方法中没有设置边界。 解决它的一种方法是将此功能添加到您的可重用视图中。
override func layoutSubviews() {
super.layoutSubviews()
if insetView.bounds.height > 0 {
gradientLayer.frame = insetView.bounds
}
}