当我使用几种不同的方式显示单元格时,是否可以在UITableView Cell中具有不同的高度?

时间:2016-05-15 07:25:07

标签: ios iphone swift uitableview autolayout

我花了几天时间试图解决这个问题,但似乎没有解决方案。我有一个非常基本的UITableView单元格,里面有两个标签。其中一个是一行,第二行是多行。第二个将在高度上变化。以下是我正在尝试生成的示例(UITableViewCells中的UIStackViews):

enter image description here

通过阅读数百篇SO帖子,数百个博客,搜索Apple开发者网站,似乎可以无限制地编写这些内容。在尝试了数百种不同的方法之后,我仍然无法像这样显示文本。我认为有些问题来自于我在一个UITableView中使用 3 不同的UITableView单元格变体。

以下是我最近一次尝试的代码cellForRowAtIndexPath

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

    var cell : UITableViewCell!

    let (parent, isParentCell) = self.findParent(indexPath.row)

    if !isParentCell {

        let categories = ["words", "translation","commentary"]

        if categories[parent] == "words" {

            cell = tableView.dequeueReusableCellWithIdentifier(childWordsCellIdentifier, forIndexPath: indexPath) as UITableViewCell

            // Reset content
            for subview in cell.contentView.subviews {
                subview.removeFromSuperview()
            }
            cell.prepareForReuse()


            let words                   = self.page.valueForKey("words")!.allObjects as! [Word]
            let wordsInOrder            = words.sort({Int($0.order!) < Int($1.order!) })
            let word                    = wordsInOrder[indexPath.row - 1]

            let labelWidth              = (self.view.frame.width - 80) / 2


            let wordLabel               = UILabel(frame: CGRectZero)
            wordLabel.text              = word.valueForKey("sanskrit") as? String
            wordLabel.font              = UIFont(name: "EuphemiaUCAS-Bold", size: 16)
            wordLabel.numberOfLines     = 0
            wordLabel.translatesAutoresizingMaskIntoConstraints = false
            wordLabel.layer.borderColor = UIColor.greenColor().CGColor
            wordLabel.layer.borderWidth = 1.0
            let widthWordConstraint = wordLabel.widthAnchor.constraintEqualToConstant(labelWidth)
            widthWordConstraint.priority = 300
            widthWordConstraint.active = true

            let englishWordLabel           = UILabel(frame: CGRectZero)
            englishWordLabel.text          = "Foobar don't want to play my game with my anymore."
            englishWordLabel.font          = UIFont(name: "STHeitiTC-Light", size: 16)
            englishWordLabel.numberOfLines = 0
            englishWordLabel.preferredMaxLayoutWidth = labelWidth
            englishWordLabel.translatesAutoresizingMaskIntoConstraints = false
            let englishWordConstraint = englishWordLabel.widthAnchor.constraintEqualToConstant(labelWidth)
            englishWordConstraint.priority = 300
            englishWordConstraint.active = true
            englishWordLabel.layer.borderColor = UIColor.blueColor().CGColor
            englishWordLabel.layer.borderWidth = 1.0

            let stackView = UIStackView()
            stackView.axis = .Horizontal
            stackView.distribution = .FillProportionally
            stackView.alignment = .FirstBaseline
            stackView.spacing = 15
            stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
            stackView.layoutMarginsRelativeArrangement = true

            stackView.addArrangedSubview(wordLabel)
            stackView.addArrangedSubview(englishWordLabel)

            stackView.translatesAutoresizingMaskIntoConstraints = false

            englishWordLabel.topAnchor.constraintEqualToAnchor(stackView.topAnchor).active = true
            englishWordLabel.bottomAnchor.constraintEqualToAnchor(stackView.bottomAnchor).active = true


            cell.contentView.addSubview(stackView)

            cell.contentView.layoutIfNeeded()


        } else {

            cell = tableView.dequeueReusableCellWithIdentifier(childCellIdentifier, forIndexPath: indexPath) as UITableViewCell

            // Reset content
            cell.textLabel!.text = ""
            for subview in cell.contentView.subviews {
                subview.removeFromSuperview()
            }
            cell.prepareForReuse()

            cell.textLabel!.text        = self.page.valueForKey(categories[parent]) as? String
            cell.textLabel!.textColor   = UIColor(red: 35/255.0, green: 31/255.0, blue: 32/255.0, alpha: 1.0)
            cell.textLabel!.font        = UIFont(name: "STHeitiTC-Light", size: 16)
        }
    }
    else {
        // Parent
        cell = tableView.dequeueReusableCellWithIdentifier(parentCellIdentifier, forIndexPath: indexPath)
        cell.textLabel!.text        = self.dataSource[parent].title
        cell.textLabel!.textColor   = UIColor(red: 66/255.0, green: 116/255.0, blue: 185/255.0, alpha: 1.0)
        cell.textLabel!.font        = UIFont(name: "STHeitiTC-Light", size: 20)
    }

    cell.selectionStyle                                       = .None
    cell.textLabel!.translatesAutoresizingMaskIntoConstraints = false
    cell.textLabel!.numberOfLines                             = 0
    cell.textLabel!.lineBreakMode = .ByWordWrapping

    return cell
}

