2014-10-21 10 views
8

Nadpisuję drawRect: w jednym z moich widoków działa nawet bez wywoływania [super drawrect: rect]. Jak to działa?Dlaczego drawRect: praca bez wywoływania [super drawrect: rect]?

- (void)drawRect:(CGRect)rect{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(context, kCGBlendModeDestinationOver); 
    [[UIColor clearColor] setFill]; 
    UIRectFill(CGRectMake(0,0,100,100)); 
} 

Odpowiedz

19

Z dokumentacji:

„Domyślna implementacja tej metody dokłada nothing.Subclasses które wykorzystują technologie takie jak rdzeń graficzny i UIKit wyciągnąć treść swojego widoku danych, należy zastąpić tę metodę i wdrożyć ich kod rysunek tam”

również z dokumentacji ..

"Jeśli podklasa UIView bezpośrednio, twoja implementacja tej metody nie musi wywoływać super. Jednakże, jeśli jesteś instacji do inną klasę widoku, należy zadzwonić Super w pewnym momencie w implementacji .”

Link to the documentation

jestem zakładając, Twój Super klasa jest UIView. Stąd to działa nawet jeśli [super drawrect: rect] nie jest wywoływany, ponieważ drawRect: ponieważ UIView nie robi nic, więc nie ma znaczenia w tym przypadku, czy wywołasz [super drawrect: rect].

+1

Awesome. Dzięki! – wakeup

-1

Dzięki .. Nie ma trzeba zadzwonić super, ponieważ nadklasa tutaj jest UIView, którego drawRect: nic nie robi

Generalnie wywołujemy setNeedDisplay, jeśli chcemy przywołać drawRect do rysowania.

+0

To jest niepoprawne wyjaśnienie. Ogólnie rzecz biorąc, gdy podklasa zastępuje metodę super klasy, musi wykonać połączenie z super. A po drugie, tylko dlatego, że drawRect nie jest wywoływany bezpośrednio na widoku, nie oznacza, że ​​super drawRect nie jest nazywany .. –

+0

Dzięki .. Nie ma potrzeby, aby zadzwonić super, ponieważ nadklasa tutaj jest UIView, którego drawRect: nie nic. http://books.google.co.in/books?id = 4MPks3aB_D8C & pg = PA422 & LPG = PA422 & dq = dlaczego + my + nie + połączenie + Super + drawRect & source = bl & ots = lXzshq7XDQ & sig = o2fDJJdTT_9buX_hL8zRaNr2nno & hl = pl & sa = X & ei = NftFVIWRC9OgugTCqILwBw & ved = 0CEEQ6AEwBQ # v = onepage & q = dlaczego% 20we% 20don't% 20call% 20super% 20rectrect & f = false –

5

Zasadniczo działa, ponieważ maszyna, która ustawia kontekst graficzny do rysowania, itp., Nie jest zgodna z implementacją UIView implementacji (która jest pusta).

że maszyna ma żyć gdzieś, oczywiście, udawajmy w każdym UIView istnieje jakiś wewnętrzny metoda jak this-- nazw metod, funkcji i właściwości są wymyślone, aby chronić niewinnych:

- (void)_drawRectInternal:(CGRect)rect 
{ 
    // Setup for drawing this view. 
    _UIGraphicsContextPushTransform(self._computedTransform); 

    // Call this object's implementation of draw (may be empty, or overridden). 
    [self drawRect:rect]; 

    // draw our subviews: 
    for (UIView * subview in [self subviews]) { 
     [subview _drawRectInternal:rect]; 
    } 

    // Teardown for this view. 
    _UIGraphicsContextPopTransform(); 
} 

To jest czystszy sposób budowania struktur niż poleganie na subklasserze, aby zrobić coś właściwego we wspólnym zastąpieniu, gdy złagodzenie byłoby wynikiem bardzo zagadkowego złego zachowania. (I nie byłoby to w ogóle możliwe, ponieważ losowanie może wymagać konfiguracji i przerwania).

-1

Jestem pewna, że ​​subview nie działa bez wywołania [super drawrect: rect] .Jeśli potrzebujesz zachowaj rysunek superwizja, musisz dodać [super drawrect: rect] w drawrect subview: rect, lub zastąpisz rysunek.

Powiązane problemy