UIView backgroundColor исчезает при выборе UITableViewCell - PullRequest
69 голосов
/ 07 марта 2011

У меня есть простое построение tableViewCell в построителе интерфейса. Он содержит UIView, который содержит изображение. Теперь, когда я выбираю ячейку, показывается синий фон выделения по умолчанию, но backgroundColor моего UIView пропал.

Файл реализации моего UITableViewCell не делает ничего особенного. Это только инициализация и возврат себя, и все, что я делаю в setSelected, это вызов super.

Как мне заставить мой UIView backgroundColor показывать, когда выбран tableView?

Ответы [ 17 ]

1 голос
/ 02 августа 2015

Добавьте это к вашему UITableViewCell

override func setHighlighted(highlighted: Bool, animated: Bool) {
    super.setHighlighted(false, animated: animated)
    if highlighted {
        self.backgroundColor = UIColor.blueColor()
    }else{
        UIView.animateWithDuration(0.2, animations: {
            self.backgroundColor = UIColor.clearColor()
        })
    }
}
1 голос
/ 03 октября 2017

Swift 4

В вашем UITableViewCell классе:

override func setSelected(_ selected: Bool, animated: Bool) {
    myView.backgroundColor = UIColor.blue
}

override func setHighlighted(_ highlighted: Bool, animated: Bool) {
    myView.backgroundColor = UIColor.blue
}
0 голосов
/ 22 августа 2016

Вот мое мнение.У меня есть подкласс, от которого наследуются все мои ячейки, поэтому я так делаю, чтобы избежать изменения фона в моих UIImageViews:

    override func setHighlighted(highlighted: Bool, animated: Bool) {
    var backgroundColors = [UIView: UIColor]()

    for view in contentView.subviews as [UIView] {
        if let imageView = view as? UIImageView {
            backgroundColors[imageView] = imageView.backgroundColor
        }
    }

    super.setHighlighted(highlighted, animated: animated)

    for view in contentView.subviews as [UIView] {
        if let imageView = view as? UIImageView {
            imageView.backgroundColor = backgroundColors[imageView]
        }
    }
}

override func setSelected(selected: Bool, animated: Bool) {
    var backgroundColors = [UIView: UIColor]()

    for view in contentView.subviews as [UIView] {
        if let imageView = view as? UIImageView {
            backgroundColors[imageView] = imageView.backgroundColor
        }
    }

    super.setSelected(selected, animated: animated)

    for view in contentView.subviews as [UIView] {
        if let imageView = view as? UIImageView {
            imageView.backgroundColor = backgroundColors[imageView]
        }
    }
}

Это автоматически устраняет проблему для всех UIImageView.

0 голосов
/ 26 июля 2015

Просто потратил некоторое время на эту странную проблему.Я не хотел устанавливать стиль UITableViewCellSelectionStyleNone, чтобы сохранить хорошую анимацию, когда моя строка была выбрана.Но ни одна из предложенных идей не работала для меня - я пытался переопределить setSelected и setHighlighted и установить там свой backgroundview backgroundColor - он продолжал сбрасываться iOS и продолжал мигать (новый цвет -> старый цвет).Для меня это было довольно просто.Когда моя строка выбрана, другой контроллер представления выдвигается, пользователь выбирает какую-то опцию на этом экране, и вызывается делегат, где я меняю цвет в зависимости от выбора пользователя.В этом делегате я просто делаю [cell setSelected: NO animated: NO] для моей ячейки.(У меня есть статический UITableViewController и есть выходы в ячейки).Возможно, вы можете отменить выбор ячейки в методе didSelect, но в моем случае я использую segues.

0 голосов
/ 10 марта 2011

Вы можете изменить поведение tableViewCell, переопределив функцию setHighlighted в классе UITableViewCell (вам нужно наследовать от него). Пример моего кода, где я меняю фоновое изображение своей ячейки:

// animate between regular and highlighted state
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated; {
    [super setHighlighted:highlighted animated:animated];

    //Set the correct background Image
    UIImageView* backgroundPicture = (UIImageView*)[self viewWithTag:HACK_BACKGROUND_VIEW_TAG];
    if (highlighted) {
        backgroundPicture.image = [UIImage imageNamed:@"FondSelected.png"]; 
    }
    else {
        backgroundPicture.image = [UIImage imageNamed:@"Fond.png"]; 
    }
}

Вы также можете изменить режим выбора на серый, синий или нет в конструкторе интерфейсов.

0 голосов
/ 21 мая 2014

В iOS 7 для меня сработало переопределение setSelected:animated: в подклассе UITableViewCell, но, вопреки совету @Brooks, я позвонил [super setSelected:selected animated:animated].

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Reassert the background color of the color view so that it shows
    // even when the cell is highlighted for selection.
    self.colorView.backgroundColor = [UIColor blueColor];
}

Это позволяет мнесохранить анимацию выбора системы по умолчанию, когда пользователь касается ячейки, а также отменить ее выбор в делегате табличного представления didSelectRowAtIndexPath:.

0 голосов
/ 07 марта 2011

Из того, что вы сказали, что создали tableViewCell с использованием IB, я хотел бы проверить, добавляете ли вы свое представление как подпредставление contentView UITableViewCell, а не view.Представление содержимого является суперпредставлением по умолчанию для содержимого, отображаемого ячейкой.

Из ссылки:

Представление содержимого объекта UITableViewCell является суперпредставлением по умолчанию для содержимого, отображаемого ячейкой.,Если вы хотите настроить ячейки, просто добавив дополнительные представления, вы должны добавить их в представление содержимого, чтобы они располагались надлежащим образом при переходе ячейки в режим редактирования и из него.

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