2013-04-23 4 views
0

J'ai plusieurs UITextView s dans plusieurs ViewController s. Dans le passé, quand j'ai quelques exemples de besoin d'un dessin personnalisé pour un TextView ou Label, etc Je voudrais simplement ajuster le dessin dans viewWillAppear à l'intérieur du VC qui possédait l'objet de l'interface utilisateur. Cette fois, il me faudra plusieurs instances à personnaliser.Quoi de plus efficace, remplaçant drawRect ou utilisant viewWillAppear

Serait-il plus approprié de simplement créer un UITextView sous-classé et d'inclure le code de dessin dans drawRect par rapport au fait que le même code de dessin soit réparti sur plusieurs VC. Je suis surtout inquiet pour la performance. La maintenabilité du code est une préoccupation secondaire cependant.

Pour être clair, ce que j'utiliserais dans drawRect:

- (void)drawRect:(CGRect)rect { 
    self.layer.cornerRadius = 10; 
    self.clipsToBounds = YES; 
} 

Ainsi, après d'autres tests, initWithFrame ne sont pas appelés, mais initWithCoder fait. J'ai également constaté que initWithCoder est appelé une fois et ainsi est drawRect. Dans mon cas d'utilisation (un StaticCellTableView avec le UITextView dans une cellule, quelle serait la différence?

Répondre

3

Vous pouvez inclure ces 2 lignes dans méthode init ou initWithCoder (Dans le cas où il est un xib ou story-board) de l'UITextView sous-classé. Fondamentalement, il ne s'agit que de propriétés de l'objet - il n'est pas nécessaire de l'exécuter chaque fois que l'UIView doit se rafraîchir

+0

J'ai essayé de mettre le code de dessin dans '- (id) initWithFrame: (CGRect) frame', mais cela n'est pas appelé. J'ai également essayé de surcharger 'init', mais cela ne se fait pas non plus. –

+0

Comment charger l'UIView? .XIB/Storyboard? Si c'est le cas -> initWithCoder –

+0

Je le charge en utilisant Storyboards. J'ai trouvé que initWithCoder fonctionne, mais avec testing, il s'appelle le même nombre de fois que drawRect est appelé. Quelle serait la différence entre l'utilisation des deux alors? –

0

Créez une base de données ViewController, puis utilisez-la comme superclasse pour tous vos autres VC. puis ajoutez ceci et d'autres méthodes de commodité à lui et partagez la richesse pour ainsi dire

Dans ce cas particulier, le mettant à la fin de viewDi dLoad serait un bon endroit, car il n'est envoyé qu'une seule fois, où viewWillAppear peut être appelé plusieurs fois. Si vous utilisez viewdidLoad, le code sera exécuté une fois.

+0

Tous les VC n'auront pas un 'TextView' et tous les VC qui ont un' TextView' auront le même 'TextView'. Peut-être que je ne comprends pas votre réponse. –

+0

Je trouve incroyable que vous préfériez sous-classer chaque textview plutôt que d'ajouter une méthode d'aide à une classe de base, une qui prend une textview comme seul paramètre, puis fait le changement que vous voulez. Chaque application iOS sur laquelle j'ai travaillé utilise une sous-classe BaseViewController, dans laquelle nous mettons des fonctionnalités communes comme celle-ci. YMMV –

+0

Tout ce que j'ai à faire est de dire à TextView quelle classe il est et c'est tout.Comme tous les VC n'ont pas de TextView et que j'ai déjà une classe de Base pour mes VC (ils ont tous une vue d'arrière-plan dynamique), je n'ai pas trouvé très efficace de voir si j'ai un TextView sur un VC, puis faites l'ajustement 'layer.cornerRadius'. Cela semble beaucoup plus facile de créer la sous-classe UITextView, puis de simplement dire à l'objet dans IB quelle classe il est. –

0

Je ne mettrais pas ces lignes dans le drawRect de la vue car cela est appelé pour chaque actualisation. Je vous recommande de sous-classer UITextView et d'ajouter ces lignes à la méthode init personnalisée.

Questions connexes