Ios 如何制作UITableViewCell的动态高度
我想根据tablecell内容创建Ios 如何制作UITableViewCell的动态高度,ios,swift,uitableview,autolayout,Ios,Swift,Uitableview,Autolayout,我想根据tablecell内容创建UITableViewCell的动态高度 但我不能 import UIKit class WorkItemCell: UITableViewCell{ @IBOutlet weak var item_view: UIView! @IBOutlet weak var minimum_startday_label: CustomLabel! @IBOutlet weak
UITableViewCell
的动态高度
但我不能
import UIKit
class WorkItemCell: UITableViewCell{
@IBOutlet weak var item_view: UIView!
@IBOutlet weak var minimum_startday_label: CustomLabel!
@IBOutlet weak var catchcopyLabel: CustomLabel!
@IBOutlet weak var stationLabel: UILabel!
@IBOutlet weak var paymentLabel: UILabel!
@IBOutlet weak var limitLabel: UILabel!
@IBOutlet weak var mainjobLabel: UILabel!
@IBOutlet weak var companyLabel: UILabel!
@IBOutlet weak var workstartdateLabel2: UILabel!
@IBOutlet weak var fav_view: ImageWithView!
@IBOutlet weak var img_seen_view: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
//self.fav_view = ImageWithView.instance()
self.fav_view.checkedImage = UIImage(named: "fav_on")
self.fav_view.uncheckedImage = UIImage(named: "fav_off")
}
override func layoutSubviews() {
super.layoutSubviews()
self.contentView.layoutIfNeeded()
self.catchcopyLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.catchcopyLabel.bounds)
}
private var _workdic: NSDictionary?
var workdic: NSDictionary? {
get {
return _workdic
}
set(workdic) {
_workdic = workdic
if let workdic = workdic {
let workplace = workdic["WorkPlace"] as? String
let companyname = workdic["CompanyName"] as? String
let jobname = workdic["JobName"] as? String
let payment = workdic["Payment"] as? String
let workstartdate = workdic["WorkStartDate"] as? String
let workdatetime = workdic["WorkDateTime"] as? String
let minimumday = workdic["MinimumWorkDay"] as? String
let applyenddate = workdic["ApplyEndDate"] as? String
let catchcopy = workdic["CatchCopy"] as? String
if notnullCheck(catchcopy){
//行間
let attributedText = NSMutableAttributedString(string: catchcopy!)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 5
paragraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTail
attributedText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedText.length))
self.catchcopyLabel.attributedText = attributedText
}
self.catchcopyLabel.sizeToFit()
if let payment_constant = payment{
self.paymentLabel.text = payment_constant
}
if notnullCheck(minimumday) && notnullCheck(workstartdate){
self.minimum_startday_label.text = minimumday!+" "+workstartdate!
}else{
self.minimum_startday_label.text = ""
}
if let applyenddate_constant = applyenddate{
self.limitLabel.text = applyenddate_constant
}
if let jobname_constant = jobname{
self.mainjobLabel.text = jobname_constant
}
if let workdatetime_constant = workdatetime{
self.workstartdateLabel2.text = workdatetime_constant
}
if let companyname_constant = companyname{
self.companyLabel.text = companyname_constant
}
self.stationLabel.text = workplace
self.item_view.sizeToFit()
}
}
}
class func heightForRow(tableView: UITableView, workdic: NSDictionary?) -> CGFloat {
struct Sizing {
static var cell: WorkItemCell?
}
if Sizing.cell == nil {
Sizing.cell = tableView.dequeueReusableCellWithIdentifier("WorkItemCell") as? WorkItemCell
}
if let cell = Sizing.cell {
cell.frame.size.width = CGRectGetWidth(tableView.bounds)
cell.workdic = workdic
cell.setNeedsDisplay()
cell.layoutIfNeeded()
let size = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
print(size)
return size.height+1
}
return 0
}
}
以上代码具有项目视图。
它有所有的标签和图像。
它在4个点(顶部、左侧、底部、右侧)设置边距5px
我使用上面的单元格作为数据列表。
大约有5000支
捕获拷贝标签通常设置为两行句子。
我想更改每个catch\u copy\u标签的高度的项目视图高度和单元格高度
但我不能。
我总是得到同样的高度,26px
(366.5, 26.0)
(366.5, 26.0)
我该怎么办
我已经添加了视图控制器源代码的一部分
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
if self.int_total == 0{
return self.view.frame.size.height
}else{
if let workdic: AnyObject = workdata.safeObjectAtIndex(indexPath.row){
return WorkItemCell.heightForRow(self.workview, workdic: (workdic as! NSDictionary),base_height:170)
}else{
return 199
}
}
}
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 199
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.int_total == 0{
return 1
}
return self.workdata.count
}
/*
Cellに値を設定する.
*/
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Cellの.を取得する.
if self.int_total > 0{
let cell = workItemCell(tableView, cellForRowAtIndexPath: indexPath, str_xib: "WorkItemCell")
return cell
}else{
let nocell: NoCountCell = tableView.dequeueReusableCellWithIdentifier("NoCountCell", forIndexPath: indexPath) as! NoCountCell
nocell.conditionButton.addTarget(self, action: "onClickBack:", forControlEvents: .TouchUpInside)
//初期が終わったらfalse
if self.init_loading{
nocell.conditionButton.hidden = true
nocell.messageLabel.hidden = true
}else{
nocell.conditionButton.hidden = true
nocell.messageLabel.hidden = false
}
return nocell
}
}
func workItemCell(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath,str_xib:String) ->WorkItemCell{
let wcell: WorkItemCell = tableView.dequeueReusableCellWithIdentifier(str_xib, forIndexPath: indexPath) as! WorkItemCell
wcell.separatorInset = UIEdgeInsetsZero
wcell.selectionStyle = UITableViewCellSelectionStyle.None
updateCell(wcell, atIndexPath: indexPath)
return wcell
}
func updateCell(cell:UITableViewCell,atIndexPath:NSIndexPath){
}
func showWorkItem(wcell:WorkItemCell,workdic:NSDictionary){
wcell.workdic = workdic
}
我已经发布了捕获。
这在目标C中。计算
heightForRowAtIndexPath
方法中单元格内容的高度,将其添加到一个数组中,如下所示:
- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
text =[NSString stringWithFormat:@"%@",[content_array objectAtIndex:indexPath.row]];
CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tblView.frame.size.width - PADDING * 3, 1000.0f)];
NSLog(@"%f",textSize.height);
[height_Array addObject:[NSString stringWithFormat:@"%f", textSize.height]];
return textSize.height;
}
现在在cellforrowatinexpath
方法中,使用高度数组将标题框设置为:-
CGRect newFrame = txtTitle.frame;
newFrame.size.height = [[height_Array objectAtIndex:indexPath.row] floatValue];
txtTitle.frame = newFrame;
我终于得到了答案。
但我已经手动计算了高度
我每次都计算标签的高度。
这个标签有多行。
然后我设置高度,其他高度+计算的高度
class func heightForCatchCopy(tableView: UITableView, workdic: NSDictionary?) -> CGFloat {
struct Sizing {
static var cell: WorkItemCell?
}
if Sizing.cell == nil {
Sizing.cell = tableView.dequeueReusableCellWithIdentifier("WorkItemCell") as? WorkItemCell
}
if let cell = Sizing.cell {
cell.frame.size.width = CGRectGetWidth(tableView.bounds)
cell.workdic = workdic
let size = cell.catchcopyLabel.intrinsicContentSize()
return size.height
}
return 0
}
打印(大小)
的控制台输出是什么?我看不出您在哪里设置大小的内容来计算高度?@ShebinKoshy的输出如下。(284.5,0.0)(284.5,0.0)(284.5,0.0)(284.5,0.0)(284.5,0.0)(284.5,0.0)(284.5,0.0)(284.5,0.0)@anhtu我已经将单元格的高度设置为xib。但我没有设置item_视图的高度。您不应该在数组中添加对象,因为若重新加载表,此方法将再次调用,对象将加倍。所以每次重新加载表之前,都必须删除所有对象。您可以在解析数据时执行相同的操作。因此,如果需要,您可以使用实际数据所在的主数组。heightForRow方法在heightForRowAtIndexPath处调用。我将编辑我的问题。