2016-10-05 19 views
1

私はUITableViewCellを持っていて、そのセルの中にはUITextViewがあります。 UITextViewのテキストを変更するときに、セルの高さをに変更したいですか?UITableViewCellの高さをリアルタイムで変更できますか?

どうすればいいですか?ありがとう。

+1

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

使用このステートメントは、あなたは自己の細胞のサイズを変更する必要があります。このチュートリアルをご覧くださいhttps://www.appcoda.com/self-sizing-cells/ – vishnuvarthan

+0

いいえ、私はそのトリックについて知っています。私はテーブルビューを設定した後にテーブルビューセルを変更しようとします。 –

+0

あなたは今まで試みたことのコードを投稿できますか? –

答えて

0

セルの高さを計算するために自動レイアウトを使用している場合、私はあなたのtableViewでreloadData()メソッドを使用する必要があると思います。

0

リファレンスfrom:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

オートレイアウト後のセルの高さを計算します。提供されたテキストに基づいて内側のビューの幅/高さを配置した後のことを意味します。

は、ソリューションに従ってください: * THISが重要な

*:

まず

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

heightForRowAtIndexPath:デリゲートメソッドで計算セルの高さ、ビューコントローラでは、以下のUITableViewデリゲートメソッドを追加します:セルラベルとtextViewの値をcellForRowAtIndexPath delと同じように割り当てることを忘れないでくださいegateメソッド。今

- (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; 
} 

あなたがCustomCellは、細胞のinitWithStyle:方法

// 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]; 

に制約の下に追加して、デリゲートメソッド

- (void)layoutSubviews { 
    [super layoutSubviews]; 

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

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

の下に追加します。しかし、あなたは、カスタムセルを作成していない場合、あなたが作成した場合Storyboardのセルを使用して、スーパービュー(セルのコンテンツビュー)にボトム拘束を追加します。

enter image description here

2

この溶液の主なアイデアは、のTextViewの高さを計算することであり、その行に割り当てます。

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::これはスウィフト3コードである

enter image description here

助け希望:

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

出力は次のようになります必要があります。

0

コール

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

cellForRowAtIndexPathデリゲートからこの方法では、この方法では、あなたのセルの高さを与えます。 cellForRowAtIndexPath

CGSize textSize = {tableView.frame.size.width-70, 10000.0 }; 
CGSize size1 =[self attributedText:attrString sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:14] constrainedToSize:textSize]; 
関連する問題