【问题标题】:How to get UITableViewCell to fit entire TextView, regardless of size of text?无论文本大小如何,如何让 UITableViewCell 适合整个 TextView?
【发布时间】:2015-11-22 10:38:26
【问题描述】:


我试图在每个表格单元格中显示一个文本字段。问题是我似乎无法让 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()

    }

}

我完全不知道该怎么做。请不要因为我可悲的搞砸范围尝试而取笑我。

【问题讨论】:

  • 如果文本不可编辑,请使用 UILabel。

标签: ios xcode swift uitableview


【解决方案1】:

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

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

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

文本字段的可能解决方法:

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

【讨论】:

    【解决方案2】:

    代码

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

    仅适用于 iOS > = 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 label.frame.height + 20
    

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

    编辑
    如何使用

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

    【讨论】:

    • 非常感谢您的帮助,您的功能看起来很有潜力。我做了很少的谷歌搜索,无法提供有关如何使用 heightforRowAtIndex 方法的任何信息。我只是将 heightForRowAtIndex(requiredHeightVar) 放在 viewDidLoad() 或 tableView 方法中吗?谢谢
    • func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -&gt; CGFloat { return requiredHeight("your dynamic text to be displayed") }一样把这个方法放到tableView的heightForRowAtIndex中
    • heightForRowAtIndexPath 是您需要在视图控制器类中使用的 tableView 数据源方法。检查编辑的答案
    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2010-10-18
    • 1970-01-01
    • 2014-12-27
    • 2017-01-07
    相关资源
    最近更新 更多