iOS 13 后 某个 ViewController 在跳转 的时候 cell 突然变小了下,虽说时间很短,但还是想解决下,经过查找在那一瞬间是发现 UITableView ContentView 变化了, 哦,iOS 12 之前没有这个变化。
当然这个操作出现前,是有执行了下横竖屏的切换。
通过 InterfaceOrientation 属性的描述,知道此处的改变确实会影响布局的显示。说白了就是旋转Screen会触发UIView 的 layoutSubviews 调用。
然后神奇的事情发生了, 我在该 Cell 中的 layoutSubviews 打印了下 self.contentView,它的宽度就不变化了。
- (void)layoutSubviews {
NSLog(@"%@",self.contentView);
}
说明我们手动调用了下,self.contentView 就保持不动了。
- (void)layoutSubviews {
// iOS 13 之后横竖屏切换的时候 self.contentView 会变化,有一个体验不好的效果
if (self.contentView.origin.x > 0 || self.contentView.frame.size.width < kDDScreenPortraitWidth) {
self.contentView.frame = CGRectMake(0, self.contentView.origin.y, kDDScreenPortraitWidth, self.contentView.size.height);
}
}
后面发现特殊情况下,x 和 width 会有变化,所以还是强制改动下。
具体解释暂时不知道, 但确实有效,毕竟 iOS 12 之前没有这个问题,可能是 苹果在 iOS 13 之后对 UIContentView 做了些未知的改变。
PS: iOS 13 以后已知的 contentView 的改变:
当单元格突出显示或选中时,UITableViewCell 类不再更改 contentView 及其任何子视图的 backgroundColor 或 opaque 属性。如果要在 contentView 内部(包括)内容的任何子视图上设置不透明的 backgroundColor,则单元格突出显示或选中时的外观可能会受到影响。解决子视图任何问题的最简单方法是确保将 backgroundColor 设置为 nil 或 clearColor,并且设置它们的 opaque 属性为 false。但是,如果需要,您可以重写 setHighlighted:animated: 和 setSelected:animated: 方法,以便在移动到突出显示的状态和选定状态时手动更改子视图上的这些属性。
如果通过覆盖 sizeThatFits 在 UITableView 中实现自调整单元格而不使用自动布局,则返回的高度将被解释为单元格的 contentView 所需的高度,UITableViewCell 会自动添加为单元格留出空间所需的任何其他高度 分隔器。如果以这种方式实现手动自调整大小,则在 UITableViewCell 上调用 sizeThatFits: 时,单元格的 contentView 宽度可以保证准确,以便在手动布局计算中使用。
UITableViewCell 类的 contentView 属性始终与前面和后面的相邻附件进行边对边布局。这简化了布局代码,因此想要正确的默认偏移的开发人员不再需要将其内容与内容视图边框或布局边距对齐,具体取决于尾部是否有附件。您现在应该始终在单元格内容视图的布局边距上布置代码以获取默认的系统插入。这些插入将根据单元格中可见的附件自动调整,以匹配系统的默认间距。