【问题标题】:UITableViewCell behave differently in iOS7 and iOS8 simulator using xcode6 beta6 interface builderUITableViewCell 在使用 xcode6 beta6 界面生成器的 iOS7 和 iOS8 模拟器中表现不同
【发布时间】:2014-10-15 20:52:22
【问题描述】:

请看下面同一个应用程序中的3个表格视图单元格,界面生成器中单元格的高度为54,边框是在代码中使用CAShapeLayer创建的,高度为44。由于我在项目期间从xcode5切换到xcode6开发中,所以 uitableviewcell 一部分在 xcode5 中创建,一部分在 xcode6 中,还有一些单元格是在 xcode5 中创建的,后来在 xcode6 中更改。

图像1。使用 xcode5 创建,所需的样式

图像2。使用xcode6 beta6创建,在iOS8模拟器中显示,disclosure indicator错位,文字偏移

图像3。使用 xcode6 beta6 的 image2 的相同单元格,但在 iOS7.1 设备上运行,disclosure indicator 放错了位置

我在interface builder中比较了uitableviewcell的所有设置,没有发现差异。

和我对比了xxx.storyboard的源文件,终于得到了不同点:

case1:'tableViewCell'标签,xcode5版本为:

<tableViewCell contentMode="scaleToFill" selectionStyle="none" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="xxCell" rowHeight="54" id="far-Kn-fRP" customClass="xxCell">
  <rect key="frame" x="0.0" y="119" width="320" height="54"/>

case2:'tableViewCell'标签,xcode6 beta6版本在下方,注意,创建时缺少一个新的 uitableviewcell

<tableViewCell contentMode="scaleToFill" selectionStyle="none" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="xxxCell" rowHeight="54" id="eav-sl-Yrd" customClass="xxxCell">

case3:image2和image3中的场景是在xcode5中创建的uitableviewcell,默认高度为44,在xcode6 beta6中修改为将高度改为54,来源为:

<tableViewCell contentMode="scaleToFill" selectionStyle="none" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="xxxCell" rowHeight="54" id="eav-sl-Yrd" customClass="xxxCell">
  <rect key="frame" x="0.0" y="119" width="320" height="44"/>

作为结论,xcode6 beta6似乎没有处理.storyboard文件中的标签,会导致uitableviewcell错位。

补充:以上所有场景,代码都实现了heightForRowAtIndexPath,返回54。

我的问题是:

  1. 我没有找到如何将disclosure indicator 放在与 xcode5 相同的位置

  2. 的缺失是 bug 还是被 xcode6 中的其他标签替换了?可能与 iOS8 中的单元格自动调整大小功能有关?

  3. 还有其他解决方案可以使 uitableviewcell 正确吗?我目前正在手动修改 .storyboard 文件以使用 xcode6 beta6 为每个新创建的 uitableviewcell 添加 标签,这很容易出错。

谢谢。

【问题讨论】:

  • 单元格的内容是如何构造的? contentView 里面的东西都在吗?有限制吗?这些约束是连接到 cell 还是连接到 contentView(这很重要)?另外,你知道新的 iOS 8 自动行高功能吗?它可能会影响单元格的垂直布局。
  • "我目前正在手动修改 .storyboard 文件,容易出错。"在我看来,您正在以错误的方式构建细胞。
  • @matt 感谢您的快速评论。 2个标签被放置为'contentView'的子视图,并且约束设置为相对于'superView'(在这种情况下为contentView)的前导和中心Y,具有固定的宽度和高度。我的最后一句话“我目前正在手动修改 .storyboard 文件”意味着我必须为使用 xcode6 beta6 界面生成器创建的 uitableviewcell 手动添加 。 “新的 iOS 8 自动行高功能”对我来说是新的,我会检查一下。谢谢。
  • @matt 感谢“iOS 8 新的自动行高功能”的信息,我刚才查了一下,很棒。但是我的项目需要支持 iOS7,所以我已经为所有 uitableview 实现了heightForRowAtIndexPath。我的问题中的示例在函数中返回 54:heightForRowAtIndexPath

标签: ios uitableview xcode6-beta6


【解决方案1】:

关于放错边框 CAShapeLayer - 您需要覆盖自定义单元格类的 layoutSubviews 函数并相应地更新图层框架。

也不要使用单元格的 bounds 属性,因为它与帧大小不同:

- (void)layoutSubviews
{
    [super layoutSubviews];
    self.borderLayer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}

关于披露指标的偏移量 - 我无法从您的屏幕截图中重现问题...

【讨论】:

  • 感谢您的评论,但这里的问题是文本和披露指示符的错位,而不是 CAShapeLayer。顺便说一句,我使用 xcode6.1 后再也没有看到这个问题
猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2014-12-08
  • 1970-01-01
相关资源
最近更新 更多