在Swift中旋转设备时iOS 8 uitableviewcell高度发生变化

Posted

技术标签:

【中文标题】在Swift中旋转设备时iOS 8 uitableviewcell高度发生变化【英文标题】:iOS8 tableviewcell height changing when rotating device in Swift 【发布时间】:2014-10-31 14:14:21 【问题描述】:

我正在尝试为我的 tableview 使用新的自动大小。我正在这样做:

    tableView.rowHeight = UITableViewAutomaticDimension

我的 UITableViewCell 中有一个多行 uilabel,它有一些工作出色的约束;当我以横向和纵向进入表格视图时,行的高度是动态的!太棒了!

...但是当我旋转设备时,行获得基本高度(即 44)。

我添加了这一行:

override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) 

    self.tableView.reloadData()

问题就消失了。但这真的有必要吗?一定有更好的方法来解决这个问题?


编辑:

我刚刚发现当我像这样在表格视图中删除一行时会出现同样的问题:

tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

我在这里遗漏了什么吗?为什么这不是开箱即用的?


再次编辑:

我现在是这样做的:

self.tableView.estimatedRowHeight = 44
tableView.rowHeight = UITableViewAutomaticDimension

然后当我从 API 中获取数据时:

self.tableView.reloadData()
self.tableView.beginUpdates()
self.tableView.endUpdates()

这似乎涵盖了我迄今为止测试过的所有情况,但它看起来真的很hacky!如果没有开始/结束更新,单元格在第一次加载时会显示一些非常时髦的高度。 (但是当旋转设备时,单元格会正确调整它们的高度。)

这一切看起来都很有问题。我还没有找到正确涵盖这些情况的单一指南。

【问题讨论】:

我发现这篇文章非常有用,但不确定它是否能解决您的特定问题。但在 ios8 中,您不必使用 willAnimateRotationToInterfaceOrientation 也不必重新加载数据:captechconsulting.com/blog/tyler-tillage/… 您好,根据您的问题,您能告诉我您是否在 uitableviewcell 中使用了自动布局约束,您是否要求高度与 uilabel 中的内容一致,还是需要始终为 44。还请添加图片您所面临的问题将更有助于确定您的问题。 【参考方案1】:

我在旋转时遇到了类似的问题,整个搜索栏和 tableView 在从纵向到横向再返回的非常旋转时向下移位。 See-> Swift searchBar 在旋转期间 searchController.active 后从 tableView 顶部分离:

Swift searchBar separates from top of tableView after searchController.active during rotation

我粘贴了您的覆盖功能,即:

override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation:      UIInterfaceOrientation, duration: NSTimeInterval) 

   self.tableView.reloadData()

在 viewDidLoad 函数之后,我的问题就消失了。不知道为什么。格伦·蒂斯曼

【讨论】:

【参考方案2】:

根据今年的 WWDC 会议,如果单元格已经使用 Autolayout,那么 应该 为您自动调整大小。它会通过尝试调用systemLayoutSizeFittingSize:(CGSize) 来做到这一点,或者如果你没有使用自动布局,它会尝试调用sizeThatFits:(CGSize)

要确定您是否也支持 iOS7,设置 tableView.rowHeighttableView.estimatedRowHeight 会导致奇怪的行为,您可能希望有条件地调用其中一个,但不能同时调用两者,具体取决于应用在哪个版本的 iOS 上运行。

如果您特别遇到标签问题,您还可以检查您是否使用了 UILabel 的新“自动首选最大布局宽度”属性(如果您在情节提要中,则该属性位于“属性”检查器)并且 lines 设置为“0”。有关更多详细信息,请参阅the documentation。另请参阅 iOS 接口目录中的“标签行为”,了解有关混合 UILabel 的某些行为并获得奇怪结果的一些警告。

最后,您可能会在新添加的rotation methods for size classes 中看到发生了什么:

-willTransitionToSize:withTransitionCoordinator: -willTransitionToTraitCollection:withTransitionCoordinator:

【讨论】:

以上是关于在Swift中旋转设备时iOS 8 uitableviewcell高度发生变化的主要内容,如果未能解决你的问题,请参考以下文章

Swift Master-Detail 模板问题(iOS 8 beta 3)

Swift IOS 8 设计元素未在设备上显示

iPhone iOS8:从 iOS7.1 sdk 构建并在 8.0 及更高版本的设备上运行时,UIAlertView 倒置旋转无法正常工作

使用 IOS9 时,无法在 UITable 的部分标题上的 UIButtons 上触发触摸事件(IOS10 很好)

使用 Swift 2 将不允许 iOS 8 设备注册推送通知

swift 3 - 旋转到横向时全屏播放视频