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 如何制作UITableViewCell的动态高度_Ios_Swift_Uitableview_Autolayout - Fatal编程技术网

Ios 如何制作UITableViewCell的动态高度

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

我想根据tablecell内容创建
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处调用。我将编辑我的问题。