是否可以为选定和突出显示的状态单独设置UITableViewCell的imageView?

时间:2012-01-05 02:03:42

标签: iphone ios4 uitableview uibutton

在UIButton中,以下方法明确允许为不同的状态设置不同的图像:

// default is nil. should be same size if different for different states
- (void)setImage:(UIImage *)image forState:(UIControlState)state;

(1)UITableViewCell也可以做类似的事情吗?例如,通过将某些状态切换为true然后设置imageView?

// set selected state (title, image, background). default is NO. animated is NO
@property(nonatomic,getter=isSelected) BOOL         selected;
// set highlighted state (title, image, background). default is NO. animated is NO
@property(nonatomic,getter=isHighlighted) BOOL      highlighted;

(2)变化是否会持续存在或者单一的imageView会被覆盖吗?

(3)在表格单元格中模拟每个州的图像行为的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

  1. 无需实施这些布尔值。 UITableViewCell具有“selected”属性,当用户选择单元格时,您可以将其设置为YES。

  2. 您的UITableViewDelegate回调 - tableView didSelectRowAtIndexPath应该用于设置单元格的图像(我这样做是通过将添加为子视图的UIImageView图像设置为单元格的contentView)如图所示:

    [cell.contentView addSubview:yourImageView];

  3. 您可能希望跟踪设置为选定状态的最后一个单元格。这可以通过存储先前选择的单元格的NSIndexPath来完成。在didSelectRowForIndexPath中,首先读取此索引路径,抓取相应的单元格并将其图像设置为未选择的单元格。

    我建议为此子类化UITableViewCell,以便您可以实现一个方法,该方法将UIImageView作为参数并将其设置为UIImageView设置为单元格的背景图像。

    代码应该都是这样的:

    子类UITableViewCell中的图像设置方法:

    - (void)setCellBackgroundImage:(UIImage*)inImage
    {
        backgroundImageView.image = inImage;
    }
    

    请注意,'backgroundImageView是您将在子类UITableViewCell中使用的UIImageView ivar。设置单元格时,将此图像视图添加到单元格的contentView中,如前所示。

    使用该方法设置单元格后,您的didSelectRowAtIndexPath方法应如下所示(请注意,oldSelectedCell的类型为NSIndexPath,其中包含旧选定单元格的索引路径):

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UIImage *selectedImage = [UIImage imageNamed:@"path/to/your/selected/image.png"];
        UIImage *deSelectedImage = [UIImage imageNamed:@"path/to/your/deselected/image.png"];
    
        if(oldSelectedCell != nil)
        {
            //Assuming SubclassedCell is the name of your subclass of UITableViewCell
            SubclassedCell *cell = (SubclassedCell*)[tableView cellForRowAtIndexPath:oldSelectedCell];
    
            //Set the previously selected cell's image to be the deselected image
            [cell setCellBackgroundImage:deSelectedImage];
    
            //Set the cell to be deselected
            cell.selected = NO;
        }
    
        //Set the current cell's image
        SubclassedCell *cell = (SubclassedCell*)[tableView cellForRowAtIndexPath:indexPath];
    
        [cell setBackgroundImage:selectedImage];
        cell.selected = YES;
    
        //Save this cell's indexpath to be the previously selected cell for the next time this method is invoked
        oldSelectedCell = indexPath;
    
        //And you're done!
    }
    

    单元格的“selected”属性可用于在子类化单元格的layoutSubviews实现中设置它的视图。检查该属性的值并根据需要设置单元格。