Вопрос по uiscrollview, calayer – Исчезает дно UIScrollView до прозрачного

5

У меня есть UIScrollView, и мне нужно, чтобы основание стало прозрачным, чтобы оно не отрезало содержимое. Фон UIScrollView - это пользовательский цвет. Это то, что у меня пока есть, но слой отображается белым вместо обычного цвета. Вот к чему я иду, но только снизу.

Вот что у меня так далеко:

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   ответа
16

Подход, который я использовал, заключался в подклассеUIScrollViewи создайте слой маски вlayoutSubviews метод.

Вот'мой код, который исчезает сверху и снизуUIScrollView от цвета фона до прозрачного:

#import "FadingScrollView.h"
#import 

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

Когда я сам реализовывал это, я нашелэтот ТАК вопрос полезно, иэтот смысл на github.

РЕДАКТИРОВАТЬ: ЯВыложили этот код на github, смотритеВот.

Я думаю, что теперь это должен быть UIViewAnimationOptionCurveEaseIn, используемый там. karmel
4

Здесь идет быстрый 3 версии Steph 'ответ:

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

Есть такжеэтот ответ, который не включает подклассы.

8

Очень нравится Стеф ШарпРеализация, я преобразовал его в быстрый и думал, чтобуду делиться на случай, если кому-то еще это понадобится.

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

}
версия macOSВот Alex

Похожие вопросы