2016-12-14 2 views
0

Es gibt einige Fragen zu drawRect, die mir geholfen haben, aber ich kann meinen Code immer noch nicht zum Laufen bringen.drawRect wird die Anzeige nicht aktualisieren

Ich habe eine einfache Klasse, drawExamples:

class drawExamples: UIView { 
var shapePosX : CGFloat = 0 
var shapePosY : CGFloat = 0 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    var time1 = NSTimer.scheduledTimerWithTimeInterval(
     1, 
     target: self, 
     selector: #selector(update), 
     userInfo: nil, 
     repeats: true) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

func update() { 
    shapePosX = shapePosX + 1 
    shapePosY = shapePosY + 1 
    self.setNeedsDisplay() 
} 

override func drawRect(rect: CGRect) { 
    super.drawRect(rect) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetLineWidth(context, 3.0) 
    CGContextSetStrokeColorWithColor(context, UIColor.purpleColor().CGColor) 

    CGContextMoveToPoint(context, shapePosX, shapePosY) 
    CGContextAddLineToPoint(context, shapePosX + 250, shapePosY + 320) 
    CGContextAddLineToPoint(context, shapePosX + 300, shapePosY + 320) 
    CGContextSetFillColorWithColor(context,UIColor.purpleColor().CGColor) 
    CGContextFillPath(context) 
} 
} 

Es zieht den Blick zunächst, aber es wird aktualisiert, nicht immer. Die Update-Funktion läuft gut und die Shape-Positionen werden aktualisiert. Ich nehme an, setNeedsDisplay funktioniert, ich weiß einfach nicht, warum drawRect die von mir eingestellte Form nicht neu zeichnet. drawRect scheint nicht immer wieder nach dem ersten Lauf

+1

Es sieht nicht so aus, als ob Sie einen Rahmen zugewiesen oder Einschränkungen für Ihre Ansicht festgelegt haben, so dass es keine Höhe und Breite hat. – par

+0

Ist das etwas mit Code oder ist es eine Einstellung auf der Constraint-Pin-Sache? Bedeutet das, dass die benutzerdefinierte Klasse das Standard-SKView sein sollte, und wenn ja, warum musste ich diese Einschränkungen nicht festlegen, damit die Shapes angezeigt werden, wenn die benutzerdefinierte Klasse drawExamples war? Sorry für die Fragen, neu zu schnell und mit einer schweren Zeit zu verstehen, alle Teile, die zusammen gehen, damit es funktioniert – Dal

+0

Auto-Layout ist nicht unbedingt das Problem hier. (Sorry @dal) Es könnte ein bisschen tiefer sein - warum benutzt du drawRect() um UIView zu "bewegen"? drawRect() ist normalerweise für Layer-Zeichnungen gedacht, während automatische Layout-Constraints dazu gedacht sind, UIViews - typischerweise Subviews innerhalb einer Superview - zu verschieben. Also meine Frage: Was versuchst du mit dieser Sichtweise zu machen? Ist es eine Unteransicht eines anderen? Ist es ein CAShapeLayer? – dfd

Antwort

1

genannt zu bekommen, wenn Sie drawExamples der Instanz in der Storyboard erstellen, Sie

init?(coder aDecoder: NSCoder) 

oder

awakeFromNib() 

statt

außer Kraft zu setzen haben
override init(frame: CGRect) 

um einen Timer zu machen. Ich bevorzuge watchFromNib.

Also der Code ist wie folgt.

class drawExamples: UIView { 
    var shapePosX : CGFloat = 0 
    var shapePosY : CGFloat = 0 

    override func awakeFromNib() { 
     var time1 = NSTimer.scheduledTimerWithTimeInterval(
      1, 
      target: self, 
      selector: #selector(update), 
      userInfo: nil, 
      repeats: true) 
    } 

    func update() { 
     shapePosX = shapePosX + 1 
     shapePosY = shapePosY + 1 
     self.setNeedsDisplay() 
    } 
+0

krank versuchen Sie es aus, danke! – Dal

+0

Du bist meine Lieblingsperson. Sie wissen nicht, wie viele Stunden ich damit verbracht habe herauszufinden, was falsch war. Ich dachte nicht, dass es das beheben würde, aber es tat es. Ich danke dir sehr! Warum hat es das genau repariert? Meine Update-Funktion lief auf dem Timer, es schien nur nicht setNeedsDisplay aufrufen, oder der Anruf hat nicht funktioniert – Dal

+0

Während Sie UX-Objekte mit Storyboard oder Nib instanziieren, ruft der Lader nie init (Frame: CGRect), aber call init? (coder aDecoder: NSCoder) und wakeFromNib(), weil die Daten von Storyboards archiviert sind. – Satachito

Verwandte Themen