在 iOS 上的动画期间防止视图从左上角弹出

Posted

技术标签:

【中文标题】在 iOS 上的动画期间防止视图从左上角弹出【英文标题】:Prevent views from popping from the top left during animations on iOS 【发布时间】:2016-04-03 14:16:53 【问题描述】:

有时当表格视图单元格出现在动画中时,例如-[UIView viewWillAppear:animated]-[UITableView reloadData],其中的内容会从左上角 (0, 0) 弹出到最后一帧。这个问题也发生在其他视图动画中。回到过去,这个问题并不存在。在一次 ios 更新中,问题出现了,但初始位置是随机的,通常在屏幕之外。在另一个 iOS 更新中,问题变得确定性,初始位置为 (0,0)。

我在[tableView reloadData]cellForRowAtIndexPath 的单元格上尝试过[tableView layoutIfNeeded][tableView.layer displayIfNeeded]。我错过了什么?

我上传了一个示例项目https://github.com/keithyipkw/ios-animation-bug。 要可靠地重现问题,请在重新加载数据之前在 viewWillAppear 处设置断点。下拉屏幕以显示今日中心。在完全可见的今天中心之后运行。

【问题讨论】:

【参考方案1】:

我也有同样的问题,电视第一次显示单元格时会出现这种情况。 这是因为单元格是在情节提要中使用原型的初始大小创建的,然后根据电视宽度调整大小。 为了避免在cellForRowAtIndexPath 中出现这种情况,我将单元格上的宽度设置为电视的大小,并强制单元格上的自动布局更新,以使所有元素都适合该大小。 我仍然没有找到真正的解决方案这更像是一个技巧,我希望其他人对您的问题提供反馈。

【讨论】:

【参考方案2】:

解决方法是使用带有重用标识符的 dequeue 和 init 单元格。当单元格第一次出现时,它仍然有效。神奇的是使用相同的非空标识符出列和初始化。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

【讨论】:

以上是关于在 iOS 上的动画期间防止视图从左上角弹出的主要内容,如果未能解决你的问题,请参考以下文章

在为约束设置动画时防止子视图上出现不需要的动画

iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案

iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案

iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案

如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框

防止 UISearchController 在 IOS8 中隐藏视图导航栏