2017-01-15 2 views
4

Dies ist mein erstes Mal, dass ich Probleme mit DrawRect habe. Ich habe eine einfache UIView-Unterklasse mit einem zu füllenden Pfad. Alles ist gut. Der Pfad wird richtig ausgefüllt, aber der Hintergrund bleibt schwarz, egal was passiert. Was soll ich machen? Mein Code ist unten aufgeführt:Cant Change UIView Hintergrundfarbe von Schwarz

var color: UIColor = UIColor.red {didSet{setNeedsDisplay()}} 

private var spaceshipBezierPath: UIBezierPath{ 
    let path = UIBezierPath() 
    let roomFromTop: CGFloat = 10 
    let roomFromCenter: CGFloat = 7 
    path.move(to: CGPoint(x: bounds.minX, y: bounds.maxY)) 
    path.addLine(to: CGPoint(x: bounds.minX, y: bounds.minY+roomFromTop)) 
    path.addLine(to: CGPoint(x: bounds.midX-roomFromCenter, y: bounds.minY+roomFromTop)) 
    path.addLine(to: CGPoint(x: bounds.midX-roomFromCenter, y: bounds.minY)) 
    path.addLine(to: CGPoint(x: bounds.midX+roomFromCenter, y: bounds.minY)) 
    path.addLine(to: CGPoint(x: bounds.midX+roomFromCenter, y: bounds.minY+roomFromTop)) 
    path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY+roomFromTop)) 
    path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.maxY)) 
    path.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY)) 
    return path 
} 

override func draw(_ rect: CGRect) { 
    color.setFill() 
    spaceshipBezierPath.fill() 
} 

Hier ist, was die Ansicht wie folgt aussieht: enter image description here

+0

Ich bin nicht sicher, aber vielleicht ein 'path.close()' vor Rückkehr Pfad in spaceshipBezierPath – Grifas

+0

Nope hinzufügen. Versuchte das, aber hat nicht funktioniert. Danke für die Hilfe obwohl –

+0

@ Nikhi Sridhar, verwende ich Ihren Code, um das Rect zu zeichnen, aber erhalten Sie die Farbe, Ihr Rot ist blau in meiner Ansicht, Ihr Schwarzes ist weiß. und welchen Effekt willst du bekommen? – aircraft

Antwort

6

ich eine einfache UIView Unterklasse haben ... aber der Hintergrund bleibt, egal schwarz, was

Normalerweise liegt das daran, dass Sie vergessen haben, die UIView-Unterklasse isOpaque auf false zu setzen. Es ist eine gute Idee, dies in der UIView-Unterklasse Initialisierer zu tun, damit es früh genug ist.

Zum Beispiel, hier habe ich Ihren Code sehr leicht angepasst. Dies ist der vollständige Code Ich verwende:

class MyView : UIView { 
    private var spaceshipBezierPath: UIBezierPath{ 
     let path = UIBezierPath() 
     // ... identical to your code 
     return path 
    } 
    override func draw(_ rect: CGRect) { 
     UIColor.red.setFill() 
     spaceshipBezierPath.fill() 
    } 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad()   
     let v = MyView(frame:CGRect(x: 100, y: 100, width: 200, height: 200)) 
     self.view.addSubview(v) 
    } 
} 

Hinweis der schwarze Hintergrund:

enter image description here

Nun füge ich diese Zeilen zu MyView:

override init(frame:CGRect) { 
    super.init(frame:frame) 
    self.isOpaque = false 
} 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

Sehen Sie den Unterschied, dass macht?

enter image description here

+0

Vielen Dank. Es funktioniert perfekt. –

Verwandte Themen