2012-07-03 11 views
18

Próbuję więc przesłonić drawRect w moim UIScrolLView, jednak daje mi to czarne tło zamiast koloru tła, który określiłem dla mojego UIScrollView. Dlaczego to? Jeśli usunąć kod drawRect wtedy wszystko jest w porządku:czarne tło podczas przesłonięcia drawRect w UIScrollView

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 
    if (shouldDrawVerticalLineForProfile){ 

     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0 
                blue:47.0/255.0 alpha:1.0].CGColor; 

     // Add at bottom 
     CGPoint startPoint = CGPointMake(60, 0); 
     CGPoint endPoint = CGPointMake(60, 10000); 

     CGContextSaveGState(context); 
     CGContextSetLineCap(context, kCGLineCapSquare); 
     CGContextSetStrokeColorWithColor(context, separatorColor); 
     CGContextSetLineWidth(context, 5.0); 
     CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5); 
     CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5); 
     CGContextStrokePath(context); 
     CGContextRestoreGState(context); 

    } 

} 
+0

myślę własnością backgroundColor prostu owija CGContextAddRect i CGContextFillPath, co zrobić, jeśli coś takiego zrobić? –

+0

coś takiego? – xonegirlz

+0

ręczne rysowanie bgcolor za pomocą dwóch funkcji wymienionych powyżej. –

Odpowiedz

4

To powinno pomóc

CGContextSetFillColorWithColor(context, colorBack); 
CGContextFillRect(context, self.bounds); 

// Wybierz granic i colorBack odpowiednio

+0

Użyj opcji rect, a nie bounds, aby umożliwić UIKit optymalizację rysunku w razie potrzeby. –

19

Chyba to, czego szukasz jest:

myScrollViewInstance.opaque = NO 

Po tym tle widok przewijania nie powinien już być czarny.

+1

Próbowałem tego, ale nie pomogłem. Myślę, że nie jest tak, że tło jest czarne. Tylko gdy drawRect scrollView jest nadpisany, scrollView staje się czarny. Jeśli drawRect nie zostanie nadpisany, widok przewijania będzie biały jak zwykle. – coolcool1994

+0

Ta odpowiedź jest poprawna tylko w przypadku, gdy chcesz uzyskać półprzezroczyste tło. Nie powiedzie się, jeśli będziesz oczekiwał, że niepoprawny 'backgroundColor' będzie przestrzegany. –

10

Wystąpiłam w podobnej sytuacji, gdy nadpisuję drawRect w mojej podklasie UIScrollView.

prostu przesłanianie z:

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 
} 

spowodowało czarnym tle zamiast pożądanego jasnym tle bym dostać bez nadrzędnych.

Znalazłem, ponieważ tło widoku było ustawione domyślnie w Konstruktorze interfejsu, a ustawienie go na Clear Color rozwiązało problem.

Nie jestem pewien, czy jest to związane z twoim problemem, ale pomyślałem, że podzielę się nim, jeśli mogłoby to pomóc.

+1

'drawRect:' UIView jest udokumentowany jako "Domyślna implementacja tej metody nic nie robi.", Więc wywołanie jej na pewno nic nie da. Musisz sam wypełnić tło. –

-1

Jedyną rzeczą, która zadziałała, było jawne ustawienie tła po każdym połączeniu z numerem setNeedsDisplay. W moim przykładzie użyłem podklasy MKAnnotationView na mapie, zamiast UIScrollView, więc nie wiem, jak dobrze to dotyczy scenariusza OP. W moim przypadku zadzwoniłem pod numer setNeedsDisplay z setAnnotation i odkryłem, że robi to resetując przez backgroundColor. Po prostu ponowne ustawienie przez backgroundColor po setNeedsDisplay rozwiązuje problem.

FWIW, ja też zauważyłem, że po prostu przesłonięcie drawRect w celu delegowania do super klasy spowodowało ten czarny problem.

4

Spróbuj to jej pracować dla mnie

- (id)initWithFrame:(CGRect)frame { 
     if (self = [super initWithFrame:frame]) { 
      [self setBackgroundColor:[UIColor clearColor]]; 
     } 
     return self; 
    } 
    - (void)drawRect:(CGRect)rect 
    { 
     [super drawRect:rect]; 
     if (shouldDrawVerticalLineForProfile){ 

      CGContextRef context = UIGraphicsGetCurrentContext(); 
      CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0 
                 blue:47.0/255.0 alpha:1.0].CGColor; 

      // Add at bottom 
      CGPoint startPoint = CGPointMake(60, 0); 
      CGPoint endPoint = CGPointMake(60, 10000); 

      CGContextSaveGState(context); 
      CGContextSetLineCap(context, kCGLineCapSquare); 
      CGContextSetStrokeColorWithColor(context, separatorColor); 
      CGContextSetLineWidth(context, 5.0); 
      CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5); 
      CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5); 
      CGContextStrokePath(context); 
      CGContextRestoreGState(context); 

     } 

    } 
4

Odpowiedź jest tu bardzo wyraźnie udokumentowane w AppleDocs dla drawRect: metody UIView za. Pierwsze zdanie jest następujące:

Domyślna implementacja tej metody nic nie robi.

Tak więc, sugestie dotyczące superumiejętności nie pomogą. Reszta odpowiedzi jest zawarta w dalszej części dyskusji:

... Jeśli właściwość nieprzezroczystego widoku jest ustawiona na TAK, to metoda drawRect: musi całkowicie wypełnić określony prostokąt nieprzezroczystą treścią.

Oznacza to, że jeśli nie masz przezroczystego tła, musisz w rzeczywistości narysować tło. Najbardziej poprawny sposób to zrobić, to kliknąć na poniższy drawRect: szablonu:

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; // optional if a direct UIView-subclass, should be called otherwise. 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    // Fill the background color, if needed 
    if (self.opaque) { 
     UIGraphicsPushContext(context); 
     CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor); 
     CGContextFillRect(context, rect); 
     UIGraphicsPopContext(); 
    } 

    // Your code here... 
} 
Powiązane problemy