2016-05-05 123 views
1

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

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

+0

set itemLabel的LIne = 0的数量和换行模式换行和UITableviewAutomaticDimention –

+0

iOS 7支持'Swift'吗? – AechoLiu

+1

@AechoLiu yes yes – idocode

回答

3

请在自定义单元格中调用此方法从TableviewDelegate方法的高度计算自定义单元格高度。

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

+0

谢谢!我正在做prototypeCell。 ** contentView ** .systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)。 – idocode

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

这需要Autolayout启用和约束,以正确设置。

+1

这只适用于iOS 8.0+,而我需要iOS 7.0的解决方案 – idocode

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; 
} 
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的高度,希望它的帮助

相关问题