#ios #objective-c #swift #xcode #calayer
#iOS #objective-c #swift #xcode #calayer
Вопрос:
UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:CGPointZero radius:80 startAngle:0 endAngle:(2 * M_PI) clockwise:YES];
CAShapeLayer * layer = [CAShapeLayer new];
layer.strokeColor = [UIColor redColor].CGColor;
layer.fillColor = [UIColor clearColor].CGColor;
layer.lineWidth = 10;
layer.strokeEnd = 1;
layer.position = self.view.center;
layer.lineCap = kCALineCapRound;
[layer setPath : path.CGPath];
[self.view.layer addSublayer : layer];
CAGradientLayer * gradientLayer = [CAGradientLayer layer];
gradientLayer.startPoint = CGPointMake(0.0,0.5);
gradientLayer.endPoint = CGPointMake(1.0,0.5);
gradientLayer.frame = self.view.frame;
NSArray *colors = @[(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor,(id)[UIColor yellowColor].CGColor];
gradientLayer.colors = colors;
[gradientLayer setMask : layer];
[self.view.layer addSublayer : gradientLayer];
Что я делаю:
Добавление CAShapeLayer для просмотра.слой с контуром для рисования круга.
Добавление CAGradientLayer (3 цвета) для просмотра.слой и установка маски на CAShapeLayer.
Результат: с маской и без нее
Проблема :
Если я изменю рамку градиента, чтобы она была поверх круга (потому что я хочу видеть все цвета в круге), это также переместит круг. в частности, изменение значений x и y градиента
Поэтому вместо
gradientLayer.frame = self.view.frame;
Я меняю только x и y (ширина и высота не вызывают этой проблемы, насколько я проверил)
gradientLayer.frame = CGRectMake(100,100, self.view.frame.size.width, self.view.frame.size.height);
И это результат
Кто-нибудь может объяснить, почему это происходит и каковы возможные решения?
Чего я пытаюсь достичь, так это
А затем маскируем его с помощью CAShapeLayer, но затем возникает эта проблема
Заранее спасибо
Комментарии:
1. Обычно `
gradientLayer.frame = self.view.frame;
будетgradientLayer.frame = self.view.bounds;, where
вид» — это то место, где был добавлен слой. Помните, координаты фрейма являются локальными для его супервизора / слоя. Что касается вашей проблемы, я думаю, вы хотите изменить фрейм шейп-слоя, а не фрейм градиентного слоя.2. @Larme Я знаю, но поскольку вид имеет размер во весь экран, это не имеет значения. и не влияет на проблему
Ответ №1:
измените положение слоя формы, потому что градиентный слой является полноэкранным, а shapelayer устанавливает центральное положение, и после того, как вы измените рамку градиентного слоя, слой формы также изменится в том же положении.
layer.position = CGPointMake(30, 250);
Комментарии:
1. на последнем рисунке (чего я пытаюсь добиться) рамкой градиентного слоя является CGRectMake (100,100, 300, 300); так что это не на весь экран, после всего приведенного выше кода, если я попытаюсь обновить положение обоих слоев ( layer.position = self.view.center; gradientLayer.position = self.view.center;), круг меняет местоположение, но он по-прежнему разорван и не центрирован, поэтому у меня это не работает.