首页>Program>source

我有一个具有五个静态单元格的UITableView.我需要一个单元格的高度来自动调整其内容,即一个UILabel。

有什么我可以使用的方法。

tableView.estimatedRowHeight = 42.0
tableView.rowHeight = UITableViewAutomaticDimension

..对于具有静态单元格的表格视图,还是仅对具有动态原型单元格的表格视图有效?

(或者您还有其他建议的方式吗?)

其他信息

UITableView位于TableViewController中,该TableViewController嵌入到容器视图中。

这五个静态单元格彼此之间非常不同,并且仅在一个应用程序场景中使用,因此对于动态原型和自定义单元格子类而言,我没有多大意义。

我这样更新表格视图

-(void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [_myTableView reloadData];
}

我将约束添加到UILabel,如下所述: http://www.appcoda.com/self-sizing-cells/

最新回答
  • 3天前
    1 #

    对于iOS 8,我发现您不能执行与动态表视图单元格相同的策略。

    要自动调整静态单元格的高度,我实现了以下两个UITableViewDelegate方法:

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return UITableViewAutomaticDimension;
    }
    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }
    

    希望它会有所帮助。

  • 3天前
    2 #

    扩展Victors的答案,一旦实现以下委托,基于静态单元格的表视图似乎会根据内容和约束自动调整单元格的大小:

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return UITableViewAutomaticDimension;
    }
    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }
    

    除了有标签时.由于某些原因,标签固有含量的高度似乎对单元格的高度计算没有贡献.我目前的解决方法是将标签嵌套在UIView中.

    执行以下操作:

    将标签(或多个标签)嵌入视图中. (在IB上选择标签,然后点击菜单>编辑器>嵌入>视图)

    在此之间建立水平和垂直边距约束 视图和单元格

    在您的之间建立水平和垂直边距约束 标签和此视图。

    确实感觉像是黑客,但在我尝试过的所有情况下都对我有用.

  • 3天前
    3 #

    最终完成了此操作.不是我想要的,但是它可以满足我的简单要求和文本长度。

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        if (indexPath.row == 2)
        {
            CGFloat padding = 30.0f;
            CGFloat labelWidth = self.tableView.bounds.size.width - padding*2;
            NSAttributedString *text = [[NSAttributedString alloc] initWithString:_freeTextLabel.text];
            NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin;
            CGRect boundingRect = [text boundingRectWithSize:CGSizeMake(labelWidth, CGFLOAT_MAX)
                                                 options:options
                                                 context:nil];
            return (CGFloat) (ceil(boundingRect.size.height) + padding*2);
        }
        return [super tableView:tableView heightForRowAtIndexPath:indexPath];
    }
    

  • 3天前
    4 #

    NOTE :这是基于@CamelBase的答案,该答案是为Objective-C编写的,因此对于那些进行了转换但仍然难以自行转换内容的人,大多数情况下只是转换为Swift。


    对于那些想要使用Swift来实现此目的并且想要一个带有静态单元格的表的人,这是一个可行的解决方案。

    我不需要使用此代码(尝试将其放在 viewDidLoad()中 并尝试了,没有任何区别):

    tableView.estimatedRowHeight = 42.0
    tableView.rowHeight = UITableViewAutomaticDimension
    

    首先,您要添加 UILabel 到要自动增长内容的每个单元格。

    您需要向UILabel添加4个相对于父项(单元格的内容视图)的约束。

      Leading Margin 0

      Trailing Margin 0

      Top Margin 0

      Bottom Margin 0

    这将使标签随着细胞的生长而增长(下面的代码将这样做)。

    现在只需添加以下代码:

    override func tableView(tableView: UITableView, 
    heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    {
        let sectionICareAbout = 2
        let rowICareAbout = 1
        // repeat for as many section/row combos you need dynamic sizing on
        if indexPath.section == sectionICareAbout 
          && indexPath == rowICareAbout {
            // replace with how you get the content for the cell
            // in section 2 row 1
            let text = "line1\nline2\nline3"
            return rowHeightForText(text)
        }
        // use auto-dimension if we didn't set something else
        return UITableViewAutomaticDimension
    }
    func rowHeightForText(text: String) -> CGFloat {
        let labelWidth = tableView.bounds.size.width
        let attributedText = NSAttributedString(string: text)
        let options = NSStringDrawingOptions.UsesLineFragmentOrigin
        let size = CGSize(width: labelWidth, height: CGFloat.max)
        let boundingRect = attributedText.boundingRectWithSize(size, 
            options: options, context: nil)
        return boundingRect.size.height
    }
    

  • 3天前
    5 #

    在IOS8中,我发现在代码中显式设置行高/宽度或标签高/宽会导致更多问题,而不是要解决的问题.我已经使用自动布局创建了具有可变单元格高度和多行标签的动态和静态表,但是您确实必须遵循Apple标准来处理字母或奇怪的事情(例如分隔符消失或行的高度随机塌陷)。

      [edited] Set estimatedHeightForRowAtIndexPathandheightForRowAtIndexPath to automatic dimensions in your UITableViewDelegate

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

      确保单元格中的每个元素都具有top / bottom / bottom / left / right =约束(不是>=,<=或alignX或aligny-必须为=).您可以将其设置为低优先级约束,并为更高优先级提供更好的约束,但是必须给它一个确切的起始值才能确定单元格的大小。

  • 了解Haskell类型签名
  • C#中的线程死锁示例