2009-08-25 19 views
9

No encuentro nada en ninguna parte (motores de búsqueda, documentos, aquí, etc.) que muestre cómo crear esquinas redondeadas (especialmente en una vista de tabla agrupada) en un elemento que también recorta las subvistas .UITableViewCell esquinas redondeadas y subvistas de clip

Tengo un código que crea correctamente un rectángulo redondeado fuera de una ruta con 4 arcos (las esquinas redondeadas) que se ha probado en el método drawRect: en mi uitableviewcell subclasificado. El problema es que las subvistas, que resultan ser uibuttons con sus uiimageviews internas, no obedecen al CGContextClip() que obedece uitableviewcell.

Aquí está el código:

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

    CGFloat radius = 12; 
    CGFloat width = CGRectGetWidth(rect); 
    CGFloat height = CGRectGetHeight(rect); 

    // Make sure corner radius isn't larger than half the shorter side 
    if (radius > width/2.0) 
     radius = width/2.0; 
    if (radius > height/2.0) 
     radius = height/2.0;  

    CGFloat minx = CGRectGetMinX(rect) + 10; 
    CGFloat midx = CGRectGetMidX(rect); 
    CGFloat maxx = CGRectGetMaxX(rect) - 10; 
    CGFloat miny = CGRectGetMinY(rect); 
    CGFloat midy = CGRectGetMidY(rect); 
    CGFloat maxy = CGRectGetMaxY(rect); 

    [[UIColor greenColor] set]; 


    CGContextBeginPath(context); 

    CGContextMoveToPoint(context, minx, midy); 

    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 

    CGContextClip(context); 
    CGContextFillRect(context, rect); 

    [super drawRect:rect];  
} 

Debido a que este caso específico es estática (sólo se nota en 1 fila específica de botones), puedo editar las imágenes que se utilizan para los botones para conseguir el efecto deseado.

SIN EMBARGO, tengo otro caso que es dinámico. Específicamente, una tabla agrupada con muchos resultados basados ​​en bases de datos que mostrarán fotos que pueden estar en la primera o última fila con esquinas redondeadas y, por lo tanto, deben recortarse).

Entonces, ¿es posible crear un CGContextClip() que también recorta las subvistas? ¿Si es así, cómo?

+0

No hay respuesta aquí en la pregunta principal. ¿Es posible hacer que CGContextClip() afecte las subvistas? –

+0

Es así de simple ... http://stackoverflow.com/a/20410857/294884 QUE HACE CLIP TODAS LAS EVALUACIONES TAMBIÉTICAS. – Fattie

Respuesta

0

Cree una subclase de UIImageView con esquinas redondeadas y transparencia. El UITableViewCell en sí mismo debería ser opaco para un mejor rendimiento.

Eche un vistazo a this example.

+0

No se puede probar esto, pero parece una buena solución moderna – Brenden

7

objeto La CALayer tiene funciones para las esquinas de redondeo:

UIView * someview = something here; 
CALayer * layer = [someview layer]; 
layer.masksToBounds = YES; 
layer.cornerRadius = radius; 

Y ya está todo listo. También puede agregar algunos colores de borde y esas cosas, revise los documentos en caso de que le interese.

+2

Nunca debe usar la esquina de CALayer dentro de una UITableViewCell. Su impacto en el rendimiento es demasiado grande para la velocidad con la que se debe atraer a esas celdas para tener una tabla de desplazamiento rápido. –

+1

No hay forma de utilizar esto para tablecells ya que la configuración cornerRadius es para todas las esquinas. No hay forma de hacer una celda única redondeada – coneybeare

+0

'view.layer.masksToBounds = YES' y' view.layer.cornerRadius = 8.0f' me da exactamente lo que buscaba. Gracias. –

3

ver este código: http://gist.github.com/292384

lo he usado en varios proyectos, el rendimiento es genial y es altamente personalizable. No usa cornerRadius y el dibujo de las celdas es sensible al contexto.

+0

Ooh, no estoy seguro de que el código aborde su consulta de subvistas. Sin embargo, el código útil para tablas de estilo de grupo redondeadas sensibles al contexto. –

+0

¡Gracias por esto! Es justo lo que estaba buscando. – Greg

1

Prueba esto en su opinión initialiser:

self.layer.borderWidth = 2.0f; 
self.layer.borderColor = [[UIColor greenColor] CGColor]; 
self.layer.masksToBounds = YES; 
self.layer.cornerRadius = 12.0f; 

Y entonces no es necesario para poner en práctica cualquier método drawRect en absoluto

+0

Esto no recorta las subvistas UIButton. –

+0

para eso tiene que ir al Inspector de Atributos del botón en IB, en la sección Ver, Dibujar, marcar "Subvistas de Clip" – Zennichimaro

0

(al menos para los fines de la frontera redonda y de recorte.) Si usted tiene una costumbre UITableViewCell se puede hacer esto en Swift 4.0:

class CustomTVC: UITableViewCell { 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    self.layer.cornerRadius = 20 
    self.layer.masksToBounds = true 
} 

}

Cuestiones relacionadas