Подтвердить что ты не робот

Используйте путь Безье как обтравочную маску

Мне интересно, можно ли скопировать представление на путь Безье. Я имею в виду, что я хочу видеть представление только в регионе в пределах закрытого пути Безье. Причина этого в том, что у меня контур неправильной формы, и я хочу постепенно заполнять фигуру сплошным цветом сверху вниз. Если бы я мог сделать это так, чтобы определенный вид был видимым только в пути, я мог бы просто создать UIView цвета, который я хочу, а затем, по мере возможности, изменить координату y своего кадра, эффективно заполняя форму. Если у кого-то есть какие-то лучшие идеи о том, как реализовать это, что было бы весьма полезно. Для записи заполнение фигуры будет соответствовать значению y пальца пользователя, поэтому оно не может быть непрерывной анимацией. Спасибо.

Обновление (очень долгое время):

Я попробовал ваш ответ, Роб, и он отлично работает, за исключением одного. Мое намерение состояло в том, чтобы переместить вид в масках, пока маска остается в одном месте на экране. Это так, что я могу создать впечатление, что маска "заполнена" взглядом. Проблема в том, что с кодом, который я написал на основе вашего ответа, когда я перемещаю вид, маска перемещается вместе с ним. Я понимаю, что этого можно ожидать, потому что все, что я сделал, это добавить его в качестве маски представления, поэтому вполне разумно, что он переместится, если вещь, к которой она привязана, движется. Я попытался добавить маску в качестве подслоя супервизора, чтобы он оставался на месте, но это было очень странно. Вот мой код:

self.test = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
self.test.backgroundColor = [UIColor greenColor];

[self.view addSubview:self.test];

UIBezierPath *myClippingPath = [UIBezierPath bezierPath];
[myClippingPath moveToPoint:CGPointMake(100, 100)];
[myClippingPath addCurveToPoint:CGPointMake(200, 200) controlPoint1:CGPointMake(self.screenWidth, 0) controlPoint2:CGPointMake(self.screenWidth, 50)];
[myClippingPath closePath];


CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = myClippingPath.CGPath;

self.test.layer.mask = mask;

CGRect firstFrame = self.test.frame;
firstFrame.origin.x += 100;
[UIView animateWithDuration:3 animations:^{
    self.test.frame = firstFrame;
}];

Спасибо за помощь уже.

4b9b3361

Ответ 1

Вы можете сделать это легко, установив маску слоя вида на CAShapeLayer.

UIBezierPath *myClippingPath = ...

CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = myClippingPath.CGPath;

myView.layer.mask = mask;

Вам нужно будет добавить фреймворк QuartzCore к вашей цели, если вы еще этого не сделали.


В Swift...

let yourCarefullyDrawnPath = UIBezierPath( .. blah blah
let maskForYourPath = CAShapeLayer()
maskForYourPath.path = carefullyRoundedBox.CGPath
layer.mask = maskForYourPath

Ответ 2

Просто пример решения Rob, там UIWebView сидит как subview UIView, называемый smoothView. smoothView использует bezierPathWithRoundedRect, чтобы сделать округлый серый фон (уведомление справа). это прекрасно работает.

но если у smoothView есть только обычные клип-subviews, вы получите это.

enter image description here

если вы делаете то, что говорит Роб, вы получаете закругленные углы в smoothView и во всех subviews...

enter image description here

Отличный материал.