【问题标题】:UITableView section with clearColor background?具有 clearColor 背景的 UITableView 部分?
【发布时间】:2012-10-05 17:49:57
【问题描述】:

我有一个带有径向渐变背景的 ViewController。在里面我有一个带有单元格和部分的 UITableView。现在我想在滚动时显示表格视图后面的渐变。问题是当部分锁定在顶部时,您可以看到部分后面的单元格。我会设置部分背景颜色,但如果我这样做,它与径向渐变背景不匹配。是否有在保持clearColor背景的同时将单元格夹在部分下方?

【问题讨论】:

  • 你能发一个屏幕截图吗?很难想象这一点。
  • 可以设置tableview.backgroundColor = [UIColor clearColor];

标签: iphone objective-c ios cocoa-touch


【解决方案1】:

无需创建自己的标题视图即可获得透明节标题的简单方法。

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

这段代码在 iOS 7 中运行良好。

编辑 我知道这有点晚了,但除此之外,您还必须添加 2 行以确保 uitableview 的背景颜色(以及背景视图的背景颜色?)也清晰。

tableView.backgroundColor = [UIColor clearColor];
tableView.backgroundView.backgroundColor = [UIColor clearColor];

【讨论】:

    【解决方案2】:

    如果我理解的话,您需要一个完全清晰的 tableview 和 tableview 单元格,这样您就可以看到视图控制器的背景。

    您可以通过将 tableview 设置为没有背景来实现这一点

    tableview.backgroundColor = [UIColor clearColor];
    tableView.opaque = NO;
    tableView.backgroundView = nil;
    

    还有细胞

    cell.backgroundColor = [UIColor clearColor]
    

    如果你还希望部分是透明的,你可以使用这个方法:

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    

    制作自定义视图(例如创建一个带有透明 .png 作为背景的图像视图)

    希望我能正确理解您的问题。


    澄清后编辑

    显示单元格在进入节标题下方之前停止:

    用这个 ivar 创建一个作为 uitableview 子类的类:

    @interface CustomTableView : UITableView
    {
            CAGradientLayer* maskLayer;
    }
    

    显然这将创建一个渐变,但如果您愿意,您可以调整它或使用CALayer,而不是以编程方式创建蒙版,而是创建一个具有正确宽度/高度的节标题的 .png。

    无论如何:如果您使用CAGradientLayer

    - (id)initWithCoder:(NSCoder *)coder
    {
        self = [super initWithCoder:coder];
        if (self) 
        {
            [self setupGradients]; //call your method
        }
        return self;
    }
    
    - (void)setupGradients
    {
        [self addObserver:self forKeyPath:@"contentOffset" options:0 context:nil];
    
        */ ***** if you choose to use CALayer instead of CAGradient ****** */
        //maskLayer = [[CALayer layer] retain]; 
        //maskLayer.contents = (id) [UIImage imageNamed:@"maskLayer.png"].CGImage; 
        //maskLayer.backgroundColor = [UIColor clearColor].CGColor; 
        */ ***** if you choose to use CALayer instead of CAGradient ****** */
    
        maskLayer = [[CAGradientLayer layer] retain];
    
        CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor;
        CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;
    
        maskLayer.colors = [NSArray arrayWithObjects:(id)outerColor, 
                            (id)innerColor, (id)innerColor, (id)outerColor, nil];
        maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], 
                               [NSNumber numberWithFloat:0.0], 
                               [NSNumber numberWithFloat:0.9], 
                               [NSNumber numberWithFloat:1.0], nil]; //this creates a gradient     effect. Tweak these numbers for a hard line. 
    
        maskLayer.bounds = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
        maskLayer.anchorPoint = CGPointZero;
    
        self.layer.mask = maskLayer;
        }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {        
        [CATransaction begin];
        [CATransaction setDisableActions:YES];
        maskLayer.position = CGPointMake(0, self.contentOffset.y);
        [CATransaction commit];
    }
    

    然后在您的视图控制器中:

       CustomTableView *_tableView; //ivar
    
       _tableView = [[CustomTableView alloc] initWithFrame:YOUR_FRAME];
    

    基本思想是遮罩,您在表格视图的顶部创建一个遮罩形状,该形状与您的节标题大小相同。看起来它后面的单元格“消失”了。这有点棘手,但它会起作用。

    【讨论】:

    • 您了解我想要实现的目标,但不了解我遇到的问题。问题是我的部分是透明的,因此当单元格从该部分后面经过时,您可以看到它们。这会创建看起来很糟糕的单元格和部分的混合。不过我很感谢你的回答,谢谢
    • 啊我现在明白了。有趣的问题。我有一个想法,你可以如何做到这一点,但它有点hacky。我将在上面编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多