如何将UITableViewCell从“普通”视图切换到透明,然后再返回

时间:2012-08-22 02:09:07

标签: iphone ios uitableview

我有一个在查看模式和编辑模式之间来回翻转的表格视图。我有一个单元格,我想在视图模式下透明,在编辑模式下看起来像一个“普通”单元格(即白色背景,圆角矩形轮廓)。基本上,当你切换到&时,你会在联系人应用程序中看到名称单元格所做的事情。超出编辑模式。

我使用How to create a UITableViewCell with a transparent background中的解决方案来获得透明背景,但我无法弄清楚如何恢复原始背景。

目前,我在viewDidLoad中创建了两个背景视图:

nameCellDefaultBackview = [[UIView alloc] initWithFrame:CGRectZero];
nameCellDefaultBackview.backgroundColor = [UIColor clearColor];

nameCellEditBackview = [[UIView alloc] initWithFrame:CGRectZero];
nameCellEditBackview.backgroundColor = [UIColor whiteColor];

然后我给我的单元格默认背景视图:

nameCell.backgroundView = nameCellDefaultBackview;

在setEditing中:动画:我根据编辑模式设置单元格的背景:

if (editing) {
    nameCell.backgroundView = nameCellEditBackview;
} else {
    nameCell.backgroundView = nameCellDefaultBackview;
}

问题是,在编辑模式下,我得到一个白色矩形,而不是看起来像一个单元格 - 这正是我要求的,但不是我想要的:)。我已经尝试了其他一些东西,比如将backgroundView设置为nil(似乎=没有变化),并在viewDidLoad中保存“初始”背景视图(这似乎不起作用,并在调试器中查找变量我尝试将其分配给setEditing中的单元格时为0x0)。

所以我想要的是在正常模式下看起来像这样:

normal mode

在编辑模式中这样:

edit mode

但我当前进入编辑模式的是:

current edit view

那么如何让白色背景/边框/圆角回来?

3 个答案:

答案 0 :(得分:0)

如果要在编辑模式下使用原始单元格,则应考虑显示和隐藏单元格,而不是设置背景视图。背景视图作为子视图添加到所有其他视图后面,因此,将其设置为透明无效。参考:Apple Doc

要隐藏或显示表格单元格,请参阅此post

答案 1 :(得分:0)

对于编辑模式,不要设置backgroundView。进入编辑模式时,只需拨打[tableView reloadData],然后像cellForRowAtIndexPath一样设置backgroundView:

if (!editing) {
    nameCell.backgroundView = nameCellDefaultBackview;
}
//if it is editing, then it will take the default style.

希望这会有所帮助。

答案 2 :(得分:0)

我决定改变一下我的方法,现在正在运作:

我现在有两个单元格,而不是试图显示/隐藏一个单元格的背景:

IBOutlet UITableViewCell *nameCellViewMode;
IBOutlet UITableViewCell *nameCellEditMode;

在viewDidLoad中:我更改了nameCellViewMode的背景以使其透明:

UIView *clearBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];
clearBackgroundView.backgroundColor = [UIColor clearColor];

nameCellViewMode.backgroundView = clearBackgroundView;

在接下来的KDaker建议中,我现在只需在setEditing:animated:中执行tableView reloadData,然后在cellForRowAtIndexPath中执行此操作:

if (self.editing)
{
   return nameCellEditMode;
}
else
{
   return nameCellViewMode;
}