2016-07-23 9 views
1

Ich habe eine einfache Taschenrechner UI, in dem ich versuche, einen Gradienten programmgesteuert zum Hintergrund des Ergebnisses/Ausgabe Label hinzuzufügen. Problem ist, dass Sie das nur mit Subviews tun können, wenn Sie immer noch an der Front zeigen wollen. Aber wenn ich das mache, wird die Benutzeroberfläche auf dem Bildschirm verzerrt.Bildschirm verzerrt, wenn ich eine Unteransicht hinzufügen

Unten sind zwei Stackoverflow Fäden, die für Aufgaben wie bei mir mit Subviews vorschlagen:

Adding a CGGradient as sublayer to UILabel hides the text of label

UILabel add GradientLayer

Der Code Ich benutze die Gradienten durch Subviews hinzufügen wird auf den oben genannten Lösungen basieren:

let gradientLayer = CAGradientLayer() 
gradientLayer.frame = CGRectMake(1, 1, resultLabel.frame.width-2, resultLabel.frame.height-2) //resultLabel.bounds 
gradientLayer.colors = [UIColor.greenColor().CGColor as CGColorRef, UIColor.blueColor().CGColor as CGColorRef] 
gradientLayer.locations = [0.0, 1.0] 

var labelBackground = UIView(frame: resultLabel.frame) 
resultLabel.backgroundColor = UIColor.clearColor() 
resultLabel.frame = resultLabel.bounds 
labelBackground.layer.addSublayer(gradientLayer) 
labelBackground.addSubview(resultLabel) 

self.view.addSubview(labelBackground) 

Obwohl es die erforderliche Steigung anwendet, ist das Display dist stark sortiert.

Ich verwende Swift 2.2 mit Xcode 7.3.1

Was mache ich falsch?

Vor Gradienten durch Subviews Zugabe:

enter image description here

Nach:

enter image description here

+0

sind Gradienten nicht auf 'CALayer' Ebene? –

+0

Wahr, aber für ein UILabel, wenn Sie einen CALayer einfach als Sublayer hinzufügen, wird der Beschriftungstext ausgeblendet (Sie sehen also nur den Verlauf). Die Subview-Methode wird verwendet, um eine Farbverlaufsschicht hinzuzufügen und gleichzeitig den Etikettentext vorne zu halten. – Ahmad

+0

Haben Sie schon 'insertSublayer (_: CALayer, unten: CALayer)' oder 'insertSublayer (_: CALayer, atIndex: Int)' schon probiert? –

Antwort

1

Try this:

let labelBackground: UIView = UIView(frame: self.resultLabel.frame) 
self.resultLabel.backgroundColor = UIColor.clearColor() 
self.resultLabel.frame = self.resultLabel.bounds 

let gradientLayer: CAGradientLayer = CAGradientLayer() 
gradientLayer.frame = labelBackground.layer.bounds 
gradientLayer.colors = [UIColor.greenColor().CGColor as CGColorRef, UIColor.blueColor().CGColor as CGColorRef] 
gradientLayer.locations = [0.0, 1.0] 

labelBackground.layer.addSublayer(gradLayer) 
labelBackground.addSubview(self.resultLabel) 

self.view.addSubview(labelBackground) 
+0

Ich nehme an, dass Sie vorschlagen, dass ich den Farbverlauf als Sublayer und nicht als Unteransicht (mit einem Farbverlaufsunterlayer) hinzufüge. Das funktioniert, aber dann erscheint der Etikettentext nicht, weshalb ich versuche, diesen Ansatz zu verwenden (siehe die Links, die ich in meiner Frage erwähnt habe). – Ahmad

+0

Bitte beachten Sie die neue Antwort bearbeiten. – Rigo

+0

Danke, aber es funktioniert immer noch nicht. Ich glaube, du hast sowieso nur einen Teil meines vorherigen Codes neu arrangiert. – Ahmad

0

So habe ich es geschafft, dieses Problem zu lösen, mich mit ein Unterschied Ent-Technik.

Ich wollte ein UILabel mit einem Farbverlauf füllen, während auch den Text in der UILabel auf der Vorderseite halten.

Um dies zu erreichen, legte ich ein UIView-Objekt hinter das UILabel und stellte sicher, dass die Größe und Koordinaten der beiden identisch waren. Ich setze Layout-Einschränkungen, die beide die gleiche Höhe und Breite haben, und beide haben den gleichen Abstand zu benachbarten Elementen. Ich habe das UILabel auch transparent gemacht. Danach fügte ich dem UIView einfach den Farbverlauf als Sublayer hinzu und es funktionierte wunderbar.

Verwandte Themen