簡體   English   中英

如何更改表格行的高度以適合UILabel

[英]How to change height of table row to fit UILabel


我正在編寫一個消息傳遞應用程序,它具有一個在兩個用戶之間輸出消息的表視圖。 我遇到的問題是調整表行的大小以適合整個UILabel。 截至目前,我還沒有連接數據庫來顯示任何消息,只是預定義的字符串充當虛假消息,以確保表行的大小正確調整。
我有一個確定文本標簽所需高度的函數,但是我無法使每行調整到此約束的大小。 感謝您的時間
碼:

//
//  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()

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! chatTableViewCell
    cell.messageLabel?.text = self.messages.objectAtIndex(indexPath.row) as? String
    print(requiredHeight(self.messages.objectAtIndex(indexPath.row) as! String))

    tableView.estimatedRowHeight = requiredHeight(self.messages.objectAtIndex(indexPath.row) as! String)
    tableView.rowHeight = UITableViewAutomaticDimension

    return cell
}

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
}

override func viewDidLoad() {
    super.viewDidLoad()
    let receivedUsername = NSUserDefaults.standardUserDefaults().stringForKey("usernameToMessageWith")
    testLabel.text = "\(receivedUsername! as String)"
    messages.addObject("dfsdfdfsdfsdfsdf")
    messages.addObject("You: and i i iiiknkjdf lorem ipsum i really like economics class because i can program as opposed to actually doing work")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

}

我強烈建議您使用xib文件並在那里設置自動布局。 然后,您的估計身高將按預期工作。

除此之外,您可以簡單地返回計算出的高度,以heightForRowAtIndexPath形式調用它。 這樣,您將為每個單元格使用單獨的高度。 例如:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
        return requiredHeight(self.messages.objectAtIndex(indexPath.row) as! String)
}

同樣,我會先嘗試自動布局。

我希望我能正確理解。 查看您的代碼后,我建議以下內容:

使用自動版式。

設置與uitableviewcell相關的尾隨/前導和頂部/底部約束的子視圖。

然后,可以通過激活一次使用Apple的AutomaticDimension功能。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    self.tableView.estimatedRowHeight = 44.0
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.reloadData()
}

不要在原型單元中使用自定義行高功能。 不要自動計算行高。 一次將rowHeight設置為UITableViewAutomaticDimension,而不是在cellForRowAtIndexPath方法中。

一切都應該正常工作。

根據您的評論,解決方案的其他步驟:請檢查:UILabel屬性:“行”應設置為“ 0”,“換行符”應設置為“自動換行”

在情節提要表視圖單元格檢查器中,您可以看到單元格行高是固定的。 因此,在視圖中確實已加載,將情節提要中的估計行高設置為1,並設置行高以自動獲得其高度。 同時檢查情節提要中的標簽,並將“行數”設置為0以顯示多行。

override func viewDidLoad() {
     super.viewDidLoad()

     tableView.estimatedRowHeight = tableView.rowHeight
     tableView.rowHeight = UITableViewAutomaticDimension
}

您應該通過情節提要或以編程方式將UILayout的自動布局約束應用於UILabel 設置約束為零 還將寬高比應用於UILabel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM