[英]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.