您可以添加一个渐变层,而不是从一种颜色过渡到另一种颜色,而是从一种颜色变为相同颜色直到中间点,下半部分也是如此。检查示例:
let twoColorView = UIView(frame: CGRect(x: 40, y: 100, width: 200, height: 100))
let gradientLayer = CAGradientLayer()
gradientLayer.frame = twoColorView.bounds
gradientLayer.colors = [UIColor.red.cgColor, UIColor.red.cgColor, UIColor.blue.cgColor, UIColor.blue.cgColor]
gradientLayer.locations = [NSNumber(value: 0.0), NSNumber(value: 0.5), NSNumber(value: 0.5), NSNumber(value: 1.0)]
twoColorView.layer.addSublayer(gradientLayer)
当然,您可以进一步设置该视图的样式,例如:
twoColorView.layer.cornerRadius = twoColorView.bounds.height / 2
twoColorView.layer.masksToBounds = true
结果如下:
编辑:
它可以泛化为接受任意数量的颜色。创建一个UIView 扩展并在那里添加你的逻辑。这样颜色就可以应用于任何UIView及其子类,如UILabel、UIButton、UIImageView等。
extension UIView {
func addColors(colors: [UIColor]) {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = self.bounds
var colorsArray: [CGColor] = []
var locationsArray: [NSNumber] = []
for (index, color) in colors.enumerated() {
// append same color twice
colorsArray.append(color.cgColor)
colorsArray.append(color.cgColor)
locationsArray.append(NSNumber(value: (1.0 / Double(colors.count)) * Double(index)))
locationsArray.append(NSNumber(value: (1.0 / Double(colors.count)) * Double(index + 1)))
}
gradientLayer.colors = colorsArray
gradientLayer.locations = locationsArray
self.backgroundColor = .clear
self.layer.addSublayer(gradientLayer)
// This can be done outside of this funciton
self.layer.cornerRadius = self.bounds.height / 2
self.layer.masksToBounds = true
}
}
并添加颜色:
let colorView = UIImageView(frame: CGRect(x: 40, y: 100, width: 200, height: 100))
colorView.addColors(colors: [.red, .green, .blue])
view.addSubview(colorView)
这是结果:
注意不要在视图的生命周期中多次调用这个函数,因为它会在彼此之上添加子层。因此,要么调用一次,要么在再次调用addColors 之前删除子层。所以当然还有改进的余地。