Ответ 1
Вы должны либо использовать myTableViewHeaderFooterView.tintColor, либо назначить настраиваемый фоновый вид myTableViewHeaderFooterView.backgroundView.
Я пытаюсь изменить цвет фона UITableViewHeaderFooterView. Хотя вид появляется, цвет фона остается цветом по умолчанию. Я получаю журнал из xcode, говорящий:
Установка цвета фона в UITableViewHeaderFooterView была осуждается. Вместо этого используйте contentView.backgroundColor.
Однако ни один из следующих вариантов не работает:
myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];
Я также попытался изменить цвет фона представления в файле xib.
Любые предложения? Спасибо.
Вы должны либо использовать myTableViewHeaderFooterView.tintColor, либо назначить настраиваемый фоновый вид myTableViewHeaderFooterView.backgroundView.
Единственный способ установить любой цвет (с любым альфа-каналом) - использовать 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
}
Animation воспроизведение анимации
► Найдите это решение на GitHub и дополнительную информацию о Swift Recipes.
В 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.backgroundColor". то я попробовал это:
в файле xib цвет фона для заголовка был выбран для очистки цвета вместо значения по умолчанию, как только я изменил его на значение по умолчанию, предупреждение исчезло.
Для четкого цвета я использую
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];
Мне кажется, что это хорошо.
В 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
Если вы настраиваете ячейку заголовка раздела с помощью Storyboard/Nib, убедитесь, что цвет фона по умолчанию для представления "Заголовок таблицы".
И если вы подклассом UITableViewHeaderFooterView
и с помощью nib, то вам нужно создать IBOutlet
для представления содержимого и назовите его, например. containerView
. Это не следует путать с contentView
, который является родительским элементом этого представления контейнера.
С этой настройкой вместо этого вы меняете цвет фона containerView
.
если вы создали пользовательский подкласс UITableViewHeaderFooterView
с файлом xib
, тогда вы должны переопределить setBackgroundColor
. Держите его пустым.
-(void)setBackgroundColor:(UIColor *)backgroundColor {
}
И это решит вашу проблему.
В конструкторе интерфейса откройте ваш .xib, на верхнем элементе, в инспекторе атрибутов установите цвет фона по умолчанию. Затем перейдите в представление содержимого и установите там цвет фона (ссылка на https://github.com/jiecao-fm/SwiftTheme/issues/24).
Для сплошных цветов фона достаточно установить 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 appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil]
setBackgroundColor: [UIColor.grayColor]];
возможно потому, что backgroundView не существует
override func draw(_ rect: CGRect){
// Drawing code
let view = UIView()
view.frame = rect
self.backgroundView = view
self.backgroundView?.backgroundColor = UIColor.yourColorHere
}
которые работают для меня.
Настройка фонового рисунка с четким цветом отлично подходит для видимых заголовков. Если таблица прокручивается для отображения заголовков внизу, это решение не выполняется.
Таблица P.S.My состоит только из заголовков без каких-либо ячеек.
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 и установите цвет фона, затем установите его в self.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
этого базового представления.
Вы хотите быть внимательным при подключении розетки, чтобы не называть его: backgroundView
, поскольку в некотором superclass
уже есть свойство с этим именем. Я назвал мой containingView
Также при подключении регулятора выхода нажмите на вид в Document Outline
, чтобы убедиться, что он не подключен к file owner
iOS 12, Swift 5. Если вы хотите (или пытаетесь!) использовать внешний прокси-сервер, работает следующее решение:
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
}
}
}
MySectionHeaderView.appearance().forceBackgroundColor = .red
или
MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red