iOS8使用界面生成器自动调整静态TableView单元格大小

iOS8使用界面生成器自动调整静态TableView单元格大小,ios,xcode,uitableview,ios8,autolayout,Ios,Xcode,Uitableview,Ios8,Autolayout,我很高兴能够在Xcode中构建静态表视图,使用自动布局来支持动态类型,如中所述 我更喜欢严格使用Xcode/界面生成器和故事板来处理自动布局。当我这样做时,不知何故,TableView单元格没有调整大小,我确信我遗漏了一些简单的东西 要再现这一点,请使用Xcode 7 beta 5,I: 创建了一个新的单视图项目 将情节提要入口点设置为新的UITableViewController 使其成为具有分组样式的静态表视图 将单个标签添加到第一行。向顶部、底部、左侧和右侧添加了约束 将标签字体设置为“

我很高兴能够在Xcode中构建静态表视图,使用自动布局来支持动态类型,如中所述

我更喜欢严格使用Xcode/界面生成器和故事板来处理自动布局。当我这样做时,不知何故,TableView单元格没有调整大小,我确信我遗漏了一些简单的东西

要再现这一点,请使用Xcode 7 beta 5,I:

  • 创建了一个新的单视图项目
  • 将情节提要入口点设置为新的UITableViewController
  • 使其成为具有分组样式的静态表视图
  • 将单个标签添加到第一行。向顶部、底部、左侧和右侧添加了约束
  • 将标签字体设置为“Body”
  • 添加到ViewDidLoad:

    self.tableView.rowHeight=UITableViewAutomaticDimension; self.tableView.estimateDroweight=44.0

  • 运行它并在设置中调整动态类型。当字体更改时,TableView高度保持为默认值44,并截断标签

下面是一个例子,这是上面的结果

为什么“自动布局”不会导致TableView展开以填充必要的空间以适应新的较大标签文本

我发现了一些关于这个主题的很好的帖子,比如下面的帖子,这些帖子致力于使用代码来设置约束

我没有在纯界面生成器中找到任何这样做的例子。这是完全可能的吗

更新

我已经更新了GitHub源代码,以包含第二个表行,该表行使用ImageView而不是UILabel;它显示了同样的问题:

此外,当我在标签或图像视图上设置显式高度约束时,我会生成以下内容。问题似乎是我没有设置的“UIView封装布局高度”约束。我猜它是生成的,因为在IB中的静态tableview中,行高设置为(默认)44

自动调整表视图单元格大小是否不能与静态表视图一起使用

更新2

我已经使用动态原型而不是静态表视图构建了相同的东西,并且所有工作都很好:

它确实看起来是静态的而不是动态的原型表。静态表视图单元格无法正确展开

我在WWDC的视频中没有看到动态与静态的对比,所以在这一点上,我认为这是一个bug。如果我学到新东西,我会更新的


我已经更新了上面的GitHub存储库,以显示静态(损坏)和动态(工作)表视图的示例。

我没有时间看代码,但我几乎可以肯定问题在于标签。字体大小会更改,但标签的大小不会更改。我怀疑,因为占据整行后文本没有被截断,所以会留下一小部分空白

进行快速测试:在文本标签上添加彩色背景。我打赌你会注意到它没有增长。如果没有,请查看此处:

回答:

这是Xcode7b5中的一个bug。我刚刚按照Xcode 6.4和Xcode 7b5中相同的步骤确认了这一点

  • 创建新的单视图应用程序
  • 新文件。Cocoa类“MyStaticTableViewController”,UITableViewController的子类
  • 在情节提要中,拖动新的表视图控制器
  • 将类更改为MyStaticTableViewController
  • 将情节提要入口点拖动到新VC
  • 删除原始VC
  • 将新VC的类更改为MyStaticTableViewController
  • 选择表视图。将内容更改为静态单元格,将样式更改为分组
  • 将新标签拖动到第一个表格视图单元格。将字体改为正文。将顶部、底部、左侧和右侧约束设置为0并更新帧
  • 在MyStaticTableViewController.m中,添加:
  • 使用Dynamic Type验证增大大小是否也会导致表行展开
  • 由Xcode 6.4创建的项目按预期工作-表格视图单元格将展开以适应标签

    由Xcode 7b5创建的项目失败,如原始问题中所述

    有趣的是,如果用Xcode7打开Xcode6项目,它也可以正常工作。这与Xcode7如何创建项目或故事板有关

    更新

    我将.storyboard文件相互比较,在tableView条目下的损坏的Xcode7b5文件中,定义了一个rect:

    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
    
    
    
    我删除了这一行,似乎表视图单元格现在可以正确地自行调整大小了

    更新2

    关键问题似乎是XML文件中每个“tableViewCell”项下都有一个“rect”项。解决这个问题的方法就是打击这些

    更新3

    野外雷达:


    “工程部已确定您的错误报告(22311571)与另一个问题(17995201)重复,将被关闭。”

    对于静态表格视图单元格,您不能在ViewDidLoad中使用UITableViewAutomaticDimension。相反,请使用override func HEIGHT FORROWAT。我的视野里什么都没有。我在ViewDidLoad上面添加了这两个覆盖函数

    //第一行覆盖每行的高度,以便自动调整大小

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    
            return UITableViewAutomaticDimension
    
        }
    
    //这将在调整大小之前估计行的高度

        override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    
            return 100
        }
    

    只要有顶部、底部、左侧和右侧布局约束,所有内容都应该调整大小。

    没错,Bartserk。为UILabel背景着色可确认标签未垂直扩展以适合文本。我可以看到,当我在标签上设置手动高度约束时,存在无法满足的约束,包括:
    -我认为答案是找出该约束(UIView封装布局高度)的来源!我打赌在IB的某个地方我缺少了一个复选框。经过今天的实验,我不相信专业人士
    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
    
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    
            return UITableViewAutomaticDimension
    
        }
    
        override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    
            return 100
        }