20

我正在尝试为此制作一个自定义标题视图UITableView,我希望它是透明的。

我的代码...

界面...

typedef void(^ActionBlock)();

@interface MyViewHeaderView : UITableViewHeaderFooterView

@property (nonatomic, strong) UIImageView *flagImageView;
@property (nonatomic, strong) UILabel *leagueNameLabel;

@property (nonatomic, copy) ActionBlock tapAction;

@end

执行...

#import "MyViewHeaderView.h"

@interface MyViewHeaderView ()

@end

@implementation MyViewHeaderView

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithReuseIdentifier:reuseIdentifier];
    if (self) {
        // Add customisation here...

        // I have tried everything here...
        self.tintColor = [UIColor colorWithWhite:0.961 alpha:1.0];
        self.alpha = 0.5;

        // self.contentView.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.5];
        // self.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.5];
        // can't remember what else.
        // none of it makes it transparent. It sets the colour against
        // a white background. i.e. 50% transparent but with a white opaque background.
        // so I can't see the content of the table scrolling behind it.

        self.flagImageView = [[UIImageView alloc] init];
        self.flagImageView.image = [UIImage imageNamed:@"placeholder_flag"];
        [self.flagImageView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.contentView addSubview:self.flagImageView];

        self.leagueNameLabel = [[UILabel alloc] init];
        [self.leagueNameLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.contentView addSubview:self.leagueNameLabel];

        UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped)];
        tapGestureRecognizer.numberOfTapsRequired = 1;
        tapGestureRecognizer.numberOfTouchesRequired = 1;
        [self.contentView addGestureRecognizer:tapGestureRecognizer];

        [self setupConstraints];
    }
    return self;
}

- (void)setupConstraints
{
    // adding constraints...
}

- (void)viewTapped
{
    self.tapAction();
}

@end

在我的UITableViewDelegate我正在加载标题...

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    MyViewHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"HeaderView"];

    League *league = self.leagues[(NSUInteger) section];

    headerView.leagueNameLabel.text = league.name;
    headerView.tapAction = ^(){
        [self leagueTapped:league];
    };

    return headerView;
}

这工作正常,标题显示正确。只是没有透明度。

我想要一个像标准视图一样的标题视图,您可以在其中看到表格视图内容在其后面滚动。

请你让我知道如何做到这一点。

4

13 回答 13

20

创建一个具有透明背景颜色的视图并将其分配给 UITableViewHeaderFooterView 的 backgroundView 属性。

class HeaderView: UITableViewHeaderFooterView{

    override
    init(reuseIdentifier: String?){
        super.init(reuseIdentifier: reuseIdentifier)
        self.backgroundView = UIView()
        self.backgroundView!.backgroundColor = UIColor.clearColor()
    }

    required
    init(coder: NSCoder){
        super.init(coder: coder)
    }

    override
    init(frame: CGRect){
        super.init(frame: frame)
    }
}
于 2014-12-02T01:28:49.047 回答
17

请原谅我无法使用stackoverflow....

这是我使用这两种 UITableviewDelegate 方法设法实现它的方法:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
  if ([view isMemberOfClass:[UITableViewHeaderFooterView class]]) {
    ((UITableViewHeaderFooterView *)view).backgroundView.backgroundColor = [UIColor clearColor];
  }
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
  UITableViewHeaderFooterView *feedHeaderView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"HeaderIdentifier"];

  //Other customizations

  return feedHeaderView;
}

希望有帮助,让我永远弄清楚。似乎 backgroundView 不是在 init 中创建的,所以颜色不能在那里被覆盖。

于 2014-01-03T04:59:01.053 回答
12

更新:显然,我之前建议的答案在 iOS 13+ 中不再有效,这就是我在控制台中得到的 -

在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改为将具有所需背景颜色的自定义 UIView 设置为 backgroundView 属性。

此外,在这里查看一些评论,设置tintColor.clear成功。

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.tintColor = .clear
}

玩得开心编码:)

于 2020-01-11T08:38:59.233 回答
9

在 iOS 7 上,如果您只想在默认部分标题视图上强制使用透明背景,您可以执行以下操作:

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    [[(UITableViewHeaderFooterView*)view backgroundView] setBackgroundColor:[UIColor clearColor]];
}
于 2014-04-08T07:38:56.480 回答
7

有一种方法,您仍然可以使用您的自定义 UITableViewHeaderFooterView 并获得清晰的背景,并且始终可以在没有任何“hack”的情况下工作,而不仅仅是在滚动表格以刷新标题时。

只需添加一个具有清晰背景的自定义背景视图 :) 就这么简单(在 iOS 7.1 上测试)

我的是这个

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithReuseIdentifier:reuseIdentifier];
    if (self) {
        NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"MessagesChatGroupSection"
                                                         owner:self
                                                       options:nil];
        UIView *nibView = [objects firstObject];
        self.frame = nibView.bounds;
        self.contentView.frame = nibView.bounds;
        [self.contentView addSubview:nibView];
        self.backgroundView = [[UIView alloc] initWithFrame:nibView.bounds];
        self.backgroundView.backgroundColor = [UIColor clearColor];
    }

    return self;
}
于 2014-04-14T08:50:33.883 回答
6

