如何让UITableViewCell适合整个TextView,无论文本大小如何?

时间:2015-11-22 10:38:27

标签: ios xcode swift uitableview


我试图在每个表格单元格中显示一个文本字段。问题是我似乎无法使UITableViewCell足够高以适应整个TextView。 UITableViewCell不需要是动态的,因为数据在视图的加载下被加载到UITextView中。
这是我的代码:

//
//  chatViewController.swift
//  collaboration
//
//  Created by nick on 11/21/15.
//  Copyright © 2015 Supreme Leader. All rights reserved.
//

import UIKit

class chatViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    @IBOutlet weak var testLabel: UILabel!

    var messages: NSMutableArray = NSMutableArray()

    var authors: NSMutableArray = NSMutableArray()

    func tableView(tableView: UITableView, numberOfRowsInSection Section: Int) -> Int {
        return self.authors.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! chatTableViewCell
        cell.authorLabel?.text = self.authors.objectAtIndex(indexPath.row) as? String
        return cell
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let receivedUsername = NSUserDefaults.standardUserDefaults().stringForKey("usernameToMessageWith")
        testLabel.text = "\(receivedUsername! as String)"
        authors.addObject("")
        authors.addObject("You:")
        CGRect frame = messagesTextView.frame;
        frame.size = messagesTextView.contentSize;
        messagesTextView.frame = frame;
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

}

我完全不知道如何去做这件事。请不要因为我可怜的搞砸范围尝试取笑我。

2 个答案:

答案 0 :(得分:2)

如果您使用的是textField,则必须以编程方式计算高度,并在显示单元格时进行设置。如果它不可编辑,但您可以使用UILabel执行以下操作。

viewDidLoad设置tableView.estimatedRowHeight = <expected height>tableView.rowHeight = UITableViewAutomaticDimension

在自定义单元格中,您需要将UILabel顶部和底部的布局约束设置为contentView的边缘,并将UILabels lines设置为0

textfield的可能解决方法:

同时使用文本字段和UILabel,并将UILabels文本颜色设置为清除颜色。这样您就可以使用UILabel来调整高度,但仍然具有文本字段的功能。

答案 1 :(得分:1)

代码

tableView.estimatedRowHeight = <expected height> 
tableView.rowHeight = UITableViewAutomaticDimension

仅适用于 iOS&gt; = 8

如果您想使代码与 iOS 7.x 兼容,您也可以尝试下面的代码 如果文本不可编辑,建议使用 UILabel 而不是textview或textfield。以下是使用 UILabel 计算高度的解决方法。

提供您正在使用的字体名称以及使用的字体大小完全相同。你保留的。

func requiredHeight(text:String) -> CGFloat{
    let font = UIFont(name: "Helvetica", size: 16.0)
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, 200, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()
    return label.frame.height + //Add some space as a part of your bottom and top constraint
}

假设您的标签的顶部和底部约束分别为10和10,它们将return语句设为:

return label.frame.height + 20

heightForRowAtIndex 中调用此方法,并将文本作为参数传递给那里。它将根据计算返回动态高度。

编辑
如何使用

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return requiredHeight("Your text")
}