wake-up-neo.net

Ändern Sie die Höhe der UITableViewCell entsprechend der Textmenge

Ich muss in der Lage sein, die Höhe einer einzelnen Zelle in UITableView so anzupassen, dass sie der Textmenge in der Detailbeschriftung entspricht.

Ich habe mit folgendem gespielt, aber es hat bei mir nicht funktioniert:

Wie kann ich Text in einer UITableViewCell ohne eine benutzerdefinierte Zelle einschließen

Ich hoffe du kannst helfen, danke.

BEARBEITEN:

Versuchter Code:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

und

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

Dies hat nicht funktioniert, es zeigt die gesamte Zeichenfolge in der Zelle an, die Zellenhöhe ist jedoch überhaupt nicht betroffen.

54
Josh Kahane

Basierend auf dem von Ihnen bereitgestellten Code erhöhen Sie meiner Meinung nach nur die Zellenhöhe und nicht die Höhe von cell.textLabel.

Idealerweise sollten Sie die Framegröße von cell.textLabel und der Zelle so einstellen, dass der vollständige Text in der Zelle angezeigt wird.

Eine nette Methode, um festzustellen, was mit einer Ansicht hinsichtlich der Größe falsch ist, besteht darin, sie anders als den Hintergrund einzufärben (versuchen Sie, den cell.textLabel-Hintergrund auf Gelb zu setzen), und prüfen Sie, ob die Höhe tatsächlich eingestellt ist.

So soll es sein

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = cell.textLabel.font;
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    cell.textlabel.frame.size = labelSize; 
    cell.text = cellText;
}

Hoffe das hilft!

update: Dies ist eine ziemlich alte Antwort, und viele Zeilen in dieser Antwort sind möglicherweise veraltet.

20
Nitin Alabur

Es ist einfach, fügen Sie dies einfach in Ihren Code ein:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}

Es zählt automatisch eine Reihenhöhe und bringt dann einen Schwimmer zurück ... :-)

Hoffe das hilft!

80
stepik21

Hallo Josh,

Mit tableView:heightForRowAtIndexPath: können Sie zur Laufzeit die Größe jeder Zeile angeben. jetzt ist dein Problem, wie man die Höhe von der Zeichenfolge erhält, es gibt Funktion in der NSString-Klasse durch diesen Code Ihr Problem,

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *str = [dataSourceArray objectAtIndex:indexPath.row];
    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping];
    NSLog(@"%f",size.height);
    return size.height + 10;
}

in der unteren Zeile stellen Sie die Nummer Ihres Labels ein. der Leitung bis max. Legen Sie es in der Methode cellForRowAtIndexPath: fest.

cell.textLabel.numberOfLines = 0;

wenn Sie eine benutzerdefinierte Zelle verwenden, verwalten Sie alle Zeichenfolgen der Beschriftung und erhalten die Summe dieser Höhe. Legen Sie dann die Höhe der Zelle fest.

Edit: IOS 8 und höher, wenn Sie für das Label richtige Autolayout-Einschränkungen festgelegt haben, müssen Sie nur die folgende Delegat-Methode festlegen, um dies zu erreichen.

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
   //minimum size of your cell, it should be single line of label if you are not clear min. then return UITableViewAutomaticDimension;    
   return UITableViewAutomaticDimension; 
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}

das ist es. keine Berechnung erforderlich Weitere Informationen finden Sie in diesem Tutorial.

56
AJPatel

In Ihrer CustomCell: Denken Sie daran, Einschränkung oben und unten für Ihre UILabel hinzuzufügen. 

Um die Höhe der UILabel anzupassen, hängen Sie vom Text ab. Ändern Sie einfach die UILabel-Zeile in 0 ( siehe Antwort hier)

Dann setzen Sie in Ihrem Code einfach nur 2 Zeilen

self.tableView.estimatedRowHeight = 80;
self.tableView.rowHeight = UITableViewAutomaticDimension;

Hier ist meine eigene Zelle
 enter image description here Hier sind meine UILabel Einschränkungen
 enter image description here
Der Bildschirm, den Sie erreichen werden

 enter image description here

