如何在 UITableViewCell 中获得透明的附件视图? (带截图)

Posted

技术标签:

【中文标题】如何在 UITableViewCell 中获得透明的附件视图? (带截图)【英文标题】:How to get Transparent Accessory View in UITableViewCell? (w/ Screenshot) 【发布时间】:2009-10-01 12:28:41 【问题描述】:

我使用来自笔尖的自定义 UITableViewCell。附件视图是一个详细信息披露指示器。问题是辅助视图后面的 UITableViewCell 的背景颜色没有被渲染(参见下面的图像/源代码)。有什么线索吗?另外,这里有一些我尝试过但没有奏效的方法:

无效的事情: - 将附件视图的 backgroundColor 设置为 clearColor - 将单元格的 contentView.opaque 设置为 FALSE - 将表格视图的 contentView.opaque 设置为 FALSE - 为单元格设置非默认附件视图

alt text http://www.chicknchoke.com/so/IMG_8028.png

    -(void)showTablePrep
    
        myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 480, 320, 416) style:UITableViewStylePlain];
        myTableView.dataSource = self;
        myTableView.delegate = self;
        myTableView.delaysContentTouches = FALSE;
        myTableView.opaque = FALSE;
        myTableView.rowHeight = 60;

        [UIView beginAnimations:@"SlideUp" context:nil];
        [UIView setAnimationDuration:0.3f];

        [myTableView setCenter:CGPointMake(myTableView.center.x, myTableView.center.y-436)];
        [self.view addSubview:myTableView];
        [self.view bringSubviewToFront:myTableView];

        [UIView commitAnimations];


    




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    FriendsCell* cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCellID"];

    if (cell == nil)

        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FriendsCellView" owner:self options:nil];

        cell = (FriendsCell*)[nib objectAtIndex:0];

        if(indexPath.row % 2 == 0)

        cell.contentView.backgroundColor = [UIColor grayColor];


        else

        cell.contentView.backgroundColor = [UIColor lightGrayColor];


        
        cell.accessoryView.backgroundColor = [UIColor clearColor];
        cell.contentView.opaque = FALSE;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;


    if(f

riendsCounter > indexPath.row)


            cell.titleLabel.text = @"Label";
            cell.descLabel.text = @"Description goes here";

        else

            cell.titleLabel.text = @"";
            cell.descLabel.text = @"";
            cell.accessoryType = UITableViewCellAccessoryNone;

        

        

        return cell;    
    

【问题讨论】:

【参考方案1】:

您为单元格绘制的背景颜色不正确。 UITableViewCell 将被安排,以便 contentViewaccessoryView 并排放置。 (这样做是为了让contentView 可以剪裁其内容,使其不与附件视图重叠)问题不在于附件视图不透明,而是根本没有在附件视图后面绘制灰色背景。

自定义UITableViewCell后面绘制的背景的正确方法是自定义其backgroundView。我没有尝试过,但由于您只是更改颜色,您可以简单地将backgroundView 上的backgroundColor 颜色设置为您想要的颜色。

【讨论】:

我还想提一下,这里有一个非常棒的自定义 UITableView 绘图概述:cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html 这对我有用:cell.backgroundView = [[UIView alloc] init ]; cell.backgroundView.backgroundColor = [UIColor yellowColor]; @joshaidan 不要忘记释放您创建的视图(除非您使用 ARC): cell.backgroundView = [[[UIView alloc] init] autorelease]; @manicaesar 是的,我正在使用自动释放,我想我在运行分析时发现了这一点。谢谢! 还要记住:“如果要更改单元格的背景颜色,请在 tableView:willDisplayCell:forRowAtIndexPath: 表视图委托的方法中进行”【参考方案2】:

我通过查看自定义表格视图单元格的子视图找到了答案。

附件视图上似乎有一个按钮。通过在子视图中找到此按钮并更改其颜色,我能够更新辅助按钮后面的背景颜色。

<UIButton: 0x3b4d690; frame = (277 0; 43 75); opaque = NO; layer = <CALayer: 0x3b3e0b0>>

for (UIView *aSubView in self.subviews) 
    if ([aSubView isMemberOfClass:[UIButton class]]) 
        aSubView.backgroundColor = [UIColor greenColor];
    

不幸的是,我只能在

中访问此按钮
- (void)setSelected:(BOOL)selected animated:(BOOL)animated 

我的自定义表格视图单元格类的方法。当用户选择一个单元格时,我已在我的应用程序中成功使用它来显示不同的突出显示颜色。这应该会为您指明正确的方向。

【讨论】:

【参考方案3】:

我在 ios7 上解决了这个问题,但添加了

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

然后你在这里修改你的背景和其他背景:

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    return YES;


- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    // Add your Colour.
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setBackgroundColor:[UIColor colorWithHexColor:HIGHLIGHT_COLOR]];


- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    // Reset Colour.
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setBackgroundColor:[UIColor colorWithHexColor:UNHIGHLIGHT_COLOR]];   

【讨论】:

以上是关于如何在 UITableViewCell 中获得透明的附件视图? (带截图)的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 UITableViewCell 背景透明?

如何将 UITableViewCell 从“正常”视图切换为透明,然后再返回

使用 moveRow(at:,to:) 时如何更改 UITableViewCell 的不透明度和颜色

iOS UITableViewCell点击时子视图背景透明的解决方法

如何在iOS 7上的UITableViewCell左侧获得复选标记,就像在设置中一样?

如何在 UITableViewCell swift 中获得正确的 UIView 宽度