2010-10-01 5 views
14

Ich möchte so viele Bilder in Tabellenzellen anzeigen. Ich kannte zwei Methoden, um ein Bild zu zeigen.Was ist der Unterschied zwischen UIImageView und drawInRect?

One ist eine Instanz UIImageView zu schaffen und zeigen es

CGRect rect=CGRectMake(x,y,width,height); 
UIImageView *image=[[UIImageView alloc]initWithFrame:rect]; 
[image setImage:[UIImage imageNamed:@"sample.jpg"]]; 

Eine andere Methode ist,

CGRect rect=CGRectMake(x,y,width,height); 
[[UIImage imageNamed:@"sample.jpg"] drawInRect:rect]; 

Nun, meine Frage ist, was ist der Unterschied zwischen diesen beiden ist? Welche ist effizient? Oder eine andere Funktion ist besser als diese?

Vielen Dank im Voraus ....

Antwort

33

Mit der drawInRect: Methode hat CoreGraphics das Bild in den aktiven CGContext mit der CPU gezeichnet. Angenommen, Sie befinden sich in einer UIViewdrawRect: Methode, wird das Bild in den Puffer der Ansicht malen.

UIImageView verwendet das Bild, das ihm zugeordnet ist, da es sich um einen Pufferspeicher handelt, anstatt den langsameren drawRect: zu verwenden. Die GPU referenziert diesen Puffer dann direkt, wenn der Bildschirm über QuartzCore zusammengesetzt wird.

+0

+1 für eine tolle Antwort. Ich habe schon seit einiger Zeit versucht, den Unterschied zwischen diesen beiden zu verstehen. Also ist 'UIImageView' immer der richtige Weg? Gibt es Fälle, in denen 'drawRect:' 'das Bild direkt zu bevorzugen ist? –

+0

Die einzige Situation, in der ich feststellen kann, dass sie langsamer ist, ist das Zusammensetzen einer statischen Hintergrundszene aus vielen kleinen Bildern und das anschließende Animieren von Inhalten darüber, ohne den Hintergrund zu ändern. In diesem Fall muss die GPU sowohl den bewegten Inhalt als auch die gesamte Hintergrundszene für jeden Frame neu zusammensetzen. Dies ist natürlich ein Eckfall. – rpetrich

+3

Eine Situation, in der "-drawRect:" von Vorteil ist, wenn Sie eine reibungslose Bildlaufleistung wünschen und PNGs mit Transparenz haben. Auf älterer Hardware kann die GPU nicht eine ganze Menge transparenter Ansichten gleichzeitig scrollen, ohne Frames zu verlieren. Ein Weg, um dies zu tun, ist, all Ihre Kompositionen in '-drawRect:' zu machen, was diese schwere GPU-Arbeit in einen einmaligen schweren CPU-Job umwandelt. Dies ist ein relativ häufiges Szenario in Grafik-Tabellen-Tabellenzellen, obwohl es mit dem iPhone 4 und iPad wegen der schnelleren GPUs nicht so ein Problem ist. –

0

UIImageView ist eine UIView Unterklasse. Durch Hinzufügen zur Ansichtshierarchie erhalten Sie alle kostenlosen Vorteile: Animationen, Größeneigenschaften, affine Transoforms usw. Außerdem können Sie die zugrunde liegende UIImage jederzeit ändern.

Auf der anderen Seite wird das Aufrufen von drawInRect: nur das Bild zeichnen, wo Sie es sagen, aber nicht mit der Hierarchie UIView interagieren, so dass Sie keinen der Vorteile von es in der View-Hierarchie haben.

Ich würde denken (habe es nicht versucht), dass das Zeichnen des Bildes direkt ist schneller, aber ich würde in den meisten Fällen denken, eine UIImageView ist eine bessere Idee.

+0

Seltsamerweise ist das Zeichnen des Bildes langsamer, weil es weniger direkt ist, als es einem 'UIImageView' zuzuweisen. – rpetrich

+0

Das ist großartig zu wissen, danke! – pgb

+0

Danke für Ihre wertvollen Antworten –

Verwandte Themen