Objective c: странное поведение при маскировании слоя другим слоем и смене фрейма

#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;), круг меняет местоположение, но он по-прежнему разорван и не центрирован, поэтому у меня это не работает.