2017-03-27 28 views
6

Tôi đang cố gắng sử dụng tô màu 3 màu để tô màu văn bản của mình trong Xcode và dường như không thể nhận được kết quả mà tôi đang tìm kiếm. Tôi đã thành công với những điều sau nhưng điều này chỉ cho tôi hai màu sắc thông qua gradient.Nhiều Màu Gradient với Mặt nạ Nhãn trong Swift (Xcode)

@IBOutlet weak var textSample: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    textSample.textColor = UIColor(patternImage: gradientImage(size: textSample.frame.size, color1: CIColor(color: UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)), color2: CIColor(color: UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.2)))) 
} 

func gradientImage(size: CGSize, color1: CIColor, color2: CIColor) -> UIImage { 

    let context = CIContext(options: nil) 
    let filter = CIFilter(name: "CILinearGradient") 
    var startVector: CIVector 
    var endVector: CIVector 

    filter!.setDefaults() 

    startVector = CIVector(x: size.width * 0.5, y: 0) 
    endVector = CIVector(x: size.width * 0.5, y: size.height * 0.8) 

    filter!.setValue(startVector, forKey: "inputPoint0") 
    filter!.setValue(endVector, forKey: "inputPoint1") 
    filter!.setValue(color1, forKey: "inputColor0") 
    filter!.setValue(color2, forKey: "inputColor1") 

    let image = UIImage(cgImage: context.createCGImage(filter!.outputImage!, from: CGRect(x: 0, y: 0, width: size.width, height: size.height))!) 
    return image 
} 

Những gì tôi muốn làm là có 3 địa điểm với ba màu:

location1: y:0.0 
location2: y:0.8 
location3: y:1.0 

color1: UIColour(red: 1, green: 1, blue: 1, alpha: 0.2) 
color2: UIColour(red: 1, green: 1, blue: 1, alpha: 1.0) 
color3: UIColour(red: 1, green: 1, blue: 1, alpha: 0.45) 

Tôi đã cố gắng để đơn giản hóa nó bằng cách chỉ thêm gradient mà với 3 địa điểm để một UIView, nhưng có vẻ như không có vấn đề gì tôi làm để che giấu UIView với UILabel, không có gì hiệu quả. Mọi đề xuất sẽ cực kỳ hữu ích. Tôi đã đính kèm một bức tranh với những gì tôi nhận được với mã trên của tôi, và một ví dụ về những gì tôi muốn đạt được nếu có thể.

enter image description here

+0

Tôi giả định nó không phải là tầm thường để làm điều này cho ba lớp nhưng bạn đã quản lý để làm điều đó cho hai. Vậy tại sao không chia IUImage làm đôi, thực hiện gradient cho cả hai nửa và sau đó reattach? –

Trả lời

2

Có lẽ tốt hơn chọn sẽ CAGradientLayer (AppCoda), và sau đó thêm nó vào nhãn as described here. Dưới đây là ví dụ:

var labelBackground = UIView(frame: label.frame) 
label.backgroundColor = UIColor.clear 
label.frame = label.bounds 
var gradLayer = CAGradientLayer() 
gradLayer.frame = labelBackground.layer.bounds 
gradLayer.colors = [UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0).CGColor, UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.2).CGColor, UIColor(red: 1, green: 1, blue: 1, alpha: 0.45).CGColor] 
gradientLayer.locations = [0.0, 0.8, 1.0]  
labelBackground.layer.addSublayer(gradLayer) 
labelBackground.addSubview(label) 
view.addSubview(labelBackground) 
+0

Đường nối này để tạo hình chữ nhật, có đường viền trong đó, ở vị trí khác, sau đó là nhãn gốc và di chuyển nhãn gốc sang phía trên bên trái của màn hình. – mediarts

Các vấn đề liên quan