Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITextView在tableview中不根据内容调整大小_Ios_Swift_Uitableview_Uitextview - Fatal编程技术网

Ios UITextView在tableview中不根据内容调整大小

Ios UITextView在tableview中不根据内容调整大小,ios,swift,uitableview,uitextview,Ios,Swift,Uitableview,Uitextview,我有一个tableView和一个UITextView在里面。我试图将JSON中的数据添加到表视图中,但它并没有根据大小进行收缩/扩展。我尝试了很多论坛和方法 主要问题是-如果它开始随高度膨胀/收缩,它将停止收缩/膨胀,反之亦然。机器人的高度和宽度不工作 这是因为,当我将UITextView的尾随和前导约束设置为单元格时,它开始使用高度,但停止使用宽度。当我删除前导/尾随约束时,UITextView的内容超出屏幕范围,并且不是多行的,即不随高度扩展。我已经尝试过- 还有很多像这样的 我的一点代

我有一个tableView和一个UITextView在里面。我试图将JSON中的数据添加到表视图中,但它并没有根据大小进行收缩/扩展。我尝试了很多论坛和方法

主要问题是-如果它开始随高度膨胀/收缩,它将停止收缩/膨胀,反之亦然。机器人的高度和宽度不工作

这是因为,当我将UITextView的尾随和前导约束设置为单元格时,它开始使用高度,但停止使用宽度。当我删除前导/尾随约束时,UITextView的内容超出屏幕范围,并且不是多行的,即不随高度扩展。我已经尝试过-

还有很多像这样的

我的一点代码-

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "Message") as! TextViewCell
    cell.customTextView.textColor = UIColor.white

    // Give a source to table view cell's label
    cell.customTextView.text = requestResponseArr[indexPath.row]
    cell.translatesAutoresizingMaskIntoConstraints = true
    cell.sizeToFit()        

    if (indexPath.row % 2 == 0) {
        cell.customTextView.backgroundColor = ConstantsChatBot.Colors.iMessageGreen
        cell.customTextView.textAlignment = .right
    } else {
        cell.customTextView.backgroundColor = ConstantsChatBot.Colors.ButtonBlueColor
        cell.customTextView.textAlignment = .left
    }

    return cell
}

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

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

我不希望textview是可编辑的。请用swift回复,因为我不熟悉目标C。谢谢

编辑:自定义单元格代码

class TextViewCell: UITableViewCell {
@IBOutlet weak var customTextView: UITextView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    customTextView.isScrollEnabled = false
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state
}

}

您需要为此禁用
UItextView
滚动

textView.isScrollingEnabled = false
并在单元格中添加textview的顶部、底部、右侧和左侧约束。 并添加高度约束>=10


禁用UITextView
IsScrolEnabled
is
false
inside
cellForRowAt


您需要为textview设置所有四个约束,即前导、尾随、顶部和底部(假设所有约束都从边距设置为8)

它将如下所示:


检查GitHub上的演示

我在
UITableViewCell
中尝试了
UITextView

约束

UITextView
,顶部、底部和右侧为2、2和5,宽度为50<代码>字体大小为13,
对齐
为中心。为
宽度限制提供
出口连接
,如
txtvwwidthcont

UIViewController

@IBOutlet weak var tblView: UITableView!
var textWidthHeightDict = [Int : CGSize]()

override func viewDidAppear(_ animated: Bool) {

    stringValue = [0 : "qwer\nasdasfasdf", 1 : "qwe", 2 : "123123\nasdas\nwqe", 3 : "q\n3\n4", 4 : "klsdfjlsdhfjkhdjkshfjadhskfjhdjksfhkdjsahfjksdhfkhsdfhjksdfjkasklsdfjlsdhfjkhdjkshfjadhskfjhdjksfhkdjsahfjksdhfkhsdfhjksdfjkasklsdfjlsdhfjkhdjkshfjadhskfjhdjksfhkdjsahfjksdhfkhsdfhjksdfjkas"]

    for i in 0..<stringValue.count
    {
        GettingTextViewSize(getStr: stringValue[i]!, fontSize: 14, loopValue: i)
    }
    tblView.reloadData()
}

func GettingTextViewSize(getStr : String, fontSize: CGFloat, loopValue : Int)
{
    var textSize = (getStr as! NSString).size(withAttributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: fontSize)])
    if textSize.width > self.tblView.frame.width
    {
        // IF STRING WIDTH GREATER THAN TABLEVIEW WIDTH
        let multipleValue = textSize.width / self.tblView.frame.width
        textSize.height = (textSize.height * (multipleValue + 1.0))
        textSize.width = self.tblView.frame.width

        textWidthHeightDict[loopValue] = textSize
    }
    else
    {
        textSize.height = textSize.height + 10 //ADDING EXTRA SPACE
        textSize.width = textSize.width + 10 //ADDING EXTRA SPACE

        textWidthHeightDict[loopValue] = textSize
    }
}


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return stringValue.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "table", for: indexPath) as! TblTableViewCell

    cell.backgroundColor = cellBGColr[indexPath.row]

    cell.txtVw.inputAccessoryView = toolBar
    cell.txtVw.text = stringValue[indexPath.row]
    cell.txtVw.tag = indexPath.row
    cell.txtVwWidthConst.constant = (textWidthHeightDict[indexPath.row]?.width)!
    cell.selectionStyle = .none
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    var heightVal = (textWidthHeightDict[indexPath.row])
    return heightVal!.height + 8 //ADDING EXTRA SPACE
}
输出

