我有一个UITableViewCell
的子类,我重写setFrame:
以向单元格添加插入内容。在iOS 7中,一切似乎都运行良好,另一方面,在iOS 8上,表视图正确加载单元格但是当我刷新tableview时,单元格会调整大小。
通过对setFrame
中的代码进行注释,tableview的行为正确,但我也松开了插件。
有没有人经历过这个?
更新:AFAIK,在iOS 8中,单元格框架高度与行高相匹配。
答案 0 :(得分:4)
我遇到了类似的问题。
通过以下方式解决:
- (void)setFrame:(CGRect)frame
{
NSInteger inset = kDefaultViewPadding;
frame.origin.x += inset;
frame.size.width = kMainScreenWidth - 2*inset;
[super setFrame:frame];
}
其中
#define kMainScreenWidth ([[UIScreen mainScreen] bounds].size.width)
,
请勿使用以下代码:
frame.origin.x += TABLE_PADDING;
或
frame.size.width = self.superview.frame.size.width - (2.0f * TABLE_PADDING);
否则,每次刷新tableview时,单元格的宽度减小(2.0f * TABLE_PADDING)。
答案 1 :(得分:3)
我不知道为什么iOS 8中的行为发生了变化,但我找到了解决方法。
在我的情况下,我将setFrame消息更改为以下内容:
-(void) setFrame:(CGRect) frame {
frame.origin.x += TABLE_PADDING;
frame.size.width = self.superview.frame.size.width - (2.0f * TABLE_PADDING);
[super setFrame: frame];
}
所以我使用superview边界进行计算。 然而,这在任何情况下都可能无效......
重新排序单元格时遇到了另一个问题。
如果您要重新排序,请尝试以下方法:
-(void) setFrame:(CGRect) frame {
if(isDragging)
frame.origin.x = self.supervire.frame.origin.x + TABLE_PADDING;
else
frame.origin.x += TABLE_PADDING;
frame.size.width = self.superview.frame.size.width - (2.0f * TABLE_PADDING);
[super setFrame: frame];
}
要在TableCell拖动时获取信息,我使用了此问题中提供的解决方案:How to get notified of UITableViewCell move start and end
修改强> 我遇到了越来越多的setFrame消息问题,所以我决定不使用标准的TableViewController。现在我使用带有搜索栏和搜索显示控制器的标准ViewController。并在控制器视图内查看表格。这样我就可以使用自动布局约束来调整表格宽度。这似乎是我案例的最佳解决方案,因为我找不到任何方法让它(使用setFrame消息)工作(无论如何)。
答案 2 :(得分:0)
我通过将代码从setFrame
移到layoutSubviews
部分解决了我的问题,而不是使用self.frame
,我使用awakeFromNib
中保存的属性来保存我的- (void)layoutSubviews
{
[super layoutSubviews];
CGRect bounds = self.cellBounds;
CGRect boundsWithInsets = CGRectMake(bounds.origin.x + horizontalPadding,
bounds.origin.y + verticalPadding,
bounds.size.width - 2 * horizontalPadding,
bounds.size.height - 2 * verticalPadding);
[super setBounds:boundsWithInsets];
}
界限:
{{1}}
当我滑动进入编辑模式时,问题再次出现,我的所有单元格都松开了左边的填充(如@ Zerd1984所述)
我还应该提一下,我使用的TLIndexPathTools库当前没有更新来解决这个问题。