产生这个:

enter image description here

11 个答案:

答案 0 :(得分:2)

我建议您不要使用堆栈视图。只需根据您的要求使用Label自定义单元格,单元格将根据标签文本大小自动调整大小。

检查,这里我附上了演示。

UITableview cell Autoresize According to textsize

输出: -

enter image description here

在viewdidload中

super.viewDidLoad()
        self.tblView.estimatedRowHeight = 100;
        self.tblView.rowHeight = UITableViewAutomaticDimension;
        self.tblView.setNeedsLayout()
        self.tblView.layoutIfNeeded()

别忘了设置UILabel属性的Numberoflines=0

enter image description here

编辑: - 如果您需要有关如何将约束设置为UILabel的分步指南,

检查此链接,

Adjust UILabel height depending on the text

编辑: - 此处根据您的上图,我在单元格中选择了2个标签。只需设置这样的约束。

enter image description here

标签1: - 顶部,前导,(高度和宽度根据您的要求)

标签2: - 顶部,底部,从标签1引出,从Superview追踪

答案 1 :(得分:2)

表格视图单元格的高度由表格根据rowHeight属性或表视图委托中optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat的返回值决定。

程序员可以通过其frame属性为UITableViewCell设置的高度被忽略!

因此,您需要以编程方式计算每个单元格的所需高度。然后,您需要从每个单元格的表视图委托中实现optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

如果在显示表格视图时单元格的大小发生变化,则需要:

  • reloadData()
  • 重新加载UITableView的表格
  • 使用func reloadRowsAtIndexPaths(_ indexPaths: [NSIndexPath], withRowAnimation animation: UITableViewRowAnimation)中的UITableView更新单元格。

修改

实际上,因为你在视图中使用约束,所以它应该在不使用``的情况下工作。

尝试将if categories[parent] == "words" { .. }中的代码替换为:

        cell = tableView.dequeueReusableCellWithIdentifier(childWordsCellIdentifier, forIndexPath: indexPath) as UITableViewCell

        // Reset content
        for subview in cell.contentView.subviews {
            subview.removeFromSuperview()
        }
        cell.prepareForReuse()


        let words                   = self.page.valueForKey("words")!.allObjects as! [Word]
        let wordsInOrder            = words.sort({Int($0.order!) < Int($1.order!) })
        let word                    = wordsInOrder[indexPath.row - 1]


        let wordLabel               = UILabel(frame: CGRectZero)
        wordLabel.text              = word.valueForKey("sanskrit") as? String
        wordLabel.font              = UIFont(name: "EuphemiaUCAS-Bold", size: 16)
        wordLabel.numberOfLines     = 0
        wordLabel.translatesAutoresizingMaskIntoConstraints = false
        wordLabel.layer.borderColor = UIColor.greenColor().CGColor
        wordLabel.layer.borderWidth = 1.0

        let englishWordLabel           = UILabel(frame: CGRectZero)
        englishWordLabel.text          = "Foobar don't want to play my game with my anymore."
        englishWordLabel.font          = UIFont(name: "STHeitiTC-Light", size: 16)
        englishWordLabel.numberOfLines = 0

        let stackView = UIStackView()
        stackView.axis = .Horizontal
        stackView.distribution = .FillProportionally
        stackView.alignment = .Fill  // EDIT
        stackView.spacing = 15
        stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
        stackView.layoutMarginsRelativeArrangement = true

        stackView.addArrangedSubview(wordLabel)
        stackView.addArrangedSubview(englishWordLabel)

        stackView.translatesAutoresizingMaskIntoConstraints = false

        cell.contentView.addSubview(stackView)
        cell.contentView.leadingAnchor.constraintEqualToAnchor(stackView.leadingAnchor).active = true
        cell.contentView.topAnchor.constraintEqualToAnchor(stackView.topAnchor).active = true
        cell.contentView.trailingAnchor.constraintEqualToAnchor(stackView.trailingAnchor).active = true
        cell.contentView.bottomAnchor.constraintEqualToAnchor(stackView.bottomAnchor).active = true

        cell.contentView.layoutIfNeeded()

