2009-11-02 6 views
46

Mam UIImage, który chcę narysować na UIView. Ale zamiast tworzyć UIImageView i dodawać to jako widok podrzędny, chcę nadpisać -drawRect: i narysować bezpośrednio UIView.Jak narysować UIImage lub bezpośrednio w-drawRect :?

Na przykład, mój kod wygląda następująco:

- (void)drawRect:(CGRect)rect { 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 

    UIImage *img = [UIImage imageNamed:@"foo.png"]; 

    // how to draw the directly into the view now? 
} 

Odpowiedz

83

Wezwania [img drawInRect:rect];.

+4

Istnieje również '[img drawAtPoint: point]', chociaż ja wolę 'drawInRect:'. –

+0

spróbuj uniknąć tej techniki, jeśli możesz; drawInRect i drawAtPoint mają dość fatalną wydajność. – TomSwift

+1

Dzięki. Zauważyłem, że są one szczególnie przydatne (w połączeniu z podobnymi dodatkami do rysowania NIKtring UIKit) dla widoków zawierających obrazy tła i tekst, a następnie dodawane do widoku przewijania. Rysowanie obrazu tła i tekstu razem w drawRect: pozwala uniknąć mieszania warstw Quartz (tak jak w przypadku zastosowania podejścia UIImageView i UILabel subviews), co ma znaczący wpływ na wydajność przewijania. – cidered

30

BTW, nie powinieneś ładować pliku obrazu w metodzie drawRect. Ponieważ metoda jest wywoływana za każdym razem, gdy widok jest wymagany do aktualizacji. Dlatego (oczywiście procedura ładowania) może być wywoływana wiele razy podczas pracy. (Ponadto obraz OS2.xNazwa ma błąd - nie buforował obrazu i wyciekł go.)

Dlatego lepiej załadować plik w metodzie inicjalizacji, a nie w drawRect.

+0

Dzięki za pomocne informacje. Niestety, którą metodę "inicjalizacji" masz na myśli? – geforce

+0

Prawdopodobnie oznacza on '+ (void) initialize', lub zwykłą metodę' init', w zależności od tego, co robisz. – Mason