Принадлежность UITableViewCell не окрашивается

Я прочитал несколько Q & A по теме, но ни один из них не работает, поэтому вот моя проблема.

Я создал пользовательский UITableViewCell и в Раскадке, я попросил, чтобы там был индикатор индикатора раскрытия. Говорят, что tintColor должен изменить цвет индикатора, но после долгих исследований, вот что я нашел:

  • Элемент cellView отображает значение nil, поэтому я не могу повлиять на него tintColor

Я попытался создать аксессуар, как это было сделано с помощью selectedBackgroundView, например:

self.accessoryView = UIView()

Очевидно, что он просто создает пустое пространство, а оригинальное устройство для раскрытия информации исчезает. Я действительно путаюсь со всем этим и не могу найти способ повлиять на цвет аксессуара. Любая помощь будет очень приветствуем!

Ответ 1

Вот что помогло мне и помогло другим.

Атрибут tintColor любого типа и подтипов UIView будет распространять его настройку оттенка на subviews в его иерархии. Вы можете установить tintColor для UITableView, и он будет применяться ко всем ячейкам внутри.

Тем не менее, к сожалению, не все типы UITableViewCell Accessory могут быть окрашены.

Те, кто получает оттенок:

  • UITableViewCellAccessoryCheckmark
  • UITableViewCellAccessoryDetailButton
  • UITableViewCellAccessoryDetailDisclosureButton → только подробная часть

Следующие цвета не отображаются:

  • UITableViewCellAccessoryDisclosureIndicator
  • UITableViewCellAccessoryDetailDisclosureButton → только кнопка Disclosure

Как правило, вы сможете изменить цвет своих UITableViewCell Accessories. Но если вы хотите изменить серо-стрелку, которая обычно указывает на переход к другому виду, никаких шансов, он останется серым.

Единственный способ изменить это - фактически создать пользовательский UIAccessoryView. Вот одна цель целенаправленно разбита, чтобы ее было ясно. Хотя я считаю, что существуют лучшие способы:

В моем пользовательском классе UITableViewCell в методе awakeFromNib()

let disclosureImage = UIImage(named: "Disclosure Image")
let disclosureView = UIImageView(image: disclosureImage)
disclosureView.frame = CGRectMake(0, 0, 25, 25)
self.accessoryView = disclosureView

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

Ответ 2

Расширение

extension UITableViewCell {
    func prepareDisclosureIndicator() {
        for case let button as UIButton in subviews {
            let image = button.backgroundImageForState(.Normal)?.imageWithRenderingMode(.AlwaysTemplate)
            button.setBackgroundImage(image, forState: .Normal)
        }
    }
}

Swift 3:

    extension UITableViewCell {
        func prepareDisclosureIndicator() {
            for case let button as UIButton in subviews {
            let image = button.backgroundImage(for: .normal)?.withRenderingMode(.
                alwaysTemplate)
            button.setBackgroundImage(image, for: .normal)
        }
    }
}

Сделайте это

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.prepareDisclosureIndicator()
}

swift 3:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.prepareDisclosureIndicator()

}

Objective-C:

for (UIView *subview in cell.subviews) {
    if ([subview isMemberOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)subview;
        UIImage *image = [[button backgroundImageForState:UIControlStateNormal] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        [button setBackgroundImage:image forState:UIControlStateNormal];
    }
}