UITableViewHeaderFooterView: неможливо змінити колір тла


124

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

Встановлення кольору фону на UITableViewHeaderFooterView застаріло. Будь ласка, використовуйте натомість contentView.backgroundColor.

Однак жоден із наступних варіантів не працює:

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

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

Будь-які пропозиції? Дякую.


2
в iOS 13 використовуйте contentView.backgroundColor, який працював на мене. Я думаю, що Apple оновила це
Tà Truhoada

Відповіді:


94

Вам слід або використовувати myTableViewHeaderFooterView.tintColor, або призначити спеціальний фоновий вигляд myTableViewHeaderFooterView.backgroundView.


2
myTableViewHeaderFooterView.tintColor працює відмінно. Дякую за відповідь!
Чун

15
Не знаю чому, але для мене tintColorне працює iOS7. Я міг змінити колір, лише призначивши спеціальний перегляд:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder

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 , зробіть root view 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 .


5
contentView не існує саме тому. tintcolor - це підфарбовувати погляд не його фоном. а фоновий колір застарілий. Таким чином, ваш спосіб - це спосіб змусити його працювати. Синтаксис приємного коду Btw
João Nunes

@ 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 немає встановленого фонового кольору в IB.
Туслареб

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 of contentViewдля свого UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Тоді це спрацює.


iOS> = 10! Для iOS <10 використовуйте: backgroundView? .BackgroundColor = UIColor.white
Пітер Крейнц

12

Для мене я спробував усе сказане вище, але все-таки отримував попередження "Налаштування кольору фону на UITableViewHeaderFooterView застаріле. Замість цього використовуйте contentView.backgroundColor". потім я спробував це: у файлі xib вибрано колір тла для перегляду заголовка, щоб очистити колір замість типового, як тільки я змінив його на замовчування, попередження пройшло. було це

Змінився на це


7

Для чіткого кольору я використовую

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

Мені це здається прекрасним.


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!
    }
}

Однак остерігайтеся можливих побічних ефектів. Якщо для подання таблиці не встановлено значення "Згруповано", заголовки розділів будуть оснащені вгорі під час прокрутки вниз. Якщо заголовки розділів прозорі, вміст комірок буде видно наскрізь, що може не виглядати чудово.

Тут заголовки розділів мають прозорий фон:

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

Щоб цього не допустити, краще встановити фон заголовка секції суцільним кольором (або градієнтом), що відповідає фону перегляду таблиці або контролера перегляду.

Тут заголовки розділів мають повністю непрозорий фон градієнта:

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


Геній! Визначення порожнього UIView для backgroundView повністю вирішило проблему для мене! Дякую!
Луїз Діас

6

введіть тут опис зображенняУ конструкторі інтерфейсів підтягніть ваш .xib, на верхньому елементі, інспектор атрибутів встановив колір тла за замовчуванням. Потім перейдіть до перегляду вмісту та встановіть там колір тла (посилання на https://github.com/jiecao-fm/SwiftTheme/isissue/24 ).


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і я отримав таку ж помилку від ОП.

Встановлення кольору фону на UITableViewHeaderFooterView застаріло. Будь ласка, використовуйте натомість contentView.backgroundColor.

Тож тепер усе працює чудово і без попереджень, використовуючи headerView.backgroundView.backgroundColor


4

якщо ви створили користувальницький підклас UITableViewHeaderFooterViewз xibфайлом , то ви повинні перевизначити setBackgroundColor. Тримайте його порожнім.

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

}

І це вирішить вашу проблему.


Це правильна відповідь для мене. Хоча я не встановлюю фоновий колір у своєму HeaderFooterView, але попереджувальне повідомлення залишається в журналі консолі. Так дратує!
stan liu

4

Якщо ви налаштовуєте комірку заголовка розділу за допомогою Storyboard / Nib , тоді переконайтеся, що колір тла за замовчуванням для подання "Заголовок розділу таблиці".

І якщо ви підкласи UITableViewHeaderFooterViewі використовуєте nib, то вам потрібно створити IBOutletперегляд вмісту і назвати його, наприклад. containerView. Це не слід плутати з тим contentView, що є батьківщиком цього подання контейнера.

За допомогою цієї установки ви заміняєте колір тла containerView.


1

Я спробував із появою ланцюгаWhenContainIn, і це працювало на мене.

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

1

можливо тому, що backgroundView не існує

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

які працюють для мене.


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
    }
}

Гаразд ... ваш шлях краще. :) Дякую
Елі Берк

1
Це рішення викликає рекурсивний цикл на iOS 12.
Koppacetic

0

Встановлення прозорого кольору BackgroundView добре працює для видимих ​​заголовків. Якщо таблиця прокручується для показу заголовків внизу, це рішення виходить з ладу.

Таблиця PSMy складається лише із заголовків без комірок.


0

Швидкий:

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

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 11headerView?.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

Хоча це може відповісти на питання, воно було позначено для розгляду. Відповіді без пояснень часто вважають неякісними. Будь ласка, надайте коментар у відповіді, чому це правильна відповідь.
День
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.