Как изменить синий цвет выделения UITableViewCell?

131

Мне интересно, как изменить синий цвет выделения / выделения UITableViewCell, есть идеи?

Томас Джус
источник

Ответы:

213

Вы можете изменить цвет выделения несколькими способами.

  1. Измените свойство selectionStyle вашей ячейки. Если вы измените его на UITableViewCellSelectionStyleGray, он будет серым.

  2. Измените selectedBackgroundViewсвойство. На самом деле то, что создает синий градиент, - это вид. Вы можете создавать представление и рисовать что угодно, а также использовать представление в качестве фона для ячеек представления таблицы.

zonble
источник
8
круто, нашел здесь хорошее объяснение и пример: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos
1
Я понял, что в IB вы не можете установить UITableViewCell "Selection" в "None" - потому selectedBackgroundViewчто тогда он просто никогда не появится. Только после установки "Выбор" по умолчанию, selectedBackgroundViewпоявится. Протестировано на iOS 6 и 7.
Jonny
12
Спасибо за отличную заметку! Теперь это очень просто: вы создаете новый вид (не нужно даже указывать фрейм: cell.selectedBackgroundView = [UIView new];и вы устанавливаете любой цвет, который хотите:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Дэнни П.
посмотрите внизу этой страницы, есть более свежие подходы
Climbatize
144

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

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1];
    cell.selectedBackgroundView = selectionColor;
  • ячейка моя UITableViewCell
  • Я создал UIView и установил цвет фона, используя цвета RGB (светло-серый)
  • Затем я устанавливаю ячейку selectedBackgroundView, UIViewкоторую я создал с выбранным мной цветом фона.

Это хорошо сработало для меня. Спасибо Zonble за подсказку.

Т. Дэви
источник
2
Это не очень хорошо работает при использовании табличных представлений с разделами. При выборе ячейка теряет границы и не округляется при выборе первой или последней ячейки.
Кирк Уолл
7
@kirk, вы имеете в виду сгруппированы :)
Tieme
@Tieme, нет, я имею в виду разделы : « Табличное представление состоит из нуля или более разделов, каждый со своими строками».
Кирк Уолл
Вы должны поместить его в cellForRowAtIndexPath. У меня отлично работает, с одним разделом. Не пробовал с несколькими разделами.
Винсент
Немного поздно в игре, но я могу подтвердить, что он работает в табличном представлении с несколькими разделами (не сгруппированными)
matto0
30

UITableViewCell имеет три стиля выбора по умолчанию: -

  1. синий
  2. Серый
  3. Никто

Реализация выглядит следующим образом: -

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

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}
Аршад Парвез
источник
7
вместо этих трех стилей по умолчанию мы также можем настроить наш ожидаемый стиль с помощью свойства selectedBackgroundView.
Сунил Тардж
Сработало у меня ... Большое спасибо.
Муджиб Фаруки,
19

В Swift используйте это в cellForRowAtIndexPath

let selectedView = UIView()
selectedView.backgroundColor = .white
cell.selectedBackgroundView = selectedView

Если вы хотите, чтобы цвет выделения был одинаковым во всех UITableViewCell, используйте это в AppDelegate.

let selectedView = UIView()
selectedView.backgroundColor = .white
UITableViewCell.appearance().selectedBackgroundView = selectedView
alitosuner
источник
18

Если вы хотите изменить его в масштабе всего приложения, вы можете добавить логику в свой делегат приложения.

class AppDelegate: UIResponder, UIApplicationDelegate {

    //... truncated

   func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

        // set up your background color view
        let colorView = UIView()
        colorView.backgroundColor = UIColor.yellowColor()

        // use UITableViewCell.appearance() to configure 
        // the default appearance of all UITableViewCells in your app
        UITableViewCell.appearance().selectedBackgroundView = colorView

        return true
    }

    //... truncated
}
NatashaTheRobot
источник
Отлично. Есть идеи, как установить цвет текста этой ячейки по умолчанию глобально при выборе?
BananaAcid
1
это работает, но затем выбор очищается непосредственно при нажатии нового контроллера представления.
bobmoff
Хороший способ внести глобальные изменения в UITableViewCell
Shashi3456643 08
12

