带有clearColor背景的UITableView部分?

Bob*_*ke4 8 iphone cocoa-touch objective-c ios

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

rob*_*ahl 10

获取透明节标题而不创建自己的标题视图的简单方法.

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在iOS 7中运行得非常好.

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

tableView.backgroundColor = [UIColor clearColor];
tableView.backgroundView.backgroundColor = [UIColor clearColor];
Run Code Online (Sandbox Code Playgroud)


six*_*way 8

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

您可以通过将tableview设置为没有背景来实现此目的

tableview.backgroundColor = [UIColor clearColor];
tableView.opaque = NO;
tableView.backgroundView = nil;
Run Code Online (Sandbox Code Playgroud)

还有细胞

cell.backgroundColor = [UIColor clearColor]
Run Code Online (Sandbox Code Playgroud)

如果您还希望该部分是透明的,则可以使用此方法:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
Run Code Online (Sandbox Code Playgroud)

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

我希望我能正确理解你的问题.


澄清后编辑

在出现在节标题下面之前给出单元格停止的外观:

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

@interface CustomTableView : UITableView
{
        CAGradientLayer* maskLayer;
}
Run Code Online (Sandbox Code Playgroud)

显然这将创建一个渐变,但如果你想要你可以调整它或使用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];
}
Run Code Online (Sandbox Code Playgroud)

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

   CustomTableView *_tableView; //ivar

   _tableView = [[CustomTableView alloc] initWithFrame:YOUR_FRAME];
Run Code Online (Sandbox Code Playgroud)

基本思想是一个遮罩,你在tableview的顶部创建一个与截面标题大小相同的遮罩形状.似乎细胞"消失"在它后面.这有点棘手,但它会奏效.

  • 你理解我想要实现的目标,但不是我遇到的问题.问题是我的部分是透明的,所以你可以看到细胞在部分后面传递.这创造了细胞和部分的混合,看起来很糟糕.我很感激答案,谢谢 (2认同)