最简单的方法是:

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.contentView.backgroundColor = [UIColor clearColor];
        self.backgroundView = [UIView new]; // removes system background view
    }
    return self;
}
于 2014-10-29T18:16:49.493 回答
5

好的,来自 Twitter 上的@schukin。

我改为MyHeaderView子类UIView并设置...

self.backgroundColor = [UIColor colorWithWhite:0.9 alpha:0.8];

然后在代表...

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    MyViewHeaderView *headerView = [[MyHeaderView alloc] initWithFrame:<a frame>];

    League *league = self.leagues[(NSUInteger) section];

    headerView.leagueNameLabel.text = league.name;
    headerView.tapAction = ^(){
        [self leagueTapped:league];
    };

    return headerView;
}

现在这完全符合我的要求。

它似乎UITableViewHeaderFooterView不能做我正在寻找的东西。

谢谢大家。

于 2013-10-29T10:59:29.373 回答
1
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    static NSString *cellIdentifier = @"HeaderCell";

    UITableViewHeaderFooterView *cell = [tableView dequeueReusableHeaderFooterViewWithIdentifier:cellIdentifier];

    if (nil == cell)
    {
        cell = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:cellIdentifier];
        cell.backgroundView = [[UIImageView alloc] init]; //<--- why not?
    }
    return cell;
}
于 2014-02-18T14:08:59.523 回答
0

也许它有帮助...

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
    UIView *customTitleView = [[ [UIView alloc] initWithFrame:CGRectMake(10, 0, 300, 32)] autorelease];
    UILabel *titleLabel = [ [UILabel alloc] initWithFrame:CGRectMake(19, 0, 300, 32)];
    titleLabel.textColor = [UIColor darkGrayColor];
    titleLabel.shadowColor = [UIColor whiteColor];
    titleLabel.backgroundColor = [UIColor clearColor];
    [titleLabel setFont:[UIFont fontWithName: @"Helvetica-Bold" size: 17.0]];

    switch (section)
    {
        case 0:
            titleLabel.text = @"Title for section...";

            break;

        default:
            break;
    }

    [customTitleView addSubview:titleLabel];
    [titleLabel release];
    return customTitleView;

}

对于页脚(使用其他框架和字体大小)...添加相同的代码

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
于 2013-10-29T10:44:33.177 回答
0

其他人提供的解决方案已被弃用。这是我从其他答案中得到的信息。

“在 UITableViewHeaderFooterView 上设置背景颜色已被弃用。请改用 contentView.backgroundColor。”

我的解决方案是以下。希望它可以帮助某人。:-)

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
   UILabel *label = [[UILabel alloc] init];

   label.text = sectionNames[section];
   label.textAlignment = NSTextAlignmentCenter;
   label.textColor = [UIColor blackColor];
   label.backgroundColor = [UIColor clearColor];

   // Creates a thin border around the section header 
   label.layer.borderColor = [UIColor blackColor].CGColor;
   label.layer.borderWidth = 1;
   label.layer.cornerRadius = 16;

   return label; }
于 2014-05-27T10:08:15.580 回答
0

如果您只是将页脚视图用于部分之间的空间但不希望它拥抱底部,这是一个更简单的解决方案,它也不会与已弃用的页脚视图混淆,因此您不会收到这些警告。

只是隐藏它。

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier(CellID.Footer.rawValue)
    footerView?.hidden = true
    return footerView
}
于 2016-07-21T07:30:37.690 回答
0

最简单的解决方案是只设置背景颜色cell.backgroundColorcell.contentView.backgroundColor

斯威夫特 2.*: self.backgroundView?.backgroundColor = UIColor.clearColor() self.contentView.backgroundColor = UIColor.clearColor()

注意:不要忘记 textLabels 的背景颜色!

cell.textLabel?.backgroundColor = UIColor.clearColor()

于 2016-03-11T16:17:33.233 回答
-2

检查Apple开发人员文档后,如其描述

@interface UITableViewHeaderFooterView : UIView

UITableViewHeaderFooterView 类实现了一个可重用的视图,可以放置在表格部分的顶部或底部。您使用页眉和页脚来显示该部分的附加信息。在大多数情况下,您可以按原样使用此类而无需子类化。如果您有自定义内容要显示,请为您的内容创建子视图并将它们添加到 contentView 属性中的视图。您还可以为 backgroundView 属性分配一个可选的背景视图。

我试过这个方法,它非常适合我

self.tintColor = [UIColor whiteColor];
UIView *backView = [[UIView alloc] initWithFrame:self.bounds];
backView.backgroundColor = [UIColor whiteColor];
self.backgroundView = backView;
于 2017-04-11T05:33:54.437 回答