我有这个自定义代码,我写了一段时间,以便有一个渐变边界上我的意见。唯一的问题是,它已慢慢成为我的顶部崩溃在我的应用程序。
我在crashlytics中得到的crashlog指向线super.layoutSubviews()
,这对我来说没有多大意义。
任何人都有任何改进的想法,或不同的方法来做同样的事情,可以导致更少的崩溃?我得到120-200一周从这个观点。
class GradientBorderView: UIView {
var enableGradientBorder: Bool = false
var borderGradientColors: [UIColor] = [] {
didSet {
setNeedsLayout()
}
}
override func layoutSubviews() {
super.layoutSubviews()
guard enableGradientBorder && !borderGradientColors.isEmpty else {
layer.borderColor = nil
return
}
let gradient = UIImage.imageGradient(bounds: bounds, colors: borderGradientColors)
layer.borderColor = UIColor(patternImage: gradient).cgColor
}
}
extension UIImage {
static func imageGradient(bounds: CGRect, colors: [UIColor]) -> UIImage {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = colors.map(\.cgColor)
// This makes it left to right, default is top to bottom
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { gradientLayer.render(in: $0.cgContext) }
}
}
字符串
1条答案
按热度按时间qlzsbp2j1#
坚韧很难说为什么会崩溃,除非你能提供重现它的代码。
但是,您可能会发现将
CAGradientLayer
与.mask
一起使用是一个更好,更有效的选择:字符串
**编辑 *-解决圆角的需求. *
UIBezierPath(roundedRect: ...
有很多bug。当
cornerRadius
大约是短边的1/3时,最大的问题就开始发挥作用了。因此,如果框架是
300 x 60
(可能是为标签提供边框),而我们有一个20
的cornerRadius
,事情可能会变得非常难看。而不是压倒性的细节,参考这些SO职位(除其他外):
现在,* 如果 * 你将永远有一个清晰的背景,* 如果 * 你永远不会接近1/3的半径与侧边比,使用上面的代码
UIBezierPath(roundedRect: ...
应该不是问题。然而,这里有另一种方法来实现您的设计目标,您可能会发现更可靠和灵活。
我们将保持视图背景颜色清晰,为所需的背景颜色添加一个“fillLayer”,我们将使用“plain”
CALayer
遮罩渐变层,并设置其边框属性。型
示例控制器
型
输出-请注意,在第一个和第三个示例中,我使用
.black.withAlphaComponent(0.20)
作为背景色,而不是.clear
-否则当我们关闭渐变边界时,我们不会看到任何东西:x1c 0d1x的数据
点击任何地方切换渐变边界:
的