UITableViewHeaderFooterView: невозможно изменить цвет фона

Я пытаюсь изменить цвет фона UITableViewHeaderFooterView. Хотя вид появляется, цвет фона остается цветом по умолчанию. Я получаю журнал из xcode, говорящий:

Установка цвета фона в UITableViewHeaderFooterView была осуждается. Вместо этого используйте contentView.backgroundColor.

Однако ни один из следующих вариантов не работает:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

Я также попытался изменить цвет фона представления в файле xib.

Любые предложения? Спасибо.

Ответ 1

Вы должны либо использовать myTableViewHeaderFooterView.tintColor, либо назначить настраиваемый фоновый вид myTableViewHeaderFooterView.backgroundView.

Ответ 2

iOS 8, 9, 10, 11...

Единственный способ установить любой цвет (с любым альфа-каналом) - использовать backgroundView:

Swift

self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

Obj-C

self.backgroundView = ({
    UIView * view = [[UIView alloc] initWithFrame:self.bounds];
    view.backgroundColor = [UIColor colorWithWhite: 0.5 alpha:0.5];
    view;
    });

Ответы на комментарии

  • Ни один из этих других параметров надежно не работает (несмотря на комментарии ниже)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • размер backgroundView изменяется автоматически. (Нет необходимости добавлять ограничения)

  • Контролируйте альфа с помощью UIColor(white: 0.5, alpha: 0.5) или backgroundView.alpha = 0.5.
    (конечно, подойдет любой цвет)

  • При использовании XIB сделайте корневой вид UITableViewHeaderFooterView и программно свяжите backgroundView:

    Зарегистрируйтесь в:

    tableView.register(UINib(nibName: "View", bundle: nil),
                       forHeaderFooterViewReuseIdentifier: "header")
    

    Загрузить с помощью:

    override func tableView(_ tableView: UITableView,
                            viewForHeaderInSection section: Int) -> UIView? {
        if let header =
            tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") {
            let backgroundView = UIView(frame: header.bounds)
            backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
            header.backgroundView = backgroundView
            return header
        }
        return nil
    }
    

Demo

Animation воспроизведение анимации

► Найдите это решение на GitHub и дополнительную информацию о Swift Recipes.

Ответ 3

В iOS 7 contentView.backgroundColor работал у меня, tintColor не сделал.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Хотя clearColor не работал у меня, решение, которое я нашел, - установить свойство backgroundView на прозрачное изображение. Может быть, это поможет кому-то:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];

Ответ 4

Удостоверьтесь, что вы установите backgroundColor contentView для UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Тогда он будет работать.

Ответ 5

Для меня я попробовал все, что было сказано выше, но все же получал предупреждение "Установка цвета фона в UITableViewHeaderFooterView устарела. Вместо этого используйте contentView.backgroundColor". то я попробовал это: в файле xib цвет фона для заголовка был выбран для очистки цвета вместо значения по умолчанию, как только я изменил его на значение по умолчанию, предупреждение исчезло. было это

Изменено для этого

Ответ 6

Для четкого цвета я использую

self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];

Мне кажется, что это хорошо.

Ответ 7

В iOS9 headerView.backgroundView.backgroundColor работал у меня:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    TableViewHeader *headerView = (TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section];
    headerView.backgroundView.backgroundColor = [UIColor redColor];
}

В iOS8 я без проблем использовал headerView.contentView.backgroundColor, но теперь с iOS 9 у меня возникла странная проблема, из-за которой цвет фона не заполнял все пространство ячейки. Поэтому я попробовал просто headerView.backgroundColor, и я получил ту же ошибку от OP.

Установка цвета фона в UITableViewHeaderFooterView была осуждается. Вместо этого используйте contentView.backgroundColor.

Итак, теперь все работает отлично и без предупреждений, используя headerView.backgroundView.backgroundColor

Ответ 8

Если вы настраиваете ячейку заголовка раздела с помощью Storyboard/Nib, убедитесь, что цвет фона по умолчанию для представления "Заголовок таблицы".

