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


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

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

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

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

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

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

17 90

17 ответов:

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

iOS 8, 9, 10, 11...

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

Свифт

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];
    
  • the backgroundView изменяется автоматически. (нет необходимости добавлять ограничения)

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

  • при использовании XIB, сделать корневой вид a 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

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

► найти это решение на GitHub и дополнительные сведения о Быстрые Рецепты.

в 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];

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

self.contentView.backgroundColor = [UIColor whiteColor];

тогда это будет работать.

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

Changed to this

On iOS 9 охотаheaderView.backgroundView.backgroundColor работала на меня:

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

On iOS8 Я был с помощью headerView.contentView.backgroundColor без проблем, но теперь с iOS 9 я получал странную проблему, которая заставляла цвет фона не заполнять все пространство ячейки. Так что я попробовал просто headerView.backgroundColor и я получил ту же ошибку от OP.

установка цвета фона на UITableViewHeaderFooterView была не одобрять. Пожалуйста, используйте contentView.свойство backgroundColor вместо.

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

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

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

}

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

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

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

Мне кажется, все в порядке.

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

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

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

для цветов сплошного фона установите 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

Я попытался с appearanceWhenContainedIn цепи, и это сработало для меня.

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

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

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

P. S. Мои таблицы состоит только из заголовков без каких-либо клеток.

Swift:

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

создать UIView и установить цвет фона, а затем установить его на себя.backgroundView.

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

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

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

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

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

может быть, потому что backgroundView не существует

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

это работает для меня.