2012-07-03 10 views
18

Así que estoy tratando de anular drawRect en mi UIScrolLView, sin embargo, me da este fondo negro en lugar del color de fondo que he especificado para mi UIScrollView. ¿Por qué es esto? Si quito el código drawRect entonces todo está bien:fondo negro al anular drawRect en 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

Creo que la propiedad backgroundColor simplemente se ajusta un CGContextAddRect y CGContextFillPath, lo que si haces algo por el estilo? –

+0

hacer algo como qué? – xonegirlz

+0

dibujando el bgcolor manualmente usando las dos funciones que mencioné anteriormente. –

Respuesta

4

Esto debería ayudar

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

// Elegir límites y colorBack consecuencia

+0

Use rect, no limits para permitir que UIKit optimice el dibujo cuando sea necesario. –

19

Creo que lo que está buscando es:

myScrollViewInstance.opaque = NO 

Después de eso, el fondo de la vista de desplazamiento ya no debería ser negro.

+1

Intenté esto pero no ayudé. Creo que no es que el fondo sea negro. Solo cuando se reemplaza drawRect de scrollView, el scrollView se vuelve negro. Si drawrect no se reemplaza, la vista de desplazamiento es blanca como es normal. – coolcool1994

+0

Esta respuesta solo es correcta en el caso de que realmente desee un fondo semitransparente. Fallará si espera que se respete un 'backgroundColor' no claro. –

10

Me encontré con una situación similar al anular drawRect en mi subclase UIScrollView.

simplemente anulando con:

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

resultó en un fondo negro en lugar del fondo claro deseada conseguiría sin anular.

Encontré que se debía a que el fondo de la vista se configuró en Predeterminado en el Generador de interfaz y que establecerlo en Clear Color resolvió el problema.

No estoy seguro de si esto está relacionado con su problema, pero pensé que lo compartiría en caso de que pudiera ser útil.

+1

El 'drawRect:' de UIView está documentado como "La implementación predeterminada de este método no hace nada.", Por lo que llamarlo definitivamente no hará nada. Tienes que completar el fondo tú mismo. –

-1

Lo único que funcionó para mí fue establecer explícitamente el fondo después de cualquier llamada al setNeedsDisplay. En mi ejemplo, estaba usando una subclase de MKAnnotationView en un mapa, en lugar de UIScrollView, por lo que no sé realmente sé cómo esto se aplica al escenario OP. En mi caso, estaba llamando al setNeedsDisplay desde setAnnotation, y descubrí que al hacerlo, se restablece por backgroundColor. Simplemente volver a establecer por backgroundColor después de setNeedsDisplay soluciona el problema.

FWIW, yo también observé que simplemente anulando drawRect para delegar en la superclase causó este problema de fondo negro.

4

Inténtelo este su trabajo para mí

- (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

La respuesta aquí está muy claramente documentado en los AppleDocs para el método de UIView drawRect:. La primera oración es:

La implementación predeterminada de este método no hace nada.

Por lo tanto, las sugerencias aquí para llamar super no van a ayudar. El resto de la respuesta se encuentra más abajo en la discusión:

... si la propiedad opaca de su vista se establece en SÍ, su método drawRect: debe llenar totalmente el rectángulo especificado con contenido opaco.

Lo que significa que si no tiene la intención de tener un fondo transparente, necesita dibujar el fondo. La forma más correcta de hacer esto es usar la plantilla drawRect: siguiente:

- (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... 
} 
Cuestiones relacionadas