简体   繁体   中英

Dynamic Table view cell height for iOS 7

I have a view controller containing tableview. Table view consists of custom cell containing single label. I have text of varying length which are to be shown in those cells. The problem i am facing is that, the cells are not getting expanded to the appropriate height. I have tried many solutions present in SO but none of them are working so far. Here is the code for view controller

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 class is subclass of UITableViewCell . It contains UILabel named itemLabel.

Please try this in custom cell call this from TableviewDelegate method of height to calculate custom cell height.

Code:
let size = sizingCell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

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

This requires Autolayout to be enabled and constraints to be properly set.

Here I have write code in Objective-C but you can modify it easily in swift.

1 )First of all set the label's constraint like this:

在此输入图像描述

2) Implement below method in your customCell.m file

- (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) Make some changes in cellForRow and HeightForRow methods like below :

-(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 ) In viewDidLoad make some change :

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

Try this code, its working for me,

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
            }

    }

if you get the boundingRect value, then return its dynamically change the height of UITableView, hope its helpful

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM