我正在尝试更改 UITableViewHeaderFooterView 的背景颜色。尽管视图正在出现,但背景颜色仍然是默认颜色。我从 xcode 得到一个日志说:
在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改用 contentView.backgroundColor。
但是,以下选项均无效:
myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];
我还尝试更改 xib 文件中视图的背景颜色。
有什么建议么?谢谢。
iOS 8、9、10、11...
设置任何颜色(使用任何 alpha)的唯一方法是使用 backgroundView
:
迅速
self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
对象-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 控制 alpha。 (当然,任何颜色都可以)
使用 XIB 时,将根视图设为 UITableViewHeaderFooterView 并以编程方式关联 backgroundView: 注册:tableView.register(UINib(nibName: "View", bundle: nil), forHeaderFooterViewReuseIdentifier: "header") 加载:覆盖 func tableView(_ tableView :UITableView,viewForHeaderInSection 部分: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无 }
https://i.stack.imgur.com/2dvo5.gif
► 在 GitHub 上找到此解决方案,在 Swift Recipes 上找到更多详细信息。
您应该使用 myTableViewHeaderFooterView.tintColor
,或将自定义背景视图分配给 myTableViewHeaderFooterView.backgroundView
。
tintColor
不适用于 iOS7。我只能通过分配自定义视图来更改颜色:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
view
background
设置为 Default
颜色而不是 System Background Default
颜色,则覆盖 .tintColor
有效。但不应该使用它,因为它应该是淡色,而不是背景色。
在 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];
确保为您的 UITableViewHeaderFooterView
设置 contentView
的 backgroundColor:
self.contentView.backgroundColor = [UIColor whiteColor];
然后它将起作用。
https://i.stack.imgur.com/DqtIq.png
https://i.stack.imgur.com/IyLTN.png
对于纯色背景色,设置 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!
}
}
但是,请注意可能的副作用。除非表格视图设置为“分组”,否则当向下滚动时,部分标题将在顶部对齐。如果部分标题是透明的,则单元格内容将被看穿,这可能看起来不太好。
在这里,节标题具有透明背景:
https://i.stack.imgur.com/eT1Up.gif
为了防止这种情况,最好将节标题的背景设置为与表格视图或视图控制器的背景相匹配的纯色(或渐变)。
在这里,节标题具有完全不透明的渐变背景:
https://i.stack.imgur.com/DRISs.gif
为了清晰的颜色,我使用
self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];
对我来说似乎很好。
backgroundView = UIView()
然后设置 backgroundColor = .clear
是唯一可行的解决方案。谢谢你。
https://i.stack.imgur.com/mcuFA.png
在 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
一切正常且没有警告
如果您使用 xib
文件创建了 UITableViewHeaderFooterView
的自定义子类,那么您应该覆盖 setBackgroundColor
。保持空白。
-(void)setBackgroundColor:(UIColor *)backgroundColor {
}
这将解决您的问题。
如果您是 customising a section header cell with Storyboard/Nib,请确保“表格部分标题”视图的背景颜色为默认。
如果您将 UITableViewHeaderFooterView
子类化并使用 nib,那么您要做的就是为内容视图创建一个 IBOutlet
,并将其命名为例如。 containerView
。不要与 contentView
混淆,它是该容器视图的父级。
通过该设置,您改为更改 containerView
的背景颜色。
我尝试了外观当包含在链中,它对我有用。
[[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
}
那对我有用。
iOS 12,Swift 5。如果您愿意(或尝试!)使用外观代理,以下解决方案有效:
子类 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
}
}
}
以所需的粒度设置外观代理。
MySectionHeaderView.appearance().forceBackgroundColor = .red
或者
MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red
忘记困难。
使用以下代码添加到您的项目 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
}
}
将此代码放入 UITableViewHeaderFooterView 子类的初始化中:
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
用清晰的颜色设置 BackgroundView 对于可见的标题效果很好。如果滚动表格以在底部显示标题,则此解决方案将失败。
PSMy 表仅包含没有任何单元格的标题。
迅速:
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 14 开始,我们为 UITableViewHeaderFooterView 提供了 UIBackgroundConfiguration。
要更改背景颜色,我正在执行以下操作:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let headerView = view as? LeftMenuSectionHeader {
if var backgroundConfig = headerView.backgroundConfiguration {
backgroundConfig.backgroundColor = UIColor.clear
headerView.backgroundConfiguration = backgroundConfig
}
}
}
view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.