此外,我会为此任务使用两个不同的单元格类,而不是删除contentView中的视图。

请告诉我它是怎么回事!

答案 2 :(得分:1)

您想要实现的目标可以通过tableView委托中的heightForRowAtIndexPath的简单实现来完成。

如果你不确定哪个单元格应该具有什么高度,你可以在运行时计算它。

答案 3 :(得分:1)

为此您需要使用自我调整表格视图单元格,即表格视图本身计算每个单元格所需的高度以显示它的内容可以通过两行代码实现:

步骤1:设置表格视图的估计高度 tableView.estimatedRowHeight = 33.0 step2:将tableView的行高设置为UITableViewAutomaticDimension tableView.rowHeight = UITableViewAutomaticDimension

以下是详细说明http://www.appcoda.com/self-sizing-cells/

的教程

答案 4 :(得分:1)

我将遵循的方法:

我将创建一个UIView SubClass作为container view,其中包含“word label”和“english word label”。它更容易,单独的代码和maintanable。

我将创建一个单元子类,并将此容器视图用作subView of cell'scontent view

然后我会在cellForRowAtIndex中使用这整个设置。

我还将在heightForRow中进行一些代码实现。为了在运行时使单元行动态高度,必须实现此方法heightForRow

示例输出将如下所示,它有一个UIImageView,以及两个UILabel和自定义灰色分隔符。此动态单元格高度基于UILabel中显示的图像高度和字符串长度:

simple dynamic cell height based on what ever image height and what ever image length

我将分享一些代码段供您使用。所以这里有一些容器视图的概念代码示例:

容器视图最重要的约束设置说(VenueViewContainer:UIView)如下所示(对于您的情况,您可以水平制作标签,而不是垂直标签):

"V:|-0-[venueImage]-10-[venueName]-2-[sportName]-10-[lblSeperator(10)]",
"H:|-0-[venueImage]-0-|",
"H:|-20-[venueName]-20-|",
"H:|-20-[sportName]-20-|",
"H:|-0-[lblSeperator]-0-|",

请务必为标签设置以下两个属性:

[lbl setNumberOfLines:0];

[lbl setLineBreakMode:NSLineBreakByWordWrapping];

在VenueViewContainer实现文件中创建一个方法:

/*!This method is responsible for getting view dynamic height .*/

-(float)getViewHeight
{
[self layoutIfNeeded];

CGFloat maxY = 0;

for (UIView *subview in self.subviews) {

    maxY = MAX(CGRectGetMaxY(subview.frame),maxY);

}

return maxY;

}

/*!
 This method is responsible for set up Venue.
 @param venue object
 */

#pragma -mark data population

- (void)setupViewWithVenue:(Venue *)venue
{
    self.venueLabel.text = @"my venue my venue my venue my venue my venue my venue my venue my venue my venue my venue my venue my venue my venue my venue last";

    self.sportName.text = @"my sport my sport my sport my sport my sport  my sport my sport my sport my sport my sport my sport my sport my sport my sport last";

    [self.venueImage setImageWithURLString:venue.venueImageUrl defaultImage:[UIImage imageNamed:@"venueinfo_main"]];

}

现在让我们谈谈自定义单元格。 UITableViewCell子类。实现有点像这样:

    @implementation VenueCellTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {

        self.selectionStyle = UITableViewCellSelectionStyleNone;

        [self setUpContainer];

        [self setUpConstraints];

    }

    return self;
}

/*!
 This method is responsible for set up Container
 */

-(void)setUpContainer{

    aViewContainer = [[VenueViewContainer alloc] initWithFrame:CGRectZero];

    [aViewContainer setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.contentView addSubview:aViewContainer];

}

/*!constraints setup*/

