2013-12-04 3 views
28

Прямо сейчас у меня есть слой Gradient Gradient, где я установил цвета, но я хотел бы установить цветную точку (вместо верхнего центра, вверху слева) и снизу до (вместо нижнего центра на внизу справа), чтобы немного изменить ситуацию. Мысли? Ниже приведен код, который у меня есть до сих пор ... Я включил базовую анимацию, потому что я анимация между цветами.Как изменить цветные точки CAGradientLayer?

- (id)init { 
    self = [super init]; 

    UIView *gradientView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.w, self.h)]; 
    [self addSubview:gradientView]; 
    [self sendSubviewToBack:gradientView]; 

    topColor = [UIColor colorWithRed:0.012 green:0.012 blue:0.012 alpha:1]; 
    bottomColor = [UIColor colorWithRed:1.000 green:0.765 blue:0.235 alpha:1]; 

    gradient = [CAGradientLayer layer]; 
    gradient.frame = gradientView.frame; 
    gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor, (id)bottomColor.CGColor, nil]; 
    gradient.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:0.7], nil]; 
    [gradientView.layer addSublayer:gradient]; 

    [self performSelector:@selector(animateColors) withObject:self afterDelay:2.0]; 
    currentColorCount = 1; 
    return self; 
} 

Справа (То, что я получил) слева (то, что я хотел)

On the right (What I've got) on the left (what I'd like)

+2

вы не имели в виду: С левой стороны (То, что я получил) справа (то, что я хотел), так как начальный старт равен 0.5, 0.0, а значение по умолчанию - 0.5, 1.0 – ericosg

ответ

91

В startPoint и endPoint свойства CAGradientLayer определены в «блоке система координат". В блоке система координат:

  • (0,0) соответствует наималейшим координатам за пределы прямоугольника слоя, который на прошивке является его левым верхним углом, если слой не был преобразован;
  • (1,1) соответствует наибольшим координатам прямоугольника границ слоя, который на iOS является его нижним правом углом, если слой не был преобразован.

Таким образом организовать ваш градиент так, как вы хотите, должно быть это просто:

gradient.startPoint = CGPointZero; 
gradient.endPoint = CGPointMake(1, 1); 
+3

Отлично работает! –

+4

Почему заголовочный файл 'CAGradientLayer' говорит, что' [0,0] - нижний левый угол слоя, [1,1] - верхний правый угол?? –

+2

Я предполагаю, что эти комментарии написаны на основе макета macOS/AppKit, где по умолчанию начало координат находится в левом нижнем углу. –