UITableView 顶部和底部具有透明渐变

2024-02-26

我搜索过这个论坛、谷歌和其他论坛,但没有找到我的特定问题的答案。

基本上,我有一个UIView其中包含UITableView。我跟着这个tutorial http://www.cocoanetics.com/2011/08/adding-fading-gradients-to-uitableview/并且取得了部分成功。问题是梯度。我后面有一个背景图片UITableView。因此,当单元格接近渐变时,我希望显示背景,而不是白色。

我也发现了这个post https://stackoverflow.com/questions/8378074/calayer-compositingfilter-ios-5-and-coreimage#comment10446509_8379795这是我找到教程的地方,但我不想用我自己对马特的问题劫持该帖子。

任何朝着正确方向的帮助都会很棒!

EDIT1:我知道我可以使用另一张带有背景图像和中间切口的图像,但我正在寻找一种避免使用 PNG 的解决方案(如果可能的话)。

EDIT2:这是我现在得到的图像:

EDIT3:

这是我的代码:

Header:

@interface MyView : UIViewController  {
    CAGradientLayer *_maskLayer;
    UITableView *_tableView;
}

@property (nonatomic, retain) CAGradientLayer *maskLayer;
@property (nonatomic, retain) IBOutlet UITableView *tableView;

执行:

@implementation HighScoresView_iPhone

@synthesize tableView = _tableView;
@synthesize maskLayer = _maskLayer;

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    if (![self maskLayer]) {
        [self setMaskLayer:[CAGradientLayer layer]];
        CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;
        CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor;

        [[self maskLayer] setColors:[NSArray arrayWithObjects:
                                     (id)outerColor, 
                                     (id)innerColor, 
                                     (id)innerColor, 
                                     (id)outerColor, 
                                     nil
                                     ]
         ];
        [[self maskLayer] setLocations:[NSArray arrayWithObjects:
                                       [NSNumber numberWithFloat:0.0], 
                                       [NSNumber numberWithFloat:0.2], 
                                       [NSNumber numberWithFloat:0.8], 
                                       [NSNumber numberWithFloat:1.0], 
                                       nil
                                       ]
        ];
        [[self maskLayer] setBounds:CGRectMake(0, 0, [[self scoreTableView] frame].size.width, [[self scoreTableView] frame].size.height)];
        [[self maskLayer] setAnchorPoint:CGPointZero];
        [[[self scoreTableView] layer] addSublayer:[self maskLayer]];
    }
}

您可以使用CALayer mask财产。但是您无法在表视图自己的图层上设置蒙版,因为该蒙版将随表的行滚动。相反,将您的表视图放入一个新的超级视图(类UIView)您为此创建的。叫它tableMaskView.

新的超级视图应该有它的backgroundColor属性设置为UIColor.clearColor和它的opaque属性设置为NO。然后你可以像这样设置它的掩码:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.tableMaskView.bounds;
gradient.colors = [NSArray arrayWithObjects:
    (__bridge id)UIColor.clearColor.CGColor,
    UIColor.whiteColor.CGColor,
    UIColor.whiteColor.CGColor,
    UIColor.clearColor.CGColor,
    nil];
gradient.locations = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0],
    [NSNumber numberWithFloat:1.0/16],
    [NSNumber numberWithFloat:15.0/16],
    [NSNumber numberWithFloat:1],
    nil];
self.tableMaskView.layer.mask = gradient;

使用图层蒙版并不是最有效的方法,但它是最容易编程的方法。测试一下是否够快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UITableView 顶部和底部具有透明渐变 的相关文章

随机推荐