2009-08-25 15 views
9

Non riesco a trovare nulla da nessuna parte (motori di ricerca, documenti, ecc.) Che mostra come creare angoli arrotondati (specialmente in una vista tabella raggruppata) su un elemento che ritaglia anche le sottoview .UITableViewCell angoli arrotondati e sottocartelle clip

Ho codice che crea correttamente un rettangolo arrotondato su un percorso con 4 archi (gli angoli arrotondati) che è stato testato nel drawRect: metodo nella mia sottoclasse uitableviewcell. Il problema è che le sottoview, che capita di essere uibutton con le loro immagini utente interne, non obbediscono alla CGContextClip() che la uitableviewcell obbedisce.

Ecco il codice:

- (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];  
} 

Poiché questo caso specifico è statica (mostra solo in 1 riga specifica di pulsanti), posso modificare le immagini utilizzate per i pulsanti per ottenere l'effetto desiderato.

TUTTAVIA, ho un altro caso dinamico. In particolare, una tabella raggruppata con molti risultati basati su database che mostreranno le foto che potrebbero trovarsi nella prima o nell'ultima riga con angoli arrotondati e quindi devono essere ritagliate).

Quindi, è possibile creare un CGContextClip() che consente di ritagliare anche le sottoview? Se é cosi, come?

+0

Non c'è risposta qui sulla domanda principale .. È possibile ottenere CGContextClip() per influenzare le visualizzazioni secondarie? –

+0

È così semplice ... http://stackoverflow.com/a/20410857/294884 che CLIP TUTTE LE SOTTOSCRIZIONI. – Fattie

risposta

0

Creare una sottoclasse di UIImageView con angoli arrotondati e trasparenza. Lo UITableViewCell stesso dovrebbe essere opaco per prestazioni migliori.

Dai un'occhiata allo this example.

+0

Impossibile verificare questo, ma questa sembra una buona soluzione moderna – Brenden

7

Il CALayer oggetto dispone di funzioni per gli angoli di arrotondamento:

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

E tu sei a posto. Puoi anche aggiungere alcuni colori e elementi ai bordi, controlla i documenti nel caso tu sia interessato.

+2

Non si dovrebbe mai usare CALayer's cornerRadius all'interno di UITableViewCell. Il suo impatto sulle prestazioni è troppo grande per la velocità con cui tali celle devono essere disegnate per avere una tabella di scorrimento veloce. –

+1

Non esiste un modo per utilizzare questo per i tablecell poiché l'impostazione cornerRadius è per tutti gli angoli. Non esiste un modo per creare una cella con una sola arrotondata, – coneybeare

+0

'view.layer.masksToBounds = YES' e' view.layer.cornerRadius = 8.0f' mi dà esattamente quello che cercavo. Grazie. –

3

Vedi questo codice: http://gist.github.com/292384

L'ho usato in più progetti, la performance è grande ed è altamente personalizzabile. Non usa cornerRadius e il disegno delle celle è sensibile al contesto.

+0

Ooh, non sono sicuro che il codice indirizzi la tua query di sottoview. Codice utile per tabelle di gruppo arrotondate sensibili al contesto comunque. –

+0

Grazie per questo! È proprio quello che stavo cercando. – Greg

1

Prova questo nella vista initialiser:

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

E poi non c'è bisogno di realizzare qualsiasi metodo drawRect affatto

+0

Questo non taglia le visualizzazioni secondarie di UIButton. –

+0

per quello devi andare al pulsante Attributi Ispettore in IB, sotto la sezione Visualizza, Disegno, selezionare "Clip Subviews" – Zennichimaro

0

(almeno ai fini del confine rotonda e ritaglio.) Se si dispone di un costume UITableViewCell si può fare questo a 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 
} 

}