-(void)setUpConstraints{

    /*!
     dictionary of views for autolayout
     */
    NSMutableDictionary* views;

    views = [NSMutableDictionary new];

    UIView *parentView = self.contentView;

    views[@"aViewContainer"] = aViewContainer;

    views[@"parentView"] = parentView;

    NSArray* constraints;

    NSString* format;

    /*!
     layouting horizontal
     */
    format = @"|-0-[aViewContainer]-0-|";

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:views];

    [parentView addConstraints:constraints];

    /*!
     layouting vertical
     */
    format = @"V:|-0-[aViewContainer]-0-|";

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:views];

    [parentView addConstraints:constraints];
}
/*!
 This method is responsible for set up venue
 @param venue object
 */

- (void)setupCellWithVenue:(Venue *)venue
{
    [aViewContainer setupViewWithVenue:venue];
}
/*!
 This method is responsible to get cell height dynamically
 @param venue object
 */

-(float)getCellHeight
{
   return [aViewContainer getViewHeight];
}

这与你的细胞定制相关。

现在谈谈cellForRowheightForRow

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    VenueCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kVenueCellIdentifier];

    if (nil == cell) {
        cell = [[VenueCellTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:kVenueCellIdentifier];
    }

    [cell setBackgroundColor:[[AWPViewFactory sharedInstance]getColor:@"colorWhite"]];

#pragma uncomment below line as per ur need
//    Venue *venue = [_dataSourceArray objectAtIndex:indexPath.row];
    [cell setupCellWithVenue:nil];

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }

    return cell;
}

#pragma mark - UITableViewDelegate methods

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Use the dictionary of offscreen cells to get a cell for the reuse identifier, creating a cell and storing
    // it in the dictionary if one hasn't already been added for the reuse identifier.
    // WARNING: Don't call the table view's dequeueReusableCellWithIdentifier: method here because this will result
    // in a memory leak as the cell is created but never returned from the tableView:cellForRowAtIndexPath: method!
    VenueCellTableViewCell *cell = [self.offscreenCells objectForKey:kVenueCellIdentifier];
    if (!cell) {
        cell = [[VenueCellTableViewCell alloc] init];
        [self.offscreenCells setObject:cell forKey:kVenueCellIdentifier];
    }

    // Configure the cell for this indexPath

#pragma uncomment below line as per ur need

//    Venue *venue = [_dataSourceArray objectAtIndex:indexPath.row];
    [cell setupCellWithVenue:nil];

    return [cell getCellHeight];
}

我不得不在上述方法中使用的几件事情:

1。不使用自动行高计算属性。 2.没有使用估计的高度 3.不需要不必要的updateConstraints。 4.不使用自动首选最大布局宽度。 5.没有使用systemLayoutSizeFittingSize(应该使用但不能为我工作,我不知道它在内部做什么),而是我的方法 - (浮动)getViewHeight工作,我知道它在内部做什么。

我已经分享了你最相关的代码块,我还没有在swift上工作过。但基础仍然相同。 感谢

答案 5 :(得分:1)

首先,除非您需要 UIStackView用于您在问题中未提及的其他目的,否则请勿使用它们。多行标签和动态高度单元在没有它们的情况下工作良好(如果不需要,不要不必要地复杂化代码)。

iOS中没有任何错误可以阻止这种工作,我知道。动态大小的单元格在自动布局中运行良好,您只需在单元格中设置正确的约束并设置表格视图的rowHeightestimatedRowHeight属性。

这对您不起作用的最可能原因是您没有在您的单元格中放置所有必需的约束。所需的限制是:

  1. 从您的单元格内容(即您的多行标签)到单元格内容视图顶部的最高约束
  2. 从单行标签到单元格左侧的主要约束
  3. 从多行标签到单元格右侧的尾随约束
  4. 从多行标签底部到单元格底部的底部约束
  5. 我认为你错过了第4点。

    修改

    根据您的评论,您使用的是UIStackView,以便在单行标签和多行标签之间对齐顶部基线。通过这个,我知道你希望你的标签像这样对齐:

    enter image description here

    要获得此行为,您不需要UIStackView 。只需给出标签约束,以允许多行标签定义单元格高度。下图显示了两个标签之间对齐的顶部基线(即每个标签的第一行对齐)。

    enter image description here

    注意左边标签只需要一个前导和顶部约束,而右边标签需要一个顶部,尾部和底部,因为它定义了单元格高度。

    总之,动态表格视图单元格需要三件事:

    1. tableView.rowHeight = UITableViewAutomaticDimension
    2. tableView.estimatedRowHeight = 100
    3. 单元格内容必须具有所有四个约束(前导,尾随,顶部和底部)才能定义单元格高度。

