7
votes

Impossible de changer de cadre d'un Uilabel dans un uableviewcell lors de la première apparition (en utilisant Autolayout)

J'ai une cellule prototype à l'intérieur de mon utableview qui contient un uilabel . Je veux modifier de manière dynamique la taille de l'étiquette (et la cellule) en fonction de la taille du texte dans l'étiquette.

i Créez la cellule prototype dans CellfrowrotindexPath comme ceci: xxx

alors mon programdétailcell a l'implémentation suivante: xxx

La première fois que la cellule est affichée, < Code> LayouplieViews est appelé, mais le DescriptionLabel n'est pas redimensionné. Cependant, si je fais défiler la table et sauvegardez à nouveau, la cellule "réutilisée" apparaît avec l'étiquette correctement redimensionnée!

Pourquoi ne fonctionne pas la première fois que la cellule est affichée - et que dois-je avoir besoin? faire pour le réparer.

Merci d'avance!


2 commentaires

Avez-vous trouvé une solution à ce problème?


Trouvé une solution pour ce problème?


9 Réponses :


1
votes

parce que lorsque LayouTouSubviews code> est appelé votre la descriptionLabel code> s texte n'est pas encore défini. Et lorsque vous faites défiler, le texte est défini. Donc, c'est correct maintenant.

Je vous suggère d'appeler sizetofit code> après avoir défini le texte. P>

static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
[cell.descriptionLabel sizeToFit];
return cell;


0 commentaires

1
votes

appelez ceci dans hauteurfrofortordexpath et calculer manuellement la hauteur xxx


3 commentaires

Merci, mais cela ne change que la taille de la cellule et non la taille de l'étiquette la première fois qu'elle est affichée.


oui faites la même chose dans cellsforfortindexpath et retourner la cellule plutôt que la hauteur


Cela ne fonctionne pas non plus. La première fois que l'étiquette apparaît, il conserve la taille d'origine du constructeur d'interface.



1
votes

Vous pouvez utiliser ci-dessous code:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;


4 commentaires

Où devrais-je mettre ce code? CellfroworTindExpath? LayouSubviews à l'intérieur de l'Uitabiliewcell?


cellsfortoratindexpath


Merci, mais cela n'a pas fonctionné. La taille du cadre est la même que dans l'IB lorsqu'elle apparaît pour la première fois et ne modifie que la nouvelle taille une fois que la cellule est réduise après le défilement.


Je pense avant de définir le texte sur l'étiquette que vous avez écrit le code de taille, vous devez définir enfin le texte dans l'étiquette.



2
votes

Après avoir récupéré toutes les données du serveur, vous pouvez obtenir une hauteur de ce uilabel à l'aide de cette méthode. XXX

et ici j'ai donné une description de MeaseDeightext: . Cette logique fonctionne dans tous les iOS5 , iOS6 , iOS7 . xxx

puis Mise à jour de votre étiquette en fonction de votre étiquette. Cela fonctionne bien pour moi. Je l'utilise.


1 commentaires

Changer le cadre de l'étiquette en dehors des appels de délégués Uitables ne fait aucune différence. Utilisez-vous aussi de l'autolayouillage?



1
votes

Si votre exigence change de manière dynamique la taille de la hauteur de l'étiquette, suivez le lien ci-dessous. Lorsque nous devons changer la hauteur de l'étiquette, nous devons également modifier la hauteur de la ligne:

redimensionner Uilabel ne fonctionne pas tout à fait fonctionner


2 commentaires

J'ai essayé cela et ça n'a pas aidé. Utilisez-vous aussi de l'autolayouillage?


Non, je n'ai pas utilisé autolayout. J'ai fait du code pour une application complète, aucun xib and Storyboard n'est utilisé.



0
votes

Utilisez ci-dessous Code pour une hauteur dynamique définie dans la cellule

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *messagetext=[NSString stringWithFormat:@"%@",[[arryStoryView objectAtIndex:indexPath.row] valueForKey:@"messagetext"]];

    CGSize StoryTextSize= [messagetext sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0f] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];

    int TotalHeight;
    TotalHeight= StoryTextSize.height + 10; 

    return TotalHeight;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell1";
    UITableViewCell *cell=[tblSendMsg dequeueReusableCellWithIdentifier:CellIdentifier];

    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                 reuseIdentifier:CellIdentifier];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSString *storytext=[NSString stringWithFormat:@"%@",[[arryStoryView objectAtIndex:indexPath.row] valueForKey:@"storytext"]];

    CGSize StoryTextSize = [storytext sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0f] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
    lblStoryText.frame=CGRectMake(5, 25, [[UIScreen mainScreen] bounds].size.width-10, StoryTextSize.height+30);

    int nooflines=StoryTextSize.height/16;
    int i= StoryTextSize.height;
    if(i%16 !=0)
    {
        nooflines=nooflines+1;
    }

    lblStoryText.numberOfLines=nooflines;
    lblStoryText.font=[UIFont fontWithName:@"Georgia" size:17.0f];
    lblStoryText.text=[NSString stringWithFormat:@"%@",storytext];

    return cell;
}


1 commentaires

Cela ne fonctionne pas pour moi. Utilisez-vous AUTOLAYOUT?



9
votes

in xib, accédez à la première onglet, sous Document de constructeur d'interface, décochez la case Utiliser une boîte de mise en page automatique.


3 commentaires

Cela a résolu le problème, mais maintenant je ne peux pas utiliser autolayout. Quel est le rarement?


Ok vous avez raison. Mais je dois utiliser la mise en page automatique sur l'utableviewcell personnalisé, comment utiliser?


Si vous souhaitez utiliser la mise en page automatique, ce qui compte ici sont les contraintes. Ensuite, vous ne devriez pas changer le cadre. Veuillez lire ce développeur.apple.com/library/ios / Documentation / Userexperience / ...



4
votes

Cela ne fonctionne pas car vous utilisez mise en page automatique code>. Vous avez besoin de mise en page automatique code> moyen d'y parvenir.

Voici la solution. P>

Étape 1: strong> p>

avoir le uilabel code> épinglé en haut et en bas du uitatifviewcell code>. Vous pouvez y parvenir via le constructeur d'interface code> en ayant contrainte verticale code> sur uilabel code> à partir de haut code> et bas de la cellule. Cela rendra le Uilabel Code> augmentation de la hauteur si la hauteur de la cellule augmente ou vice versa. P>

étape 2: strong> p>

dans votre UIVIEWCONTROLLER IN - (CGFLOAT) TableView: (UitaireView *) TableView HautPhétrofortdexpath: (NsindexPath *) IndustryPath code> Calculez la taille du Uitabilviewcell code>. p>

Vous pouvez le calculer à l'aide de: p>

 CGRect textFrame = [YourText boundingRectWithSize:CGSizeMake(width of the label, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:Your Font} context:nil];


1 commentaires

La première solution a définitivement fonctionné pour moi. Merci!



0
votes

Si vous utilisez Autolayout, la modification de la trame n'aura aucun effet.

Au lieu de cela, vous devez modifier les contraintes.


0 commentaires