iOS 7的动态表格视图单元格高度

时间:2016-05-05 09:27:45

标签: ios swift uitableview

我有一个包含tableview的视图控制器。表视图由包含单个标签的自定义单元格组成。我有不同长度的文本,将在这些单元格中显示。我面临的问题是,细胞没有扩展到适当的高度。我在SO中尝试了很多解决方案,但到目前为止它们都没有。 这是视图控制器的代码

class ViewController: UIViewController {

    @IBOutlet var tableView: UITableView!

    let items = [
        "This is the first text",
        "This is the first text and this is the second text","now you may be thinking where is the third text?. Well, There was the first text and second text, now here is the third text",
        "This is the fourth short and sweet text",
        "Slow down you crazy child, you're so ambitious for a juvenile. If you're so smart, tell me why are you still so afraid.","Where's the fire? What's the hurry about. You better cool it off before you burn it out. There's so much to do and so many hours in a day.You got your passion, got your pride. Don't you know that only fools are satisfied. Dream on but don't imagine that they come true. Don't even realise vienna waits for you"]

    var prototypeCell:CustomCell!

    override func viewDidLoad() {
        super.viewDidLoad()

        //setting up tableview
        self.tableView.allowsSelection = false
        self.tableView.dataSource = self
        self.tableView.delegate = self

        configurePrototypeCell()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func configureCell(cell:CustomCell, forIndexPath indexPath:NSIndexPath)
    {
        cell.itemLabel.text = items[indexPath.row]

    }


    func configurePrototypeCell()
    {
        self.prototypeCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell
    }


}

extension ViewController:UITableViewDataSource
{
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell
        configureCell(cell, forIndexPath: indexPath)
        return cell

    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
}

extension ViewController: UITableViewDelegate
{

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        self.prototypeCell.itemLabel.text = items[indexPath.row]
        self.prototypeCell.itemLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.tableView.frame)

        self.prototypeCell.setNeedsLayout()
        self.prototypeCell.layoutIfNeeded()


        let size = self.prototypeCell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
        let height = size.height
        return height


    }

    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

}

CustomCell类是UITableViewCell的子类。它包含名为itemLabel的UILabel

4 个答案:

答案 0 :(得分:3)

请在自定义单元格中尝试此操作,从TableviewDelegate高度方法调用此方法来计算自定义单元格高度。

<强>代码:
let size = sizingCell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

答案 1 :(得分:0)

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.estimatedRowHeight = 40;
    tableView.rowHeight = UITableViewAutomaticDimension;
}

这需要启用Autolayout并正确设置约束。

答案 2 :(得分:0)

这里我在Objective-C中编写了代码,但您可以在swift中轻松修改它。

1)首先设置标签的约束如下:

enter image description here

2)在customCell.m文件中实现以下方法

- (CGFloat)requiredHeight
{
    CGSize size = [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    NSLog(@"Size :%@",NSStringFromCGSize(size));
    CGFloat minimumHeight = 40.0f; //cell height which you have taken in xib
    if (size.height < minimumHeight)
    {
        return minimumHeight;
    }
    return size.height;
}

3)对cellForRow和HeightForRow方法进行一些更改,如下所示:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.itemLabel.preferredMaxLayoutWidth = tableView.bounds.size.width -36; //Here 36 indicates Leading and Trailing distance of label which you have put in xib
    [cell.itemLabel updateConstraintsIfNeeded];

    return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

     return [viewAllCell requiredHeight]+[self calculateLabelHeightforText:viewAllCell.Lblname.text andFonts:viewAllCell.Lblname.font andWidth:viewAllCell.Lblname.frame.size.width]-default label height; //
}
-(float)calculateLabelHeightforText:(NSString *)text andFonts:(UIFont *)font andWidth:(float)width
{
    if (text==nil) {
        return 40; //default height
    }
    NSAttributedString *attributedText = [[NSAttributedString alloc]initWithString:text attributes:@{NSFontAttributeName:font}]
    ;
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height+4;
}

4)在viewDidLoad中进行一些更改:

- (void)viewDidLoad {
 [super viewDidLoad];
 self.TblDetail.rowHeight = UITableViewAutomaticDimension;
  self.TblDetail.estimatedRowHeight = 40.0;
}

答案 3 :(得分:0)

试试这段代码,它适合我,

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

            let str : String! = items[indexPath.row]

            let boundingRect = str.boundingRectWithSize(CGSizeMake(tableView.frame.size.width - 100, CGFloat.max),
                options:NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: UIFont(name: "Arial", size: 14.0)!], context:nil).size.height + 45.0

            if(boundingRect > 95.0) {
                return boundingRect
            } else {
                return 95
            }

    }

如果你得到boundingRect值,那么返回它动态改变UITableView的高度,希望它有用