注意



UITextView
只需计算字符串大小。但是,在
UILabel
中,这个概念非常简单。如果您有任何疑问,请告诉我。

在单元格中,您是否已将textView作为子视图添加到单元格或contentView中?需要将其添加到contentView并在contentView上添加约束是的,我已将其添加到contentView。约束也被添加到contentView中。您可以发布自定义单元格的代码吗?自定义单元格几乎是锅炉板代码。我可以把它寄出去。检查编辑也为什么不使用numberOfLines=0的
UILabel
,而不是上面代码中已有的
UITextView
。查看自定义单元格。也可以通过故事板禁用它。@Aman:你能添加文本视图的高度consriant>=10并检查吗?只需添加并检查它就可以了。它正在将高度固定为一个常量,并且文本在高度上被修剪,因为固定常量将其更改为>=没有效果,如果我使用约束进行操作,则UIText。如果我删除了前导和尾随约束,文本将变为单行。我已经尝试过了。另外,您的演示示例只是一个空项目,只有锅炉板代码,您可以检查每个想法是否存在,或者您可以下载完美的快照,我们需要遵循这一点。谢谢@iParesh。另外,我的建议是不要设置任何高度限制。应该使用“UITableView.automaticDimension”是的,我已经有了。但是,当我有这个,我失去了灵活的宽度属性,因为我已经设置了所有4边的约束。我想宽度是灵活的根据内容内。例如,在您发布的图片中,第一个单元格中有“一些文本”。但是电池正在扩展到全屏幕宽度。我希望单元格仅扩展到文本的宽度。当我删除4个边上的4个限制条件时,宽度问题得到修复,但高度问题开始出现,UITextView变成单线,并脱离屏幕。是否希望类似ap的聊天应用程序?如果是,则需要两个单元格,其中左侧具有所需空间常量值的约束,另一侧具有所需空间值的右侧约束常量。e、 如果你想要30px的空间。让我知道更多的解释。我已经在一个单元格中使用了两个标签或两个UITextView。我正在重构代码以使用1 UITextView。无论如何,感谢Github演示@McDonald_11已经提出了我想要的答案,而且很有效。太好了……:)我能够使它与标签一起工作;是的,很简单。我还能够在一个单元格中使用2个文本视图/2个标签,一个在左侧,一个在右侧。但我想重构代码,让它与1文本视图一起工作。我上面提到的hack,甚至使它能够与1uitextview一起工作,就是将它放在堆栈中,并以编程方式更改堆栈的对齐方式和填充类型。这使得它可以像我所希望的那样使用单个文本视图。但对我来说,这就像是一个黑客。所以我想要一个你建议的替代方案。谢谢它起作用了
@IBOutlet weak var tblView: UITableView!
var textWidthHeightDict = [Int : CGSize]()

override func viewDidAppear(_ animated: Bool) {

    stringValue = [0 : "qwer\nasdasfasdf", 1 : "qwe", 2 : "123123\nasdas\nwqe", 3 : "q\n3\n4", 4 : "klsdfjlsdhfjkhdjkshfjadhskfjhdjksfhkdjsahfjksdhfkhsdfhjksdfjkasklsdfjlsdhfjkhdjkshfjadhskfjhdjksfhkdjsahfjksdhfkhsdfhjksdfjkasklsdfjlsdhfjkhdjkshfjadhskfjhdjksfhkdjsahfjksdhfkhsdfhjksdfjkas"]

    for i in 0..<stringValue.count
    {
        GettingTextViewSize(getStr: stringValue[i]!, fontSize: 14, loopValue: i)
    }
    tblView.reloadData()
}

func GettingTextViewSize(getStr : String, fontSize: CGFloat, loopValue : Int)
{
    var textSize = (getStr as! NSString).size(withAttributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: fontSize)])
    if textSize.width > self.tblView.frame.width
    {
        // IF STRING WIDTH GREATER THAN TABLEVIEW WIDTH
        let multipleValue = textSize.width / self.tblView.frame.width
        textSize.height = (textSize.height * (multipleValue + 1.0))
        textSize.width = self.tblView.frame.width

        textWidthHeightDict[loopValue] = textSize
    }
    else
    {
        textSize.height = textSize.height + 10 //ADDING EXTRA SPACE
        textSize.width = textSize.width + 10 //ADDING EXTRA SPACE

        textWidthHeightDict[loopValue] = textSize
    }
}


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return stringValue.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "table", for: indexPath) as! TblTableViewCell

    cell.backgroundColor = cellBGColr[indexPath.row]

    cell.txtVw.inputAccessoryView = toolBar
    cell.txtVw.text = stringValue[indexPath.row]
    cell.txtVw.tag = indexPath.row
    cell.txtVwWidthConst.constant = (textWidthHeightDict[indexPath.row]?.width)!
    cell.selectionStyle = .none
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    var heightVal = (textWidthHeightDict[indexPath.row])
    return heightVal!.height + 8 //ADDING EXTRA SPACE
}
class TblTableViewCell: UITableViewCell {
    @IBOutlet weak var txtVw: UITextView!
    @IBOutlet weak var txtVwWidthConst: NSLayoutConstraint!
    // TEXTVIEW WIDTH CONSTRAINTS    


    override func awakeFromNib() {
       super.awakeFromNib()
    }
}