UIScrollView 底部渐变透明

7
我有一个UIScrollView,需要底部渐变为透明,以避免内容突然截断。 UIScrollView的背景是自定义颜色。到目前为止,我已经实现了以下代码,但是图层显示的是白色而不是自定义颜色。我想要的效果如下图所示,只在底部实现渐变。 This is what I am going for, but only on the bottom 以下是我的代码:
maskLayer = [CAGradientLayer layer];

            CGColorRef firstColor = [UIColor colorWithRed:141 green:211 blue:244 alpha:1.0].CGColor;
            CGColorRef secondColor = [UIColor colorWithRed:141 green:211 blue:244 alpha:0.8].CGColor;
            CGColorRef thirdColor = [UIColor colorWithRed:141 green:211 blue:244 alpha:0.2].CGColor;
            CGColorRef fourthColor = [UIColor colorWithRed:141 green:211 blue:244 alpha:0.0].CGColor;

            maskLayer.colors = [NSArray arrayWithObjects:(__bridge id)firstColor, (__bridge id)secondColor, (__bridge id)thirdColor, (__bridge id)fourthColor, nil];
            maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],
                                                        [NSNumber numberWithFloat:0.2],
                                                        [NSNumber numberWithFloat:0.8],
                                                        [NSNumber numberWithFloat:1.0], nil];
            maskLayer.frame = CGRectMake(0, 285, self.loginScrollView.frame.size.width, 40);
            maskLayer.anchorPoint = CGPointZero;
            [self.loginScrollView.layer addSublayer:maskLayer];

由于某种原因,该图层显示为白色,并且仅有scrollView宽度的一半。
4个回答

20

我采用的方法是子类化UIScrollView,并在layoutSubviews方法中创建遮罩层。

以下是我的代码,它将UIScrollView的顶部和底部从背景颜色渐变到透明:

#import "FadingScrollView.h"
#import <QuartzCore/QuartzCore.h>

static float const fadePercentage = 0.2;

@implementation FadingScrollView

// ...

- (void)layoutSubviews
{
    [super layoutSubviews];

    NSObject * transparent = (NSObject *) [[UIColor colorWithWhite:0 alpha:0] CGColor];
    NSObject * opaque = (NSObject *) [[UIColor colorWithWhite:0 alpha:1] CGColor];

    CALayer * maskLayer = [CALayer layer];
    maskLayer.frame = self.bounds;

    CAGradientLayer * gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(self.bounds.origin.x, 0,
                                     self.bounds.size.width, self.bounds.size.height);

    gradientLayer.colors = [NSArray arrayWithObjects: transparent, opaque,
                            opaque, transparent, nil];

    // Set percentage of scrollview that fades at top & bottom
    gradientLayer.locations = [NSArray arrayWithObjects:
                               [NSNumber numberWithFloat:0],
                               [NSNumber numberWithFloat:fadePercentage],
                               [NSNumber numberWithFloat:1.0 - fadePercentage],
                               [NSNumber numberWithFloat:1], nil];

    [maskLayer addSublayer:gradientLayer];
    self.layer.mask = maskLayer;
}

@end

如果你只想淡化底部,请更改这一行:

// Fade bottom of scrollview only
gradientLayer.locations = [NSArray arrayWithObjects:
                           [NSNumber numberWithFloat:0],
                           [NSNumber numberWithFloat:0],
                           [NSNumber numberWithFloat:1.0 - fadePercentage],
                           [NSNumber numberWithFloat:1], nil];
当我自己实现时,我发现这个SO问题Github上的这个代码片段对我很有帮助。 编辑:我已经将这个代码上传到Github上,请查看这里

我认为现在应该使用UIViewAnimationOptionCurveEaseIn。 - matrejek

12

我真的很喜欢Steph Sharp的实现方式,我将其转换为Swift并想与大家分享,以便其他人使用。

let fadePercentage = CGFloat(0.2)

override func layoutSubviews() {

    super.layoutSubviews()

    var transparent = UIColor.clearColor().CGColor
    var opaque = UIColor.blackColor().CGColor

    var maskLayer = CALayer()
    maskLayer.frame = self.bounds

    var gradientLayer = CAGradientLayer()
    gradientLayer.frame = CGRectMake(self.bounds.origin.x, 0, self.bounds.size.width, self.bounds.size.height)
    gradientLayer.colors = [transparent, opaque, opaque, transparent]
    gradientLayer.locations = [0, fadePercentage, 1 - fadePercentage, 1]

    maskLayer.addSublayer(gradientLayer)
    self.layer.mask = maskLayer

}

8

这是 Steph 回答的 Swift 3 版本:

let fadePercentage: Double = 0.2

override func layoutSubviews() {

    super.layoutSubviews()

    let transparent = UIColor.clear.cgColor
    let opaque = UIColor.black.cgColor

    let maskLayer = CALayer()
    maskLayer.frame = self.bounds

    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = CGRect(x: self.bounds.origin.x, y: 0, width: self.bounds.size.width, height: self.bounds.size.height)
    gradientLayer.colors = [transparent, opaque, opaque, transparent]
    gradientLayer.locations = [0, NSNumber(floatLiteral: fadePercentage), NSNumber(floatLiteral: 1 - fadePercentage), 1]

    maskLayer.addSublayer(gradientLayer)
    self.layer.mask = maskLayer

}

谢谢你为我节省了一点时间。 - GoldenJoe

0

还有一个this的答案,它不包括任何子类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接