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

Prevent views from popping from the top left during animations on iOS

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

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

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

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

解决方法是使用具有重用标识符的出队和初始化单元格。当一个单元格第一次出现时它仍然有效。神奇之处在于使用相同的非空标识符进行出列和初始化。

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