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

124

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

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

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

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

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

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

Chun
источник
2
в iOS 13 у меня работал contentView.backgroundColor. Я думаю, что Apple обновила это
Tà Truhoada 01

Ответы:

95

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

Matt
источник
2
myTableViewHeaderFooterView.tintColor отлично работает. Спасибо за ответ!
Чун
15
Не знаю почему, но для меня tintColorне работает на iOS7. Я мог изменить цвет, только myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
назначив
7
TintColor - это не цвет фона !!
Жуан Нуньес,
189

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];
    
  • 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
    }
    

демонстрация

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

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

SwiftArchitect
источник
5
contentView не существует, поэтому. tintcolor предназначен для окрашивания вида, а не его фона. а backgroundcolor устарел. Таким образом, ваш путь - это способ заставить его работать. Кстати, хороший синтаксис кода
Жоао Нуньес,
@ JoãoNunes, с C # / Xamarin синтаксис стал еще аккуратнее:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj
В Xcode 6.1.1 вы получаете предупреждение консоли во время выполнения:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Альберт Бори
С Xcode6.2 beta5 я все еще получал такое же предупреждение. Мой метод создания UITableViewHeaderFooterView основан на загрузке xib, который похож на пример кода Apple TVAnimationsGestures. Однако TVAnimationGestures с Xcode6.2b5 не генерирует никаких предупреждающих сообщений. В коде Apple вообще нет строки «фона». Конечно, uitableVuewHeaderFooterview.contentView в TVAnimationsGestures равно нулю. Я не понимаю, почему это произошло.
kmugitani
7
Для людей, которые все еще получают предупреждение: убедитесь, что для UITableViewHeaderFooterView не установлен backgroundColor в IB.
Tuslareb
24

В 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];
кушак
источник
Я думаю, что это лучший подход, чем ответ @SwiftArchitect (хотя он сработал). Тот факт, что вам не нужно добавлять новый UIView, делает его лучше. У меня отлично сработало.
Эрик А. Монтаньес
14

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

self.contentView.backgroundColor = [UIColor whiteColor];

Тогда все заработает.

Рудольф Дж.
источник
Только iOS> = 10 !. Для iOS <10 используйте: backgroundView? .BackgroundColor = UIColor.white
Питер Крейнц
12

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

Изменено на это

AmJa
источник
7

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

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

Мне это кажется нормальным.

ChildhoodAndy
источник
1
Установка backgroundView = UIView()и потом backgroundColor = .clearбыла единственным рабочим решением. Спасибо.
Vive
7

Для сплошных цветов фона 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!
    }
}

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

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

введите описание изображения здесь

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

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

введите описание изображения здесь

Энеко Алонсо
источник
Genius! Определение пустого UIView для backgroundView полностью решило проблему для меня! Спасибо!
Луис Диас,
6

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

Hosny
источник
4

На 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

январь
источник
4

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

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

}

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

Voloda2
источник
Для меня это правильный ответ. Хотя я не устанавливаю цвет фона в моем HeaderFooterView, но предупреждающее сообщение продолжает появляться в моем журнале консоли. Так раздражает!
stan liu
4

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

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

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

samwize
источник
1

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

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
tylyo
источник
1

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

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

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

andrew54068
источник
1

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
Эли Берк
источник
1

Забудьте о трудностях.

Добавьте в свой проект UITableViewHeaderFooterView+BGUpdate.swiftс помощью кода ниже:

extension UITableViewHeaderFooterView {

    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundColor
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

Использование просто, как и ожидалось раньше:

headerView.backgroundColor = .red

Примеры использования :

1) У делегата tableView:viewForHeaderInSection::

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tv.dequeueReusableHeaderFooterView(withIdentifier: "MyHeaderView")
    headerView.backgroundColor = .red // <- here
    return headerView
}

или

2) В вашем собственном классе представления заголовка:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
eli7ah
источник
Хорошо ... по-твоему лучше. :) Спасибо
Эли Берк
1
Это решение вызывает рекурсивный цикл на iOS 12.
Koppacetic
0

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

PS Моя таблица состоит только из заголовков без ячеек.

user3106871
источник
0

Swift:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}
AG
источник
0

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

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

источник
0

Я чувствую себя обязанным поделиться своим опытом. У меня был этот фрагмент кода, который отлично работал с 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

Ахмед Хедр
источник
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Шохин
источник
Хотя это может дать ответ на вопрос, он был помечен для проверки. Ответы без объяснения часто считаются некачественными. Пожалуйста, прокомментируйте ответ, почему это правильный ответ.
Дэн