2012-10-05 52 views
7

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

+0

你可以发布一个截图吗?难以想象这一点。 –

+0

你可以设置tableview.backgroundColor = [UIColor clearColor]; – kamleshwar

回答

8

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

您可以通过设置实现代码如下为没有背景

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

,也是细胞

cell.backgroundColor = [UIColor clearColor] 

,如果你也想的部分是透明的,你可以用这个方法实现:

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

使自定义视图(例如创建一个与透明的图像视图t .png

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


澄清后编辑

给予外观细胞前节标题下面会停止:

使一类是UITableView的与此伊娃一个子类:

@interface CustomTableView : UITableView 
{ 
     CAGradientLayer* maskLayer; 
} 

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

ANYWAY:如果您使用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]; 

基本思路是面具,你创建你的tableview的顶部罩形状这与您的部分标题大小相同。它会出现在它后面的细胞“消失”。这有点棘手,但它会起作用。

+2

你正在理解我想要达到的目标,但不是我遇到的问题。问题在于我的部分是透明的,所以您可以看到单元格在部分后面传递。这创建了看起来很糟糕的单元格和部分的混合。虽然我很欣赏答案,谢谢 – Bobbake4

+0

啊我现在明白了。有趣的问题。我对你如何做到这一点有一个想法,但这有点不好意思。我会在上面编辑我的答案。 – sixstatesaway

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]; 
    } 
} 

这段代码工作完全正常的的iOS 7

编辑 我知道这是一个有点晚,但与此相伴,你必须添加2行,确保背景颜色(和背景视图的背景颜色?)的uitableview也很清晰。

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

完美!它为我工作。非常感谢你 –