iOS 8.1 中核心数据绑定的自动布局问题,但 iOS 7 中没有

Posted

技术标签:

【中文标题】iOS 8.1 中核心数据绑定的自动布局问题,但 iOS 7 中没有【英文标题】:Autolayout issue with core-data binding in iOS 8.1 but not in iOS 7 【发布时间】:2014-11-26 19:44:21 【问题描述】:

我有一个应用程序,它在表格行中使用 UITableViewController、核心数据和 UITextViews,它们会根据它们持有的文本大小自动调整它们的垂直大小。大小调整是使用 tableView:heightForRowAtIndexPath 和自动布局约束以老式的 pre-ios8(即没有自动调整单元格)方式完成的。单元格还使用自动布局来定位按钮,例如“明文”按钮。该按钮被固定在超级视图 (UITableViewCell.contentView) 后沿的 10pts 内。

该代码在 iOS 6、7 和 7.1 中运行良好,但在 iOS 8.1 中失败。布局在 iOS 8.1 中可以正常加载,但是一旦用户开始在文本框中输入内容,锚定的按钮就会开始跳来跳去,最终被放置在太靠右的位置,几乎在 UITableViewCell 之外。

iOS 7.1,正确:

iOS 8.1,不正确:

如果我注释掉将更改的文本绑定到核心数据模型的行 ("translation.text1Text = changedTextView.text;"),则不会出现问题,但当然 textview 也不会正确调整大小.所以我认为这可能与 self.tableView beginUpdates/endUpdates 如何与 iOS 8 中的自动布局约束交互有关。

我已经在https://github.com/SpencerY2/TestApp2 上放了一个完整的示例应用程序,其中包含演示该问题的源代码。

不确定这是否与另外两个 iOS8 自动布局问题有关:1) Issue with Auto Layout on iOS 8 (code works perfectly on iOS 7), 2) https://***.com/questions/26461850/auto-layout-issue-in-ios-8-works-fine-in-ios-7

任何帮助将不胜感激。

附言该应用程序需要在 iOS 6+ 上运行,因此目前不能使用自动调整单元格大小。

【问题讨论】:

【参考方案1】:

这个问题似乎与@Gallymon 在Autolayout problems with iOS8 with code that works fine on iOS7 中的相同,与@BFar 在Issue with Auto Layout on iOS 8 (code works perfectly on iOS 7) 中的不同。我尝试了针对 Issue with Auto Layout on iOS 8 (code works perfectly on iOS 7) 的建议修复,但它对我不起作用。

我做的丑陋的解决方法是创建一个透明的 1x1pt UIImageView(我将其称为“anchorImage”),将其 leading 边缘锚定到超级视图,然后锚定所有其他小部件到锚图像的尾部边缘。然后,如果设备在纵向和横向之间旋转,我需要重新调整 anchorImage 的水平位置,但至少这只是我需要更新的一个约束,而不是所有约束。

我将向 Apple 提交错误,让他们进一步调查。

如果有人看到我做错了什么并确定有更好的解决方案,我会全力以赴......

我没有将此标记为“正确”答案,因为也许有人有更好的主意。

更新:于 2014 年 12 月 1 日向 Apple 提交了 iOS 错误 19108167

【讨论】:

以上是关于iOS 8.1 中核心数据绑定的自动布局问题,但 iOS 7 中没有的主要内容,如果未能解决你的问题,请参考以下文章

iOS自动布局——Masonry详解

cloudkit 数据未显示在提交的应用程序 iOS 8.1 中

iOS 7 和 8 中 UITableViewCells 的自动布局指标不同

iOS8.0(和 8.1)上第二个 UIScreen 的自动旋转问题

在 iOS 8 中如何在不使用自动布局的情况下布局 UITableViewCell?

UICollectionReusableView 中的自动布局不适用于 iOS7 但适用于 iOS8