斯威夫特3把2种颜色以相同的UIView
问题描述:
我要实现对UIViews和UIImageViews的这种效果:斯威夫特3把2种颜色以相同的UIView
在UIView的,我知道我可以把2它里面有不同颜色,但我几乎认为必须有更好的方法,我不知道如何在UIImageVIew中做到这一点。某种形式的吊舱会非常有用,因为我找不到它。
答
您可以添加一个渐变图层,而不是从一种颜色转换到另一种颜色,而是从颜色转到相同的颜色直到中间点,并且与后一半相同。检查例子:
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
它导致这样的:
编辑:
它可以概括d接受任意数量的颜色。创建一个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)
这是结果:
请注意不要在视图的生命周期中多次调用此函数,因为它会添加子图层rs在彼此之上。因此,请在再次致电addColors
之前调用一次或删除子层。所以当然有改进的余地。
您应该使用两种颜色的图像。它比试图在图像视图中放置两种颜色更相关。你为什么要放两种颜色?改用图像! – Lion
要求教程或图书馆在这里不是一个有效的主题。 –
事情是我需要使它灰色时,它是“不活跃”,我不能应用正常的色调因为灰色将在2种颜色 –