UITableViewCell AccessoryView 未正确显示

Posted

技术标签:

【中文标题】UITableViewCell AccessoryView 未正确显示【英文标题】:UITableViewCell AccessoryView not displayed properly 【发布时间】:2015-04-19 17:51:51 【问题描述】:

我在附件视图中有一个带有 UISwitch 的 UITableviewCell,它在运行时正确显示,但是一旦我旋转设备,开关就不再在正确的位置。

我可以使用约束而不使用附件视图,但我认为我可以使用这个字段.. 有人有想法吗?

谢谢!

编辑: 这是 Interface Builder 中的配置:

编辑 2: 我使用了自定义单元格:

对默认属性进行初始化:

self.textLabel.font = [UIFont preferredDynamicFontForTextStyle:UIFontTextStyleBody fontSize:16.0];
self.backgroundColor = self.contentView.backgroundColor;

self.textLabel.text = item.title;
self.selectedImage = item.imageSelected;
self.unselectedImage = item.image;
self.imageView.image = self.unselectedImage;
// if I do it programmatically
self.accessoryView = [[UISwitch alloc] init];

我根本不设置约束,因为我使用默认属性..

【问题讨论】:

我的开关没有代码,我使用了界面生成器并将开关链接到 UITableViewCell 的附件视图 可能是bug什么的,尝试从代码中设置 我也尝试使用 self.accessoryView = [[UISwitch alloc] init];但它是一样的..我认为这个错误是在附件视图本身.. 那完全是自定义单元格吗? 您是否在表格视图本身设置了约束? 【参考方案1】:

我和你有同样的问题。

以下是我的观察:

如果通过代码设置附件视图,无论单元格是否被选中,在 ios 7 和 iOS 8 上都可以。 如果您通过 IB 设置了附件视图,附件视图会在第一次选择单元格后移动到左上角,并且仅在 iOS 8 上

我不知道问题是来自 IB 还是来自单元格在 iOS 8 上布局附件视图的方式,但到目前为止解决方法很简单:始终通过代码设置附件视图以避免意外行为。

【讨论】:

【参考方案2】:

看起来如果您在代码中创建 accessoryVieweditingAccessoryView 并设置它,一切都会很好!

如果您尝试在UIStoryBoard 中设置它们,UITableViewCell 将在它们第一次消失后删除constraints,并且它不会将它们添加回来。很遗憾,但希望他们在以后的版本中改变它。

希望有帮助!

【讨论】:

【参考方案3】:

如果您使用自动布局(可能),您应该首先设置约束

【讨论】:

【参考方案4】:

我可以肯定地说,您的约束设置不正确。但是如果没有看到故事板的限制,就无法肯定地说出什么是坏的。

【讨论】:

【参考方案5】:

对于目前发现此问题的任何人,我想我已经解释了这里可能发生的情况:

这是视图上 translatesAutoresizingMaskIntoConstraints 属性的问题。来自 Apple 的文档,尤其是相关的粗体部分:

如果该属性的值为YES,系统会创建一组 复制视图指定的行为的约束 自动调整蒙版。这也允许您修改视图的大小和 使用视图的框架、边界或中心属性的位置, 允许您在 Auto 中创建静态的、基于框架的布局 布局。 请注意,自动调整掩码约束完全指定 视图的大小和位置;因此,您不能添加额外的 修改此大小或位置的约束而不引入 冲突。 如果你想使用自动布局来动态计算 视图的大小和位置,您必须将此属性设置为 NO,并且 然后为 默认情况下,对于您的任何视图,该属性都设置为 YES 以编程方式创建。 如果您在 Interface Builder 中添加视图, 系统会自动将此属性设置为 NO

所以,当我遇到这个问题时,是在我将 tableview 从内容更改为带有标签的堆栈视图并切换到带有 UISwitch 作为附件视图的标签时。该开关是在视图加载之前以编程方式创建的,用于表所在的容器视图,并且 translatesAutoresizingMaskIntoConstraints 设置为 NO - 与在界面构建器中创建开关时发生的情况基本相同。然后我正在更改的代码尝试设置约束,但是当您旋转屏幕时,开关总是会出错并浮动到错误的一侧。我的解决方案是将 translatesAutoresizingMaskIntoConstraints 属性更改为 YES 并让约束由视图本身创建。在我看来,这是这个属性在大多数视图上的作用与辅助视图本身试图处理的内容之间的冲突问题,如果程序员试图进入并自己设置,似乎并不能很好地表明什么这里出错了。希望这对将来的人有所帮助!

【讨论】:

很好,听起来像。你能分享一个代码示例吗?

以上是关于UITableViewCell AccessoryView 未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

从 UITableViewCell 中的详细信息披露按钮显示 UIPopoverController

从通过设置 Cell.Accessory 添加的 DetailDisclosureButton 显示 UIPopoverController

使用“com.android.future.usb.accessory”库时应用程序无法启动

USB Accessory 模式

微信小程序 keyboard-accessory组件

MySQL Workbench - 外键选项卡不起作用