Эффект градиента с использованием CAGradientLayer создает горизонтальные линии .. (эффект не более плавный)

Я хочу дать своему видеопроигрывателю эффект градиента вверху и внизу представления. Я использую для этого следующий способ, но он не дает более плавного эффекта, т.е. создает две белые горизонтальные линии в обеих конечных точках рисунка.


введите здесь описание изображения


Фактически, я создал подкласс UIView, который использует CAGradientLayer в качестве своего уровня. Я сделал это, чтобы слой следовал ориентации супервизора, и он отлично работает. Для справки см. этот ответ

Вот подкласс UIView под названием GradientView


GradientView.h

@interface GradientView : UIView

@property (nonatomic, strong, readonly) CAGradientLayer *layer;

@end

GradientView.m

@implementation GradientView

@dynamic layer;

+ (Class)layerClass {
    return [CAGradientLayer class];
}

@end

Экземпляр:

IBOutlet GradientView *viewControls;

Используйте это:

-(void)applyGradientEffect
{
    UIColor *endColor     = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.90];
    UIColor *centerColor  = [UIColor clearColor];

    viewControls.layer.colors = [NSArray arrayWithObjects:
                                 (id)[endColor CGColor],
                                 (id)[centerColor CGColor],
                                 (id)[centerColor CGColor],
                                 (id)[endColor CGColor],
                                 nil];

    viewControls.layer.startPoint = CGPointMake(0.5, 1.0); 
    viewControls.layer.endPoint = CGPointMake(0.5, 0.0);  
}

Я также пробовал использовать свойство locations для CAGradientLayer вместо свойств startPoint и endPoint, что-то вроде следующего фрагмента кода. Тем не менее, это недостаточно плавно.

viewControls.layer.locations = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.0f],
    [NSNumber numberWithFloat:0.2],
    nil];

Эффект градиента будет более плавным, только если я использую только 2 цвета снизу вверх, как в следующем коде. (Он создаст эффект градиента только по нижнему краю, мне нужен такой эффект как сверху, так и снизу)

-(void)applyGradientEffect
{    
    UIColor *endColor     = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.90];
    UIColor *centerColor  = [UIColor clearColor];

    viewControls.layer.colors = [NSArray arrayWithObjects:
                                 (id)[endColor CGColor],
                                 (id)[centerColor CGColor],
                                 nil];

    viewControls.layer.startPoint = CGPointMake(0.5, 1.0); 
    viewControls.layer.endPoint = CGPointMake(0.5, 0.0);
}

В чем может быть причина? В этом случае это поведение по умолчанию? Я что-то не так делаю с рисованием?


person NSPratik    schedule 31.05.2016    source источник
comment
Я не специалист по градиентам, но пробовали ли вы сделать финальную часть градиента длиннее? Прямо сейчас ваше выцветание полностью однородно. Либо начните с более низкой начальной альфы (например, 0,5) и посмотрите, поможет ли это? Если это так, то вы знаете, что вам нужен более длинный коэффициент длины «y», чтобы у последней части затухания было больше времени, чтобы исчезнуть, чтобы очиститься (менее резкий в конце).   -  person thephatp    schedule 31.05.2016
comment
Спасибо @thephatp, я не понимаю, что вы предлагаете ..   -  person NSPratik    schedule 31.05.2016
comment
Допустим, вы применяете градиент по высоте = 100 (скажем, пиксели, чтобы их было легче описать), и скажем, ваш градиент переходит от альфа = 1,0 к альфа 0,0. Это создаст градиент, при котором каждый пиксель будет иметь уменьшенное значение альфа 0,01. Однако, если вы перешли от альфа = 0,5 до 0,0 для тех же 100 пикселей, то каждый пиксель будет иметь уменьшенное значение альфа 0,005, создавая более плавный эффект. Итак, попробуйте установить начальный градиент с альфа 0,5 вместо 0,9 и посмотрите, исчезнет ли это эффект горизонтальной линии (или станет менее заметным). Если это так, то вы знаете, что вам нужен более плавный градиент.   -  person thephatp    schedule 31.05.2016
comment
Позвольте мне попробовать .. Я помню, что я пробовал с 12-15 пунктами, а не только с 4 пунктами, упомянутыми в коде. Тем не менее, пользы не было   -  person NSPratik    schedule 31.05.2016