2010-06-06 6 views
37

Je suis nouveau dans le développement de l'iPhone et je travaille actuellement sur une simple application de lecture RSS. Le problème que je suis est que je dois repositionner le textLabel à l'intérieur du UITableViewCells. J'ai essayé setFrame ou setCenter mais il ne fait rien. Est-ce que quelqu'un sait ce que je dois faire à l'intérieur de la méthode tableView:cellForRowAtIndexPath: pour repositionner le textLabel en haut de la cellule (x = 0, y = 0)?iPhone UITableViewCell: repositionnement du textLabel

Merci

PS: Le UITableViewCell est référencé par une variable appelée cell. J'ai essayé [cell setFrame:CGRectMake(0, 0, 320, 20)] sans succès.

Répondre

97

Vous pouvez créer une sous-classe pour UITableViewCell et personnaliser le cadre de textLabel. Voir cette réponse: Labels aligning in UITableViewCell. Cela fonctionne parfaitement pour moi.

Il est ma sous-classe

#import "UITableViewCellFixed.h" 
@implementation UITableViewCellFixed 
- (void) layoutSubviews { 
    [super layoutSubviews]; 
    self.textLabel.frame = CGRectMake(0, 0, 320, 20); 
} 
@end 

Il est mon UITableViewControllerClass:

UITableViewCellFixed *cell = (UITableViewCellFixed *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCellFixed alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
+0

Cela fonctionne absolument fantastique :) – Domness

+0

Vous devriez vraiment mettre le cadre d'étiquette à 'self.contentView.bounds' –

10

Semble j'ai résolu mon propre problème. Voici un code, au cas où quelqu'un se jette dans le même problème:

UILabel *ttitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)] autorelease]; 
ttitle.font = [UIFont boldSystemFontOfSize:13]; 
ttitle.textColor = [UIColor blackColor]; 
ttitle.textAlignment = UITextAlignmentLeft; 

[ttitle setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]]; 

[cell.contentView addSubview:ttitle]; 

L'idée est de créer votre propre objet d'étiquette, car le Textlabel est automatiquement positionné et ne peut pas être déplacé.

Cheers.

+6

Cela ne se brise également lorsque vous supprimez et ajoutez des cellules à la table comme UILabel ne soit pas supprimé correctement. – Domness

+0

Une façon de corriger cette rupture consiste à marquer les sous-vues et à les supprimer après avoir déqueue la cellule en itérant sur les sous-vues. Fondamentalement, nous devrions juste être sous-classement, l'ajout de sous-vues sur cellForRowAtIndexPath est plus lazier, et plus dangereux pour la mémoire – gillyD

9

La raison pour laquelle le code de vérification d'origine ne fonctionne pas est qu'il semble que le cadre du Textlabel est réglé après la UITableViewCell a été renvoyé à partir de votre méthode de délégué.

J'ai remarqué que je peux modifier avec succès de nombreuses propriétés de textLabel, telles que l'alignement du texte, la couleur, la police, etc, mais modifier le cadre n'a aucun effet et quand j'imprime le cadre plus tard), le cadre n'est pas ce que je définis. Par conséquent, je conclus que le cadre UIKit est en train de modifier le cadre du textLabel après qu'il est retourné à partir de la méthode déléguée. Sans doute cela est probablement dû au fait que les ingénieurs d'Apple voulaient s'assurer que votre texte était dessiné à l'écran, alors ils le mesurent et modifient le cadre pour qu'il corresponde. Ils ont probablement pensé que des gens comme nous qui voulaient modifier la position du texte seraient capables de le faire en sous-classifiant, ou simplement en ajoutant un autre UILabel (ou autre) comme sous-vue. Un développeur novice pourrait avoir beaucoup de mal si son texte n'apparaissait pas sur l'étiquette ou était tronqué parce qu'il n'avait pas ajusté le cadre. Dans mon cas, je voulais que le texte soit centré horizontalement, soit une couleur/police/taille spécifique, et légèrement plus haut verticalement dans la cellule. Étant trop paresseux pour sous-classer cela, j'ai d'abord essayé de modifier le cadre. Lorsque cela n'a pas fonctionné, j'ai essayé de googler la réponse (trouvé ce poste).

Ma solution finale consistait à définir la propriété numberOfLines sur 0 et à ajouter des retours chariot à mon texte. Maintenant, c'est paresseux.

+6

Upvoted en raison de étant un bon résumé de la question. La solution finale est horrible cependant ;-) –

21

Vous pouvez essayer indentationLevel, separatorInset et d'autres propriétés d'indentation contenu d'objets UITableViewCell.

+0

La méthode la plus simple. (y) –

0

Swift 3 serait

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.textLabel?.frame.origin.x = 50 
} 
Questions connexes