it-swarm.com.ru

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

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

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

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

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

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

Какие-либо предложения? Благодарю.

97
Chun

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

72
Matt

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 превратите представление root в 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 .

161
SwiftArchitect

В 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];
17
sash

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

self.contentView.backgroundColor = [UIColor whiteColor];

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

11
Rudolf J

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

Changed to this

9
AmJa

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

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

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

5
ChildhoodAndy

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

4
Hosny

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

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

}

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

4
Voloda2

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

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

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

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

4
samwize

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

3
Eneko Alonso

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

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

Свифт:

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

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

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

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

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

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

0
user3106871

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

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

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

0
kidnapper