Можно ли установить imageView UITableViewCell отдельно для выделенных и выделенных состояний? - PullRequest
0 голосов
/ 05 января 2012

В 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) Изменения останутся без изменений или единственное изображение ViewView будет просто перезаписано?

(3) Чтонаилучший способ эмулировать поведение изображения на состояние в ячейке таблицы?

1 Ответ

0 голосов
/ 05 января 2012
  1. Нет необходимости реализовывать эти логические значения. UITableViewCell имеет свойство ' selected ', которое можно установить в YES, когда пользователь выбирает ячейку.

  2. Ваш UITableViewDelegate обратный вызов - tableView didSelectRowAtIndexPath должен использоваться для установки изображения ячейки (я делаю это, устанавливая изображение UIImageView, добавленного как подпредставление для contentView ячейки), как показано:

    [cell.contentView addSubview: yourImageView];

Возможно, вы хотите отслеживать последнюю ячейку, которая была установлена ​​в выбранное состояние. Это можно сделать, сохранив NSIndexPath ячейки, которая была ранее выбрана. В didSelectRowForIndexPath сначала прочитайте этот путь индекса, возьмите соответствующую ячейку и установите ее изображение как невыбранное.

Я предлагаю для этого создать подкласс UITableViewCell, чтобы вы могли реализовать метод, который принимает UIImageView в качестве аргумента и устанавливает его в наборе UIImageView в качестве фонового изображения ячейки.

Код должен выглядеть следующим образом:

Метод установки изображения в подклассе UITableViewCell:

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

Обратите внимание, что 'backgroundImageView - это ивар UIImageView, который вы будете использовать в своем подклассе UITableViewCell. Когда вы настраиваете свою ячейку, добавьте этот вид изображения в contentView вашей ячейки, как показано ранее.

Как только ваша ячейка настроена с помощью этого метода, ваш метод didSelectRowAtIndexPath должен выглядеть примерно так (обратите внимание, что oldSelectedCell имеет тип NSIndexPath, который содержит indexpath вашей старой выбранной ячейки):

- (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 вашей подклассовой ячейки. Проверьте значение этого свойства и настройте ячейку так, как вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...