答案 6 :(得分:1)

这很容易。一步一步走。

<强> 1 即可。设置表视图的estimatedRowHeight。它可以轻松快速地加载单元格。

2 。将tableview的rowHeight属性设置为UITableViewAutomaticDimension.并且不要使用heightForRowAtIndexPath。

3 。输出两个Label.its上的所有顶部底部前导和尾随约束很重要。

让摇滚乐 无需使用stackView

答案 7 :(得分:1)

从iOS 9.1开始UIStackView没有实现intrinsicContentSize:,因此表格视图无法计算每个单元格的高度,因此它们会以估算的高度显示。< / p>

因此,理想情况下,您可以简化代码,以表示您不使用堆栈视图,并且不会一直添加和删除(以及创建和销毁)视图。解决方案的根源是不使用堆栈视图。

如果需要,您可以继续使用堆栈视图,但是您需要创建子类并实现intrinsicContentSize:。不应该使用堆栈视图的原因,因为您可以配置约束以匹配第一个基线。

答案 8 :(得分:1)

正如其他人所提到的那样,请确保您让表格查看单元格动态调整大小:

tableView.estimatedRowHeight = <estimatedHeightValue>
tableView.rowHeight = UITableViewAutomaticDimension

但是你已经提到你已经这样做了。

问题的其余部分是缺少约束的情况。您已经告诉autolayout您希望多行标签与堆栈视图的顶部和底部匹配,如下面的代码所示:

englishWordLabel.topAnchor.constraintEqualToAnchor(stackView.topAnchor).active = true
englishWordLabel.bottomAnchor.constraintEqualToAnchor(stackView.bottomAnchor).active = true

但是您还没有提到自动布局此堆栈视图与单元格内容视图(其超级视图)的关系。这对于动态大小的单元格是必要的,因为根据Apple

  

要定义单元格的高度,您需要一个完整的约束链和视图(具有已定义的高度)来填充内容视图的上边缘和下边缘之间的区域。如果您的视图具有内在的内容高度,系统将使用这些值。如果没有,则必须将适当的高度约束添加到视图或内容视图本身。

您的标签具有内在的内容,因此没有问题,但为了完成“不间断的链条”,&#34;你需要告诉autolayout堆栈视图的顶部和底部应该等于内容视图的顶部和底部,如下所示:

// stackView.superview! is the table view cell's content view
stackView.topAnchor.constraintEqualToAnchor(stackView.superview!.topAnchor).active = true
stackView.bottomAnchor.constraintEqualToAnchor(stackView.superview!.bottomAnchor).active = true

在您将堆栈视图添加到内容视图后添加这两行,我相信您将开展业务。

仅供参考,即使您以编程方式将这些视图添加到您的单元格中,您仍然可以使用Xcode非常棒的Capture View Hierarchy功能在视觉上调试布局问题。当您的应用程序从Xcode运行时,单击菜单项Debug&gt;查看调试&gt;捕获视图层次结构。您可以很容易地看到视图层次结构中发生了什么,活动的约束条件,消失的视图的位置等等。

第二个FYI,每次在屏幕上出现一个单元格时,破坏视图然后重新实例化新视图会在滚动时显着降低性能。尽可能多地,您将希望从出列单元格中获取现有视图,并使用该行的适当内容重新分配其内容(从而避免视图实例化)。您仍然可以使用纯粹编程的方式执行此操作,方法是将单元格出列并为每个可能的视图调用cell.viewWithTag。如果方法返回nil,则会对单元格的视图进行一次性实例化,并为视图提供标记(对于wordLabel,请设置为1,为{{1}设置为2 })。然后将该行的正确内容分配给视图。

答案 9 :(得分:1)

我和autoLayout一次又一次地遇到了类似的问题。我不太多使用stackViews,当我需要添加/删除或显示/隐藏视图时,我通常会使用它们。如果不这样做,我选择使用约束。在很多情况下,我觉得堆栈视图非常错误。特别是在xib中。我不知道为什么会有所不同,但是当使用多个标签时,它似乎总是会导致我无法删除的警告。

话虽如此,autoLayout也不是没有问题,而且它们都主要围绕preferredMaxLayoutWidth

