Frage

Ich habe mit Kakao eine kleine Custom-View-Anwendung geschrieben. Und später (ja, ich weiß, dass es schlecht ist) habe ich mich nur gefragt: Würde das auch für Cocoa Touch funktionieren? Natürlich funktionierte ID nicht sofort, ich musste die Klassennamen ändern und so weiter. Nun, ich habe die Ansicht erfrischt, wann immer sie benötigt wurde, mit a NSTimer und die setNeedsDisplay: Methode. Arbeitete ziemlich gut unter Kakao, aber absolut nicht unter Kakao -Berührung.

Ich kann es mir nicht erklären und ich weiß eigentlich nicht, welche Codezeilen jemandem helfen könnten, das Problem zu lösen. Vielleicht ist hier der Timer:

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(myTarget:) userInfo:nil repeats:YES]];

Und es ist Ziel:

- (void) myTarget:(NSTimer *)timer {
    [self setNeedsDisplay];
}

Der Timer wird alle 30 ms aufgerufen, ich habe das mit einem NSlog überprüft.

In dem drawRect: Methode Ich habe eigentlich nur einige Formen gezeichnet und nichts anderes getan. Nur für den Fall, dass es notwendig wäre, eine Art von einer Art anzurufen clearRect: Methode. Wie gesagt, unter Kakao funktionierte es.

War es hilfreich?

Lösung

Ich würde zuerst überprüfen, ob drawRect: Läuft mit einer Breakpoint- oder Protokollanweisung.

Stellen Sie dann sicher, dass Ihre Ansicht tatsächlich auf dem Bildschirm steht. Was ist der Wert von [self superview]? Sie sollten auch so etwas tun self.backgroundColor = [UIColor redColor]; Damit Sie sehen können, wo Ihre Ansicht ist.

Nur weil Sie alle 30 ms die Aussicht schmutzig markieren, heißt das nicht, dass sie alle 30 ms zeichnet. Es sollte im Allgemeinen (das sind ungefähr 30 fps), aber es gibt keine Garantie. drawRect: sollte sich nicht darauf verlassen, wie oft es genannt wird. Aus Ihrer Frage gehe ich davon aus, dass Sie meinen, dass es nie zeichnet, anstatt nicht so oft wie erwartet zu zeichnen.

Andere Tipps

Hier ist die Diskussion über setNeedsDisplay (Beachten Sie das Fehlen von Argumenten) aus der Dokumentation von UIView:

Sie können diese Methode verwenden, um das System zu benachrichtigen, dass der Inhalt Ihrer Ansicht neu gezeichnet werden muss. Diese Methode notiert die Anforderung und gibt die Kontrolle sofort an Ihren Code zurück. Die Ansicht wird erst im nächsten Zeichnungszyklus neu gezeichnet. Zu diesem Zeitpunkt werden alle ungültigen Ansichten aktualisiert.

Sie sollten diese Methode verwenden, um die Ansicht zu fordern, nur dann neu zu zeichnen, wenn sich der Inhalt oder das Aussehen der Ansicht ändern. Wenn Sie einfach die Geometrie der Ansicht ändern, ist die Ansicht normalerweise nicht neu gezeichnet. Stattdessen wird der vorhandene Inhalt basierend auf dem Wert in der Ansicht angepasst contentMode Eigentum. Die erneute Wiedergutmachung des vorhandenen Inhalts verbessert die Leistung, indem die Notwendigkeit vermieden wird, Inhalte neu zu zeichnen, die sich nicht geändert haben.

Im Gegensatz dazu ist hier die Diskussion darüber setNeedsDisplay: (Beachten Sie das Argument) aus der Dokumentation von NSView:

Wenn die Daten oder der Zustand, das zum Zeichnen eines Ansichtsobjekts verwendet wird, ändert sich die Ansicht a setNeedsDisplay: Botschaft. NSView Objekte, die als Anzeige gekennzeichnet sind, werden auf jedem Durchgang automatisch durch die Ereignisschleife der Anwendung wieder entschieden. (Objekte anzeigen, die vor der Ereignisschleife wieder entsprechen müssen, kann natürlich sofort die entsprechende Anzeige gesendet werden ... Methode.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top