2017-03-27 1 views
6

Xcodeでテキストの色を塗りつぶすために3色のグラデーションを使用しようとしていますが、探している結果を得ることが一見不可能です。私は次のことで成功しましたが、これはグラデーションを通して2つの色しか与えません。 、私はただのUIViewに3箇所でその勾配を追加することによって、それを簡素化しようとしてきたSwift(Xcode)でラベルマスクを使用した複数の色グラデーション

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) 

:私がやりたいのは何

@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 
} 

は3色で3箇所を持っていますしかし、UILabelでUIViewをマスキングするために私が何をしても、何も動作しないようです。どんな提案も非常に役に立つでしょう。上記のコードを使って写真を添付し​​ました。可能であれば、私が達成したいことの例を添付しました。

enter image description here

+0

私は3つのレイヤーでこれを行うことは自明ではありませんが、あなたは2つのためにそれをやってきました。では、IUImageを半分に分割し、両方の半分のグラデーションを実装してから再接続してみませんか? –

答えて

2

たぶん、より良い選択CAGradientLayerAppCoda)も、その後as described hereにラベルを付け、それを追加します。ここに例があります:

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

このシームでは、矩形を作成し、その中に勾配を付け、元のラベルとは別の場所に置き、元のラベルを画面の左上に移動します。 – mediarts

関連する問題