=== Vorschlag ===
WENN Ihre Zelle hat eine UILabels und Images (nicht wie in meinem Beispiel), dann:

  • Sie sollten alle UILabels und Images auf eine GroupView (View) setzen. 
  • Fügen Sie den constraint top and bottom to supper view für diese GroupView hinzu (wie das UILabel in meinem Bild) 
  • Passen Sie die UILabel-Höhe wie oben beschrieben an 
  • Passen Sie die Höhe von GroupView abhängig vom Inhalt an (der Inhalt ist alles UILabels und Images
  • Ändern Sie zum Schluss estimateRowHeight und tableView.rowHeight wie im obigen Code

Ich hoffe das hilft 

43
Linh

Für Swift Entwickler:

Benutzerdefinierte Zelle : Zuerst können Sie die Höhe des Textes wie folgt berechnen:

func calculateHeight(inString:String) -> CGFloat
    {
        let messageString = inString
        let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 15.0)]

        let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

        let rect : CGRect = attributedString.boundingRect(with: CGSize(width: 222.0, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        let requredSize:CGRect = rect
        return requredSize.height
    }

Stellen Sie die Breite Ihres Textlabels ein

Dann rufen Sie diese Funktion auf:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        heightOfRow = self.calculateHeight(inString: conversations[indexPath.row].description)

        return (heightOfRow + 60.0)
}

Für Basiszelle :

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
           return UITableViewAutomaticDimension
    }

Diese Funktion steht für benutzerdefinierte Zellen nicht zur Verfügung.

Ich hoffe es wird klappen. 

5
mumu

In tableView:heightForRowAtIndexPath: können Sie den Text verwenden und sizeWithFont:constrainedToSize: verwenden, um die Größe des Textes zu ermitteln.

Dann geben Sie einfach die Höhe und einen zusätzlichen Abstand für den Puffer ein.

2
Kevin Low

Sie können eine Methode global schreiben, damit sie in der App verwendet werden kann. Sie müssen den Text, die Schriftart und die Breite gemäß Ihrer Anforderung übergeben.

In Swift 4:

func heightForText(text: String,Font: UIFont,Width: CGFloat) -> CGFloat{

    let constrainedSize = CGSize.init(width:Width, height: CGFloat(MAXFLOAT))

    let attributesDictionary = NSDictionary.init(object: Font, forKey:NSAttributedStringKey.font as NSCopying)

    let mutablestring = NSAttributedString.init(string: text, attributes: attributesDictionary as? [NSAttributedStringKey : Any])

    var requiredHeight = mutablestring.boundingRect(with:constrainedSize, options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), context: nil)

    if requiredHeight.size.width > Width {
        requiredHeight = CGRect.init(x: 0, y: 0, width: Width, height: requiredHeight.height)

    }
    return requiredHeight.size.height;
}
1
Harry P
NSString *str;
NSArray* dictArr;

if (_index==0) {
    dictArr = mustangCarDetailDictArr[indexPath.section];

}

NSDictionary* dict = dictArr[indexPath.row];


if (indexPath.section ==0)
{

    str = [dict valueForKey:@"FeatureName"];
    if ([[dict valueForKey:@"FeatureDetail"] isKindOfClass:[NSString class]])
    {

        str = [dict valueForKey:@"FeatureDetail"];



    }
    else
    {
        if (dictArr.count>indexPath.row+1)
        {
            NSDictionary* dict2 = dictArr[indexPath.row+1];
            if ([[dict2 valueForKey:@"FeatureDetail"] isKindOfClass:[NSString class]])
            {


            }
        }

    }


}
CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping];
NSLog(@"%f",size.height);
return size.height + 20;


}
0

Ich konnte dies mit Autolayout erreichen. Stellen Sie sicher, dass Ihr Label am oberen und unteren Rand der Zelle einrastet (ich verwende eine Prototypzelle) und dass die Linien auf 0 gesetzt sind. Dann können Sie im tableView:heightForRowAtIndexPath:sizeWithFont:constrainedToSize: die Höhe der Zelle festlegen, indem Sie die Berechnung der Textgröße vornehmen :

NSString *key = self.detailContent.allKeys[indexPath.row];
NSDictionary *dictionary = self.detailContent[key];
NSString *cellText = dictionary[kSMDetailTableViewCellTextKey];
UIFont *cellFont = [UIFont fontWithName:kFontKeyEmondsans size:12.0];
CGSize constraintSize = CGSizeMake(252.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
return labelSize.height;// + 10;
0
VaporwareWolf