web-dev-qa-db-fra.com

iPhone UITableViewCell: repositionner le textLabel

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

Je vous remercie

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

37
Marian Busoi

Vous pouvez créer une sous-classe pour UITableViewCell et personnaliser le cadre de textLabel. Voir cette réponse: Étiquettes alignées dans UITableViewCell . Cela fonctionne parfaitement pour moi.

C'est ma sous-classe

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

C'est mon UITableViewControllerClass:

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

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

21
Kibernetik

On dirait que j'ai résolu mon propre problème. Voici du code, au cas où quelqu'un rencontrerait 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 label, car le textLabel est automatiquement placé et ne peut pas être déplacé.

À votre santé.

10
Marian Busoi

La raison pour laquelle le code de l'affiche d'origine ne fonctionne pas est qu'il semble que le cadre de la variable textLabel est défini après que l'objet UITableViewCell a été renvoyé à partir de votre méthode déléguée.

J'ai remarqué que je pouvais modifier avec succès de nombreuses propriétés de la variable textLabel, telles que l'alignement du texte, la couleur, la police de caractères, etc., mais la modification du cadre n'avait aucun effet. ce n'est pas ce que j'ai défini. Par conséquent, je conclus que le cadre UIKit modifie le cadre du libellé textLabel après qu’il a été renvoyé par la méthode déléguée. Nul doute que cela est probablement dû au fait que les ingénieurs Apple voulaient s'assurer que votre texte était dessiné à l'écran, ils l'ont donc mesuré et modifié le cadre pour qu'il s'adapte. Ils ont probablement pensé que des personnes comme nous, désirant modifier la position du texte, pourraient le faire en sous-classant ou simplement en ajoutant un autre UILabel (ou autre) en tant que sous-vue. Un développeur novice peut avoir beaucoup de difficultés si son texte n'apparaît pas dans l'étiquette ou s'il est tronqué parce qu'il n'a pas ajusté le cadre.

Dans mon cas, je voulais que le texte soit centré horizontalement, de couleur/police/taille spécifique et légèrement plus élevé verticalement dans la cellule. Étant trop paresseux pour sous-classer cela, j'ai d'abord essayé de modifier le cadre. Quand cela n'a pas fonctionné, j'ai essayé de chercher la réponse sur Google (trouvé ce post).

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

9
brant

Dans Swift 3, ce serait

override func layoutSubviews() {
    super.layoutSubviews()
    self.textLabel?.frame.Origin.x = 50
}
0
Shalom Friss