2017-08-20 29 views
0

Ich versuche eine Ansicht zu erstellen, die an bestimmten Stellen transparent ist, um ein Bild dahinter zu sehen. Aus irgendeinem Grund sehe ich im transparenten Teil der Ansicht jedoch schwarz statt der Ansicht. Ich habe es auf sehr wenig Code reduziert und verstehe nicht, warum meine transparente Ansicht schwarz statt rot (die Farbe der Ansicht dahinter) zeigt. Hier ist mein Code:Transparente Ansicht ist schwarz?

class ViewController: UIViewController { 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     let redView = UIView(frame: view.frame) 
     redView.backgroundColor = UIColor.red 
     let transparentView = TransparentView(frame: view.frame) 

     view.addSubview(redView) 
     view.addSubview(transparentView) 
    } 
} 

class TransparentView: UIView { 

    override func draw(_ rect: CGRect) { 
     UIColor.clear.setFill() 
     UIRectFill(rect) 
} 

Ich würde erwarten, dass der Bildschirm voll rot, sondern stattdessen zeigt es voll schwarz. Bevor jemand sagt, dass es viel einfacher ist, eine klare Sicht zu haben, versuche ich tatsächlich, komplexere Dinge in drawRect zu machen, habe mich einfach auf die grundlegendste Sache beschränkt, um zu versuchen, mein Problem zu debuggen. Was fehlt mir hier?

+0

'self.opaque = false;' Fügen Sie das dem Konstruktor 'TransparentView' hinzu. Dann können Sie tun, was Sie wollen, in der "Draw" -Methode. – Brandon

Antwort

3

Verwenden self.isOpaque = false; die Ansicht/Schicht transparent zu machen, auch wenn drawRect außer Kraft gesetzt wird.

class TransparentView: UIView { 

    override init(frame: CGRect) { 
     super.init(frame: frame); 

     self.isOpaque = false; //Use this.. 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func draw(_ rect: CGRect) { 
     UIColor.clear.setFill() 
     UIRectFill(rect) 
    } 
} 
+0

Ah, ich war mir dieser Eigenschaft nicht bewusst, vielleicht ist das ein bisschen sauberer als meine Lösung. –

+0

Eigentlich Einstellung dieser Eigenschaft ändert sich nicht das Verhalten –

+0

Vergesse ich bin ein Idiot Ich setze isOpaque wahr, das funktioniert –

0

Ich fand es heraus. Selbst wenn Sie draw überschreiben, scheint backgroundColor immer noch berücksichtigt zu werden, und standardmäßig schwarz. Ich habe folgendes meine transparente Sicht Klasse:

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor.clear 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 
0

„drawRect: Implementieren Sie diese Methode, wenn Ihre Ansicht benutzerdefinierten Inhalt zieht Wenn Ihre Ansicht keine benutzerdefinierte Zeichnung macht, vermeiden Sie diese Methode überschreiben..“ Link

Das gesagt worden wäre besser, wie Sie sagten, nur Hintergrundfarbe auf Init setzen.

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor.clear 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

Persönlich ich Unterklasse eine Ansicht für so wenig Anpassung. Stellen Sie es einfach ein, während Sie es erstellen. Auch die Ansichtseinstellung ist besser in viewDidLoad, nicht in viewWillAppear. Da es jedes Mal ausgeführt wird, wenn Ihre Ansicht in den Vordergrund wechselt, werden Sie mit zwei transparenten Ansichten enden. Wenn Sie diese Zeile in einer Erweiterung mit einer privaten Funktion beibehalten, hilft dies, den Code frei zu halten.

Bitte beachten Sie, dass eine klarere Vorgehensweise wäre, diese Ansichten im Storyboard zu erstellen (nicht per Code). Halten Sie den Code klar und verständlich und sehen Sie, was passiert.

+0

@Kven DiTraglia Hast du mit meiner Lösung zu beenden? Plus meine Antwort wenn besser als die Auserwählte. Was ist mit einem +1? – alegelos

+0

Wenn Sie die Frage erneut lesen, sage ich ausdrücklich, dass es mir zu einfach ist, drawRect zu verwenden, aber mein tatsächlicher Code ist viel komplizierter und muss gezeichnet werden, aber Ihre Antwort hat ihn trotzdem entfernt. –

Verwandte Themen