для полноты: если вы создали свой собственный подкласс, UITableViewCellвы можете реализовать - (void)setSelected:(BOOL)selected animated:(BOOL)animatedметод и установить цвет фона некоторого представления, которое вы добавили в представление содержимого. (если это так) или самого contentView (если он не покрывается одним из ваших собственных представлений.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected) {
        self.contentView.backgroundColor = UIColor.blueColor;
    } else {
        self.contentView.backgroundColor = UIColor.whiteColor;
    }
}

(не использовал? чтобы уместить небольшую ширину DIV исходного кода :)

у этого подхода есть два преимущества перед использованием selectedBackgroundView: он использует меньше памяти и немного меньше ЦП, чего вы даже не заметили бы, если бы не отображали сотни ячеек.

Мартейн Шеффер
источник
Это работает только после того, как новое представление будет назначено в selectedBackgroundView самом начале метода addself. selectedBackgroundView = [UIView new];
enadun
@enadun Этот метод работает у меня на iOS 12, без каких-либо настроек selectedBackgroundViewсвойства.
Нейт
11

Мне нужно установить стиль выбора, чтобы UITableViewCellSelectionStyleDefaultпользовательский цвет фона работал. Если какой-либо другой стиль, пользовательский цвет фона будет проигнорирован. Проверено на iOS 8.

Полный код ячейки выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // This is how you change the background color
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor redColor];
    [cell setSelectedBackgroundView:bgColorView];

    return cell;
}
samwize
источник
6

Основываясь на ответе @ user , вы можете просто добавить это расширение в любом месте кода вашего приложения и выбрать цвет прямо в редакторе раскадровки для каждой ячейки вашего приложения:

@IBDesignable extension UITableViewCell {
    @IBInspectable var selectedColor: UIColor? {
        set {
            if let color = newValue {
                selectedBackgroundView = UIView()
                selectedBackgroundView!.backgroundColor = color
            } else {
                selectedBackgroundView = nil
            }
        }
        get {
            return selectedBackgroundView?.backgroundColor
        }
    }
}

Цвет выбора UITableViewCell в раскадровке

Climbatize
источник
5
@IBDesignable class UIDesignableTableViewCell: UITableViewCell {
  @IBInspectable var selectedColor: UIColor = UIColor.clearColor() {
    didSet {
      selectedBackgroundView = UIView()
      selectedBackgroundView?.backgroundColor = selectedColor
    }
  }
}

В раскадровке установите для класса UITableViewCell значение UIDesignableTableViewCell, в инспекторе атрибутов вы можете изменить выбранный цвет ячейки на любой цвет.

Вы можете использовать это для всех своих ячеек. Так будет выглядеть ваш инспектор атрибутов.

Так будет выглядеть ваш инспектор атрибутов

пользователь
источник
Очень креативно! здорово!
Kaushil Ruparelia
вы можете сделать это еще проще, посмотрите мой ответ;) stackoverflow.com/a/51764804/537694
Climbatize
Я использую пользовательскую ячейку для установки меток, так что это хорошо работает, спасибо! Изменения для Swift 5: Сейчас UIColor.clear, нет UIColor.clearColor(). Не уверен, что это изменение и в Swift, но оно работает и без него @IBDesignable.
Неф
5

Swift 3.0 / 4.0

Если вы создали свою собственную ячейку, вы можете изменить цвет выделения awakeFromNib()для всех ячеек:

 override func awakeFromNib() {
    super.awakeFromNib()

    let colorView = UIView()
    colorView.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

    self.selectedBackgroundView = colorView


}
Сэм Бинг
источник
0

1- Добавьте представление в представление содержимого вашей ячейки.
2- Щелкните правой кнопкой мыши свою ячейку.
3- Сделайте добавленное представление как «selectedBackgroundView» введите описание изображения здесь

Бадр
источник