2016-07-04 1 views
1

C'est à peu près mon problème. Je veux créer des cellules lisses arrondies dans une vue de tableau. Je remplace drawRect(frame: CGRect) dans une classe TableViewCell, mais lorsque la cellule est affichée, le périphérique (simulateur aussi) se fige pendant environ 1 seconde et le débogueur affiche une pointe de l'utilisation du processeur à 75%.UITableViewCell drawRect() Override rend le périphérique très lent (pic d'utilisation du processeur)

Non qu'il pourrait être d'une quelconque utilité, mais voici mon code:

override func drawRect(rect: CGRect) { 
    frame.origin.x = 10 
    frame.size.width -= 20 
} 

Ainsi est-il plus facile/beaucoup plus efficace/« juridique » (quelqu'un a dit la substitution drawRect est considéré comme « hacky ») façon de simplement rendre chaque cellule plus étroite que l'écran?

+3

Le cadre de la cellule réelle sera géré par la tableview, vous pouvez ajouter vos propres sous-vues personnalisées à l'intérieur de 'cell.contentView'. Pourquoi utilisez-vous drawrect? inquiet pour la performance? La tableview est efficace pour la mise en cache et la réutilisation des cellules. Sauf si vous affichez des milliers de cellules sur l'écran, vous n'aurez pas besoin de vous soucier de l'efficacité du dessin. – thelaws

+0

Oui, j'ai remarqué que la pointe du processeur ne se produit que sur la première cellule, ensuite elle fonctionne correctement. Je vais essayer d'utiliser une sous-vue. Postez-le comme une réponse, donc je vais le choisir. Merci! – Lawrence413

Répondre

1

Vous n'êtes pas autorisé à utiliser drawRect pour modifier le cadre d'une vue. drawRect vous donne juste une occasion de dessiner dans le cadre donné.

La trame réelle d'un UITableViewCell est gérée par le UITableView à travers sa largeur et la méthode heightForRowAtIndexPath:. En outre, la vue de la table est très efficace pour la mise en cache et la réutilisation des cellules. Sauf si vous affichez des milliers de cellules sur l'écran, vous n'aurez pas besoin de vous soucier de l'efficacité du dessin.

Je pense que vous devriez ajouter une sous-vue à contentView de la cellule, et en définissant son cadre comme inséré à la cellule. Cela peut être fait en utilisant autolayout dans un xib de cellule personnalisée, ou manaully dans cellForRowAtIndexPath:.

+0

Merci! J'ai fait ce que vous avez dit dans le commentaire et a très bien fonctionné. – Lawrence413