И если вы подклассом UITableViewHeaderFooterView и с помощью nib, то вам нужно создать IBOutlet для представления содержимого и назовите его, например. containerView. Это не следует путать с contentView, который является родительским элементом этого представления контейнера.

С этой настройкой вместо этого вы меняете цвет фона containerView.

Ответ 9

если вы создали пользовательский подкласс UITableViewHeaderFooterView с файлом xib, тогда вы должны переопределить setBackgroundColor. Держите его пустым.

-(void)setBackgroundColor:(UIColor *)backgroundColor {

}

И это решит вашу проблему.

Ответ 10

enter image description here В конструкторе интерфейса откройте ваш .xib, на верхнем элементе, в инспекторе атрибутов установите цвет фона по умолчанию. Затем перейдите в представление содержимого и установите там цвет фона (ссылка на https://github.com/jiecao-fm/SwiftTheme/issues/24).

Ответ 11

Для сплошных цветов фона достаточно установить contentView.backgroundColor:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .red // Works!
    }
}

Для цветов с прозрачностью, включая цвет .clear, это больше не работает:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .clear // Does not work 😞
    }
}

Для полностью прозрачного заголовка раздела установите для свойства backgroundView пустое представление:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.backgroundView = UIView() // Works!
    }
}

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

Здесь заголовки разделов имеют прозрачный фон:

enter image description here

Чтобы предотвратить это, лучше установить фон заголовка раздела в сплошной цвет (или градиент), соответствующий фону вашего представления таблицы или контроллера представления.

Здесь заголовки разделов имеют полностью непрозрачный градиентный фон:

enter image description here

Ответ 12

Я попробовал с появлением цепочку появления в сети, и это сработало для меня.

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];

Ответ 13

возможно потому, что backgroundView не существует

override func draw(_ rect: CGRect){
    // Drawing code
    let view = UIView()
    view.frame = rect
    self.backgroundView = view
    self.backgroundView?.backgroundColor = UIColor.yourColorHere
}

которые работают для меня.

Ответ 14

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

Таблица P.S.My состоит только из заголовков без каких-либо ячеек.

Ответ 15

Swift:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}

Ответ 16

Создайте UIView и установите цвет фона, затем установите его в self.backgroundView.

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}

Ответ 17

Я вынужден поделиться своим опытом. У меня была эта часть кода, которая отлично работала с iOS 10 и iOS 11 headerView?.contentView.backgroundColor = .lightGray

Затем я вдруг решил развернуть приложение для iOS 9, так как есть некоторые устройства (iPad mini, какое-то старшее поколение не обновляет ни одну ОС за 9). Единственное решение, которое работало для всех iOS 9, 10 и 11 заключалось в том, чтобы определить базовый вид заголовка, который затем содержит все другие заголовки заголовков, подключить его из раскадровки и установить backgroundColor этого базового представления.

Вы хотите быть внимательным при подключении розетки, чтобы не называть его: backgroundView, поскольку в некотором superclass уже есть свойство с этим именем. Я назвал мой containingView

Также при подключении регулятора выхода нажмите на вид в Document Outline, чтобы убедиться, что он не подключен к file owner

Ответ 18

iOS 12, Swift 5. Если вы хотите (или пытаетесь!) использовать внешний прокси-сервер, работает следующее решение:

  1. Подкласс UITableViewHeaderFooterView и предоставьте свои собственные настройки прокси внешнего вида.
final class MySectionHeaderView: UITableViewHeaderFooterView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
    }

    @objc dynamic var forceBackgroundColor: UIColor? {
        get { return self.contentView.backgroundColor }
        set(color) {
            self.contentView.backgroundColor = color
            // if your color is not opaque, adjust backgroundView as well
            self.backgroundView?.backgroundColor = .clear
        }
    }
}
  1. Установите внешний вид прокси на желаемую степень детализации.
MySectionHeaderView.appearance().forceBackgroundColor = .red

или

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red