iOS8使用Interface Builder

时间:2015-08-13 05:11:34

标签: ios xcode uitableview ios8 autolayout

我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014 What's New in Table and Collection Views中所述。

我更倾向于使用严格的Xcode / Interface Builder和故事板来处理自动布局。当我这样做时,TableView单元格不会调整大小,我确定我错过了一些简单的东西。

为了重现这一点,使用Xcode 7 beta 5,I:

  • 创建了一个新的单一视图项目。
  • 将Storyboard入口点设置为新的UITableViewController。
  • 使其成为具有分组样式的静态表格视图。
  • 在第一行添加了一个标签。添加了对顶部,底部,左侧和右侧的约束。
  • 将标签字体设置为" Body"。
  • 已添加到ViewDidLoad:

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

  • 将其调整并调整设置中的动态类型。当字体更改时,TableView高度仍然停留在明显的默认值44并截断标签。

Truncated label in Simulator

这是GitHub repository,这是上述结果。

为什么没有自动布局导致TableView扩展以填充适合新的更大标签文本的必要空间?

我找到了关于此主题的精彩帖子,例如以下内容,并倾向于使用代码来设置约束here

我没有在纯Interface Builder中找到任何这样做的例子。当然这很有可能吗?

更新

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

Updated screenshot

此外,当我在标签或图像视图上设置显式高度约束时,我会生成以下内容。问题似乎是这个" UIView-Encapsulated-Layout-Height"我没有设定的约束。我猜它的生成是因为在我的IB静态表视图中,行高被设置为(默认值)为44。

Unable to simultaneously satisfy constraints.
...

"<NSLayoutConstraint:0x7fa371f39e30 V:[UILabel:0x7fa371f38d30'Label'(20)]>",
"<NSLayoutConstraint:0x7fa371c39160 UILabel:0x7fa371f38d30'Label'.top == UITableViewCellContentView:0x7fa371e17dc0.topMargin>",
"<NSLayoutConstraint:0x7fa371c393c0 UITableViewCellContentView:0x7fa371e17dc0.bottomMargin == UILabel:0x7fa371f38d30'Label'.bottom>",
"<NSLayoutConstraint:0x7fa371f41a40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fa371e17dc0(43.5)]>"

但ViewDidLoad中的这个不应该超越这个吗?

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

自行调整表格视图单元格是否无法使用静态表格视图?

更新2

我使用动态原型而不是静态表视图构建相同的东西,一切正常:

enter image description here

它确实似乎是静态的与动态原型表。静态表格视图单元格未正确展开。

我在WWDC视频中没有看到动态与静态的关系,所以在这一点上我将这个问题搞砸了。如果我学到新东西,我会更新。

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

3 个答案:

答案 0 :(得分:3)

答案:

这是Xcode7b5中的一个错误。我刚刚通过遵循Xcode 6.4和Xcode 7b5中的相同步骤确认了这一点。

  1. 创建新的单一视图应用程序
  2. 新文件。 Cocoa Class&#34; MyStaticTableViewController&#34;,UITableViewController的子类。
  3. 在Storyboard中,拖入新的表视图控制器。
  4. 将类更改为MyStaticTableViewController。
  5. 将故事板入口点拖到新VC。
  6. 删除原始VC。
  7. 将类更改为MyStaticTableViewController以获取新VC。
  8. 选择表格视图。将内容更改为静态单元格,将样式更改为分组。
  9. 将新标签拖到第一个表视图单元格。将字体更改为正文。将top,bottom,left,right约束设置为0并更新帧。
  10. 在MyStaticTableViewController.m中,添加:
  11.  - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.tableView.rowHeight = UITableViewAutomaticDimension;
        self.tableView.estimatedRowHeight = 44.0;
    
    }
    
    1. 使用动态类型验证增加大小会导致表格行也展开。
    2. 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

      关键问题似乎是&#34; rect&#34;每个&#34; tableViewCell&#34; XML文件中的条目。重击那些是解决这个问题的原因。

      更新3

      提起雷达:

      &#34; Engineering已确定您的错误报告(22311571)与另一个问题(17995201)重复,并将被关闭。&#34;

答案 1 :(得分:1)

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

快速测试:在文本标签上添加彩色背景。我敢打赌,你会注意到它没有增长。如果没有,请查看此处:Adjust UILabel height depending on the text

答案 2 :(得分:-1)

对于静态表视图单元格,您不能在ViewDidLoad中使用UITableViewAutomaticDimension。相反,使用override func heightForRowAt。我的viewDidLoad中没有任何内容。我在ViewDidLoad上面添加了这两个覆盖函数。

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

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        return UITableViewAutomaticDimension

    }

//这会在调整大小之前估计行的高度

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

        return 100
    }

只要您有顶部,底部,左侧和右侧布局约束,一切都应该调整大小。

相关问题