2016-10-05 1 views
1

Ich habe UITableViewCell und innerhalb dieser Zelle habe ich eine UITextView. Wenn ich den Text von UITextView ändern möchte ich die Zelle Höhe Echtzeit ändern?Kann ich die Höhe von UITableViewCell in Echtzeit ändern?

Wie kann ich das tun? Vielen Dank.

+1

Sie brauchen Selbst Zellen Ändern der Größe. Schauen Sie in dieses Tutorial https://www.appcoda.com/self-sizing-cells/ – vishnuvarthan

+0

Nein, ich weiß über diesen Trick. Ich versuche, nach dem Einrichten der Tabellenansicht die Tabellenansichtszelle zu ändern. –

+0

Könnten Sie den Code von dem, was Sie bisher versucht haben, posten? –

Antwort

0

Wenn Sie automatische Layout verwenden, um Ihre Zellen Höhe zu berechnen, ich denke, Sie müssen nur reloadData() Methode auf Ihrem TableView verwenden.

0

Referenz von: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

Sie müssen Berechne die Höhe der Zelle nach dem Auto-Layout. Teile meinen ich nach dem Anordnen der inneren Ansichten Breite/Höhe basierend auf dem bereitgestellten Text.

Folgen Sie der Lösung:

Erste hinzufügen UITableView Delegatmethode unten in View-Controller,

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

berechnen Zelle Höhe in heightForRowAtIndexPath: Delegatmethode:

* Dies ist wichtig, * : Denken Sie daran, dass Sie die Werte der Zelle label und textView genauso zuweisen wie in cellForRowAtIndexPath del Egate-Methode.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
NSString *cellIdentifier = [NSString stringWithFormat:@"CustomCell%d%d",(int)indexPath.section, (int)indexPath.row]; 

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 

    // Set cell label text same like you did in `cellForRowAtIndexPath` 
    // For example 
    NSString *name = [self.dataArray objectAtIndex:indexPath.row]; 
    cell.nameLabel.text = name; 
    cell.textView.text = @"This is long text....."; 

    [cell setNeedsUpdateConstraints]; 
    [cell updateConstraintsIfNeeded]; 
    cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds)); 

    [cell setNeedsLayout]; 
    [cell layoutIfNeeded]; 

    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 
    height += 5; 

    return height; 
} 

Nun, wenn Sie CustomCell unter Einschränkungen in initWithStyle: Zelle Methode hinzufügen erstellt haben

// Other controls initialisation and creation code 
// .... 
// TextView control setup 

[self.textView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
// Above line is very important otherwise below constraint wont work 
// Because by default it uses auto size constraints 


// Other controls constraints 
// .... 

[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[textView]-10-|" options:0 metrics:nil views:@{@"textView" : self.textView}]]; 

NSLayoutConstraint *pinToBottom = [NSLayoutConstraint constraintWithItem:self.textView 
                   attribute:NSLayoutAttributeBottom 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:self.contentView 
                   attribute:NSLayoutAttributeBottom 
                   multiplier:1 
                   constant:0]; 
[self.contentView addConstraint:pinToBottom]; 

Und fügen Sie unter Delegatmethode

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    [self.contentView setNeedsLayout]; 
    [self.contentView layoutIfNeeded]; 

    self.textView.preferredMaxLayoutWidth = CGRectGetWidth(self.textView.frame); 
} 

Aber wenn Sie keine benutzerdefinierten Zelle erstellt haben und Sie Wenn Sie eine Zelle aus dem Storyboard verwenden, fügen Sie der superView (Inhaltsansicht der Zelle) die bottom constraint hinzu.

enter image description here

2

Die Grundidee dieser Lösung ist die Textview Höhe und weist es seine Reihe zu berechnen.

Hinweis: Das ist Swift 3-Code:

class ViewController: UIViewController { 

    // array containing rows heights: 
    var rowHeights = [CGFloat]() 

    @IBOutlet weak var tableView: UITableView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // fill it with default values of row heights 
     for _ in 1...10 { 
      rowHeights.append(44) 
     } 
    } 
} 

extension ViewController: UITableViewDataSource, UITableViewDelegate { 
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     return rowHeights[indexPath.row] 
    } 


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // return the actual number of your rows... 
     return 10 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "TextViewTableViewCell") as! TextViewTableViewCell 

     // assgin the tag of current text view to use for determining the current cell's height 
     cell.textView.tag = indexPath.row 

     cell.textView.delegate = self 

     return cell 
    } 
} 

extension ViewController: UITextViewDelegate { 
    func textViewDidChange(_ textView: UITextView) { 

     // calculate the current height and append it in the rowHeights depends on the textView's tag. Add your the textView fontSize instead of 15 
     rowHeights[textView.tag] = (textView.text?.heightWithConstrainedWidth(width: tableView.frame.size.width, font: UIFont.systemFont(ofSize: 15)))! 

     // for updating the tableView appearence (don't use "reloadData", it will resignFirstResponder the textView) 
     tableView.beginUpdates() 
     tableView.endUpdates() 

     textView.setContentOffset(CGPoint.zero, animated: true) 

     //textView.becomeFirstResponder() 
    } 
} 

extension String { 
    // this method calculates the height of string depending on your view width and font 
    func heightWithConstrainedWidth(width: CGFloat, font: UIFont) -> CGFloat { 
     let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) 
     let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 

     return boundingBox.height 
    } 
} 

CustomTableViewCell:

class TextViewTableViewCell: UITableViewCell { 
    @IBOutlet weak var textView: UITextView! 
} 

Die Ausgabe sollte wie folgt aussieht:

enter image description here

Hoffnung, dass geholfen.

0

Rufen Sie diese Methode von cellForRowAtIndexPath Delegierten

(CGSize)attributedText:(NSAttributedString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size 
{ 
     return [self textViewHeightForAttributedText:text constrainedToSize:size]; 
} 

Diese Methode gibt Ihnen die Höhe Ihrer Zelle.

(CGSize)textViewHeightForAttributedText: (NSAttributedString*)text constrainedToSize:(CGSize)size 
    { 
     UITextView *calculationView = [[UITextView alloc] init]; 
     [calculationView setAttributedText:text]; 
     CGSize size1 = [calculationView sizeThatFits:size]; 
     return size1; 
    } 

Mit dieser Anweisung in cellForRowAtIndexPath

CGSize textSize = {tableView.frame.size.width-70, 10000.0 }; 
CGSize size1 =[self attributedText:attrString sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:14] constrainedToSize:textSize]; 
Verwandte Themen