缩进不适用于自定义 UITableViewCell

Posted

技术标签:

【中文标题】缩进不适用于自定义 UITableViewCell【英文标题】:Indentation not working on Custom UITableViewCell 【发布时间】:2012-10-11 06:04:24 【问题描述】:

我的项目中有一个简单的自定义 UITableViewCell,并且刚刚在表格中添加了一个编辑操作。一切看起来都很好,但是在编辑时缩进不起作用,并且编辑图标与内容重叠。 (更不用说删除按钮了)

自定义单元格是在界面生成器中创建的,像往常一样具有标准约束,我已经尝试过覆盖类中的 layoutSubviews 方法,正如在其他地方提到的,没有运气如下;

(void)layoutSubviews

[super layoutSubviews];
float indentPoints = self.indentationLevel * self.indentationWidth;

self.contentView.frame = CGRectMake(
                                    indentPoints,
                                    self.contentView.frame.origin.y,
                                    self.contentView.frame.size.width - indentPoints,
                                    self.contentView.frame.size.height
                                    );

我还确认子视图实际上在 contentView 中,并且在视图和代码中一切似乎都很好。

单元格还具有以编程方式设置的缩进级别/宽度,并将掩码自动调整为自动宽度。

作为最后的手段,我可​​以通过编程方式创建 UITableViewCell,但不要认为它会有所帮助。

根据建议,我还确保将单元格内容上的约束固定到超级视图。

也没有运气在代码中手动设置 de autoResizingMasks

-- 编辑:

我手动将 contentView 的背景颜色设置为黑色,发现它在编辑模式下正确缩进,即使没有覆盖“layoutSubviews”。事实上,使用它效果更好。

但是,如您所见,内容没有缩进。最初我认为单元格的内容(UIImage)不是 contentView 的子视图,而是 nslogging 子视图,显示它们是。

NSLog(@"%@", self.contentView.subviews);

"<UIImageView: 0xa477030; frame = (23 7; 31 50); autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xa477090>>"

我完全不知道为什么这里会一直发生这种情况。一定是一些与 ios 6 新约束相关的隐藏约束。

【问题讨论】:

【参考方案1】:

缩进与进入编辑模式时调整内容视图不同。

你说得对,这看起来很简单,而且通常开箱即用。通常,您唯一需要更改的是您添加到单元格的组件的自动调整大小掩码。左边的内容应该有一个固定的左边距,右边的内容应该有一个固定的右边距。

当单元格进入编辑模式时,内容视图的大小会调整,以便为编辑附件留出空间。如果您的内容具有这些调整大小的蒙版,它将随之移动。您上面的 layoutSubviews 方法很可能通过将内容视图设置回全宽来撤消所有这一切,因为您错误地使用了缩进 - 尽管我无法从问题中的信息中确定这一点。

更新

这是 UITableViewCells 中的约束问题(错误?)。您可以通过选择情节提要/界面构建器屏幕中的“文件”选项卡(如果您想在其他地方使用约束,请为单元格使用独立的笔尖)并取消选中“使用自动布局”来返回自动调整蒙版:

这会正确排列您的单元格内容。

【讨论】:

我删除了 lauoutSubview 覆盖并更改了要在 Interface Builder 中修复的内容边距。请参阅:link,但进入编辑模式时缩进仍然不起作用。还有其他想法吗? 啊,我没有意识到你在使用约束。我还没有在愤怒中使用它们。我会考虑的。 看起来this question 有您正在寻找的答案,虽然我不敢相信这有那么难! 为了解决这样一个简单的问题,我一直在尽一切可能避免这样做,因为这似乎很荒谬。无论如何,我都将绝望地尝试。 同意。几乎值得提交一个错误。【参考方案2】:

您可以尝试这些功能并解决它们:

- (void)willTransitionToState:(UITableViewCellStateMask)state 
 [super willTransitionToState:state];

 if ((state & UITableViewCellStateEditingMask) || (state & UITableViewCellStateShowingDeleteConfirmationMask)) 
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.3];
  label.alpha = 0.0;

// 布局子视图代码 [UIView 提交动画];

- (void)didTransitionToState:(UITableViewCellStateMask)state 
 [super didTransitionToState:state];

 if (!(state & UITableViewCellStateEditingMask) && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) 
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.5];
  label.alpha = 1.0;
// LayoutSubview code
  [UIView commitAnimations];
 

【讨论】:

谢谢.. 但是在进入编辑模式时手动淡化标签在可用性方面并不是正确的行为。【参考方案3】:

取消选中“使用自动布局”对我有用。

【讨论】:

【参考方案4】:

将 tableView 边缘插入设置为零

[self.tableView setSeparatorInset:UIEdgeInsetsZero];

【讨论】:

以上是关于缩进不适用于自定义 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 不适用于自定义 UITableViewCell (Swift)

UITableViewAutomaticDimension 不适用于自定义表格单元格

UITableViewCell 自定义缩进宽度

编辑单元格时自定义 UITableViewCell 反向缩进

自调整 UITableViewCell 不适用于右细节单元格

iOS + Swift 2:UITableViewCell 中的动态高度不适用于空视图