为了解释,为了让AutouLayout计算标签的高度,需要知道标签的宽度。如果您有多个标签,特别是在tableViewCell中,这会导致各种问题。

我问了几天后又回答了一个相关的问题here

我所做的是添加了一个UILabel的子类,它始终确保每当修改标签时都会更新preferredMaxLayoutWidth。我最近更新了iOS 8,iOS 9和我发现的模态视图的单独问题。

所以完整的步骤是:

  1. 创建UIlabel子类。
  2. 创建一个没有UIStackViews铺设标签的单元格。
  3. 根据您的用例,将一个或两个标签的行数设置为0。
  4. 将标签设置为您的子类的类型。
  5. 实施estimatedHeightForRowAtIndexPath方法以猜测高度可能是什么。
  6. 计算heightForRowAtIndexPath内的单元格的高度。

  7. 要计算高度,你可以使用这样的东西(我已经将其抽象为一个可以更容易重用的辅助方法)

    // Set the cell data first, i.e. the label text, any programmatic  fonts, font sizes etc.
    
    
    if let tempCell = cell as? UITableViewCell
    {
        tempCell.width = tableView.width
    
        let size = tempCell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
    
        if tableView.separatorStyle != UITableViewCellSeparatorStyle.None
        {
            // +0.5 for seperator
            return size.height+0.5
        }
        else
        {
            return size.height
        }
    }
    

    我已将此与一个协议相结合,该协议使所有单元格都可以在字典中设置数据。然后我可以结束这个方法来接收并传入一个字典并一遍又一遍地重用代码。

    这对我来说已经很长时间了。

答案 10 :(得分:0)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{


    NSString *firstLable = firstLable.text;
    NSString *secondLable = SecondLable.text;



    CGSize constraint = CGSizeMake(cell.frame.size.width/2, 20000.0f);
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
    CGRect firstLableRect = [firstLable boundingRectWithSize:constraint
                       options:NSStringDrawingUsesLineFragmentOrigin
                       attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Your App Font" size:16.0f],      
                        NSParagraphStyleAttributeName: paragraphStyle.copy} context:nil];


    CGRect secondLableRect = [secondLable boundingRectWithSize:constraint
                              options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Your App Font" size:16.0f],                                       NSParagraphStyleAttributeName: paragraphStyle.copy}context:nil];


    float max = MAX(firstLableRect.size.height, secondLableRect.size.height) + 20;


    //20 for spacing 10 pc above and 10 pc below 


    return max ;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier=@"cellIdentifier";
    UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    cell.selectionStyle =UITableViewCellSelectionStyleNone;



    NSString *lable1 = @"first label text";
    NSString *lable2 = @"second lable text";

    CGSize constraint = CGSizeMake(cell.frame.size.width/2-10, 20000.0f);
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
    CGRect firstLableRect = [lable1 boundingRectWithSize:constraint
                             options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Your App Font" size:16.0f],
                             NSParagraphStyleAttributeName: paragraphStyle.copy} context:nil];


    CGRect secondLableRect = [lable2 boundingRectWithSize:constraint
                              options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Your App Font" size:16.0f],                                       NSParagraphStyleAttributeName: paragraphStyle.copy}context:nil];



    UILabel *firstLable = [[UILabel alloc]initWithFrame:CGRectMake(5,10,constraint.width,firstLableRect.size.height)];
    [firstLable setLineBreakMode:NSLineBreakByWordWrapping];
    firstLable.minimumScaleFactor = 15.0f;
    [firstLable setNumberOfLines:0];
    firstLable.textAlignment = NSTextAlignmentLeft;
    [firstLable setFont:[UIFont fontWithName:@"your App font" size:16.0f]];
    [cell.contentView addSubview:firstLable];


    UILabel *secondLable = [[UILabel alloc]initWithFrame:CGRectMake(cell.frame.size.width/                       2+5,10,constraint.width,secondLableRect.size.height)];
    [secondLable setLineBreakMode:NSLineBreakByWordWrapping];
    secondLable.minimumScaleFactor = 15.0f;
    [secondLable setNumberOfLines:0];
    secondLable.textAlignment = NSTextAlignmentLeft;
    [secondLable setFont:[UIFont fontWithName:@"your App font" size:16.0f]];

    [cell.contentView addSubview:secondLable];

    return cell;
}