Introdução ao UIBezierPath
introdução básica:
UIBezierPath pode ser usado para criar caminhos vetoriais e gráficos, e vários gráficos podem ser definidos usando esta classe. Usamos uma combinação de linhas retas e arcos para criar formas complexas. Onde cada segmento reto ou curvo termina é onde o próximo começa. Cada coleção de segmentos retos ou curvos conectados é chamada de subcaminho. O caminho completo de um objeto UIBezierPath inclui um ou mais subcaminhos.
UIBezierPath possui dois métodos de implementação:
1. Use CAShapeLayer e UIBezierPath para desenhar alguns gráficos desejados. O código de exemplo é o seguinte:
UIBezierPath * path = [[UIBezierPath alloc]init];
[path moveToPoint:CGPointMake(100, 100)];
[path addLineToPoint:CGPointMake(200, 100)];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.lineWidth = 10;
testLayer.fillColor = [UIColor redColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
testLayer.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer];
2. Reescreva o método drawRect na subclasse de UIView. Antes de executar o método drawRect da visualização, o sistema primeiro cria um contexto gráfico para a camada da visualização e, em seguida, define alguns parâmetros padrão para o estado do desenho. Nem todos precisam da cooperação do CAShapeLayer. O código de exemplo é o seguinte:
- (void)drawRect:(CGRect)rect {
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(100 , 10)];
[path addLineToPoint:CGPointMake(200, 10)];
path.lineWidth = 15;
path.lineCapStyle = kCGLineCapSquare;
[[UIColor yellowColor] setStroke];
[path stroke];
}
O diagrama de efeitos dos dois trechos de código acima é o seguinte
As linhas nas extremidades circulares pretas da figura são desenhadas com CAShapeLayer e UIBezierPath. A linha no final do quadrado amarelo é desenhada substituindo o método drawRect.
Vamos apresentar brevemente as propriedades de UIBezierPath
1. CGPath: Converta a classe UIBezierPath em CGPath.
2.empty: Verifique se o caminho atual desenhou uma linha reta ou uma curva. Mesmo que você chame apenas o método moveToPoint, o caminho atual não é considerado vazio.
3.limites: Este atributo descreve uma área retangular mínima que pode conter completamente todos os pontos do caminho.Esta área contém os pontos de controle da curva de Bézier quadrática e da curva de Bézier cúbica.
4. currentPoint: A posição do caminho atual, que pode ser entendida como o ponto final do caminho.
5.lineWidth: largura do caminho
6.lineCapStyle: estilo do terminal do caminho.
kCGLineCapButt: Sem ponto final
kCGLineCapRound: Ponto final redondo
kCGLineCapSquare: Ponto final quadrado (o estilo é o mesmo que kCGLineCapButt, mas um pouco mais longo que kCGLineCapButt)
7.lineJoinStyle: estilo de canto
kCGLineJoinMiter: canto agudo
kCGLineJoinRound: canto arredondado
kCGLineJoinBevel: canto chanfrado
8.miterLimit: O comprimento máximo da esquadria (válido apenas quando kCGLineJoinMiter é usado), quanto menor o ângulo do canto, maior será o comprimento da esquadria. Para evitar que o comprimento da esquadria seja muito longo, use a propriedade lineLimit limit, se o comprimento da esquadria exceder miterLimit, os cantos serão exibidos como tipo KCALineJoinBevel.
9.planicidade: A precisão de renderização do caminho curvo, o padrão é 0,6. Quanto menor o valor, maior será a precisão e maior será a precisão da renderização, o que produzirá uma curva relativamente mais suave, mas levará mais tempo de cálculo.
10.usesEvenOddFillRule: Se definido como SIM, o caminho será preenchido com a regra par-ímpar, se definido como NÃO, o caminho será preenchido com a regra diferente de zero e o padrão é NÃO.
Para uma explicação específica deste atributo, consulte o seguinte link: https://developer.apple.com/reference/uikit/uibezierpath/1624360-usesevenoddfillrule?language=objc
11. UIRectCorner: Especifique qual canto do retângulo fica arredondado
UIRectCornerTopLeft: canto superior esquerdo
UIRectCornerTopRight: canto superior direito
UIRectCornerBottomLeft: canto inferior esquerdo
UIRectCornerBottomRight: canto inferior direito
UIRectCornerAllCorners: todos os quatro cantos
Introdução à API relacionada ao UIBezierPath
- (instancetype)bezierPath:
Crie um objeto UIBezierPath
-
- (instancetype)bezierPathWithRect:(CGRect)rect:
Este método criará um caminho fechado, o ponto inicial é a origem do parâmetro rect e adicionará linhas retas no sentido horário e, finalmente, formará um retângulo
- (instancetype)bezierPathWithRect:(CGRect)rect:
-
- (instancetype)bezierPathWithOvalInRect:(CGRect)rect:
Parâmetros:
rect->rectangular Frame
desenha uma curva inscrita de acordo com o parâmetro retângulo reto de entrada. Quando o retângulo recebido é um quadrado, a imagem desenhada é um círculo inscrito; quando o retângulo recebido é um retângulo, a imagem desenhada é uma elipse inscrita
- (instancetype)bezierPathWithOvalInRect:(CGRect)rect:
-
- (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius
Parâmetros:
rect->rectangular Frame
cornerRadius->fillet size
Desenha uma curva retangular arredondada de acordo com um Rect Quando o Rect é um quadrado e o Raio é igual à metade do comprimento lateral desenhando um círculo
- (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius
-
- (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii
parâmetros:
rect->rectangular Frame
corners->canto arredondado especificadoRadii-
>o tamanho do canto arredondado
Este método funciona da mesma forma que acima, diferente O local é que vocêpoderáespecificar um determinado canto ou vários cantos como cantos arredondados
- (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii
-
- (instancetype)bezierPathWithArcCenter:(CGPoint)raio central:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle sentido horário:(BOOL)parâmetros no sentido horário: center->dot radius- > radius startAngle-
>
posição
inicial
endAngle- > sentido horário-> seja no sentido horário
até o final , especifique o ponto central e o raio para desenhar um arco ou círculo
- (instancetype)bezierPathWithArcCenter:(CGPoint)raio central:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle sentido horário:(BOOL)parâmetros no sentido horário: center->dot radius- > radius startAngle-
-
(instancetype)bezierPathWithCGPath:(CGPathRef) Parâmetros CGPath :
CGPath->caminho existente
Cria e retorna um novo objeto UIBezierPath baseado em CGPath
-
- (tipo de instância)init
-
- (tipo de instância anulável)initWithCoder:(NSCoder *)aDecoder
-
- (CGPathRef)CGPath
convertido em CGPath:
- (CGPathRef)CGPath
-
- (void)moveToPoint:(CGPoint)point
parâmetro:
point->target position
Define o ponto inicial de UIBezierPath
- (void)moveToPoint:(CGPoint)point
-
- (void)addLineToPoint:(CGPoint)point
parâmetro:
point->target position
Desenhe uma linha:
- (void)addLineToPoint:(CGPoint)point
-
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2
parâmetros:
endPoint->ponto final
controlPoint1->ponto de controle 1
controlPoint2->ponto de controle 2
Criar curva de Bézier cúbica: desenhar com três pontos A curva, geralmente usada em conjunto com moveToPoint:. Na verdade, o ponto final é moveToPoint: configuração, o ponto final é endPoint; a coordenada do ponto de controle 1 é controlPoint1, este parâmetro pode ser ajustado. As coordenadas do ponto de controle 2 são controlPoint2
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2
-
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint
Parâmetros:
endPoint->ponto final
controlPoint->ponto de controle
Criar curva de Bézier quadrática: realizada chamando este método. Geralmente usado em conjunto com moveToPoint:. ponto terminal endPoint, ponto de controle controlPoint, para a curva quadrática de Bézier, há apenas um ponto de controle
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint
-
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)parâmetros no sentido horário: referem-se a criar um arco para adicionar um arco, bezierPathWithArcCenter é para inicializar
um
arc , addArcWithCenter é adicionar um arco, o ponto comum é que os parâmetros são os mesmos
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)parâmetros no sentido horário: referem-se a criar um arco para adicionar um arco, bezierPathWithArcCenter é para inicializar
-
- (void)closePath;
Fecha o caminho, ou seja, conecta uma linha entre o ponto final e o ponto inicial:
- (void)closePath;
-
- (void)removeAllPoints;
Caminho vazio:
- (void)removeAllPoints;
-
(void)appendPath:(UIBezierPath *) parâmetro bezierPath :
bezierPath->caminho anexado
Caminho anexado:
-
- (UIBezierPath *)bezierPathByReversingPath
inverte o caminho, ou seja, o ponto inicial se torna o ponto final e o ponto final se torna o ponto inicial:
- (UIBezierPath *)bezierPathByReversingPath
-
- (void)applyTransform:(CGAffineTransform)transform;
Parâmetros:
transform->transformação afim
O caminho executa a transformação afim, usando a matriz de transformação afim especificada para transformar todos os pontos do caminho
- (void)applyTransform:(CGAffineTransform)transform;
-
- (void)setLineDash:(nullable const CGFloat *)pattern count:(NSInteger)count phase:(CGFloat)phase
parâmetro:
padrão->
contagem de dados lineares tipo C->número de dados na
fase padrão->posição inicial
desenhe uma linha pontilhada
- (void)setLineDash:(nullable const CGFloat *)pattern count:(NSInteger)count phase:(CGFloat)phase
-
- (vazio)preencher
cor de preenchimento
- (vazio)preencher
-
- (void)stroke;
Desenho, a criação do caminho precisa ser desenhada para ser exibida
- (void)stroke;
-
- [[UIColor blackColor] setStroke];
Para definir a cor do traço, você precisa chamar o método do traço após definir:
- [[UIColor blackColor] setStroke];
-
- [[UIColor redColor] setFill];
Defina a cor de preenchimento, você precisa chamar o método de preenchimento após definir
- [[UIColor redColor] setFill];
-
- (void)fillWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha
parâmetros:
blendMode->blending mode
alpha->transparency
Use o modo de mesclagem especificado e o valor de transparência para descrever a área cercada pelo caminho de recebimento (esses métodos não afetam o modo de mesclagem ou alfa do contexto gráfico atual.)
- (void)fillWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha
-
- (void)strokeWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;
Parâmetros:
blendMode->blendmode
alpha->transparency
Use o blendmode especificado e o valor de transparência ao longo do caminho do sink. Desenhe uma linha
- (void)strokeWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;
-
- (void)addClip;
Modifique a área de desenho do contexto gráfico atual para ficar visível e as operações de desenho subsequentes farão com que o conteúdo de renderização ocorra apenas na área preenchida do caminho especificado
- (void)addClip;
exemplo específico
As renderizações e códigos dos gráficos lineares já foram mencionados no início, vejamos alguns exemplos de outros gráficos.
Exemplo 1:
Implementações de arcos, arcos e setores.
Resultados conforme mostrado abaixo:
código mostrado abaixo:
-(void)drawArc{
CGFloat radius = 50.0;
CGFloat centerx = self.view.frame.size.width/2-25;
//code 1
UIBezierPath *path = [UIBezierPath bezierPath];
[path addArcWithCenter:CGPointMake(centerx, 50+64) radius:radius startAngle:0.0 endAngle:M_PI_2 clockwise:YES];
[path stroke];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.lineWidth = 5;
testLayer.fillColor = [UIColor clearColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
testLayer.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer];
//code 2
UIBezierPath *path1 = [UIBezierPath bezierPath];
[path1 moveToPoint:CGPointMake(centerx, 50+64+70)];
[path1 addArcWithCenter:CGPointMake(centerx, 50+64+70) radius:radius startAngle:0 endAngle:M_PI_2 clockwise:YES];
CAShapeLayer * testLayer1 = [CAShapeLayer layer];
[testLayer1 setPath:path1.CGPath];
[testLayer1 setFillColor:[UIColor yellowColor].CGColor];
[testLayer1 setStrokeColor:[UIColor purpleColor].CGColor];
[self.view.layer addSublayer:testLayer1];
//code 3
UIBezierPath *path2 = [UIBezierPath bezierPath];
[path2 addArcWithCenter:CGPointMake(centerx, 50+64+140) radius:radius startAngle:0 endAngle:M_PI_2 clockwise:YES];
[path2 closePath];
CAShapeLayer * testLayer2 = [CAShapeLayer layer];
[testLayer2 setPath:path2.CGPath];
[testLayer2 setFillColor:[UIColor whiteColor].CGColor];
[testLayer2 setStrokeColor:[UIColor blueColor].CGColor];
[self.view.layer addSublayer:testLayer2];
}
Código 1, código 2 e código3 correspondem ao arco, ventilador e arco acima, respectivamente.
Exemplo 2:
Realização de gráficos circulares e de pizza.
Por favor, veja a figura abaixo para o efeito específico:
O código específico é o seguinte:
-(void)drawCircle
{
CGFloat radius = 50.0;
CGFloat centerx = self.view.frame.size.width/2-25;
//code 1
UIBezierPath *path = [UIBezierPath bezierPath];
[path addArcWithCenter:CGPointMake(centerx, 50+64+5) radius:radius startAngle:0.0 endAngle:2*M_PI clockwise:YES];
[path stroke];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.lineWidth = 5;
testLayer.fillColor = [UIColor clearColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
testLayer.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer];
//code 2
UIBezierPath *path1 = [UIBezierPath bezierPath];
[path1 addArcWithCenter:CGPointMake(centerx, 50+64+5+110) radius:radius startAngle:0.0 endAngle:2*M_PI clockwise:YES];
[path1 stroke];
CAShapeLayer * testLayer1 = [CAShapeLayer layer];
testLayer1.path = path1.CGPath;
testLayer1.lineWidth = 2;
testLayer1.fillColor = [UIColor redColor].CGColor;
testLayer1.strokeColor = [UIColor yellowColor].CGColor;
testLayer1.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer1];
//code 3
UIBezierPath* path2 = [[UIBezierPath alloc] init];
[path2 moveToPoint:CGPointMake(centerx, 50+64+5+220)];
[path2 addArcWithCenter:CGPointMake(centerx, 50+64+5+220) radius:radius startAngle:0 endAngle:M_PI_2 clockwise:YES];
[path2 addLineToPoint:CGPointMake(centerx, 50+64+5+220)];
[path2 closePath];
CAShapeLayer * testLayer2 = [CAShapeLayer layer];
testLayer2.path = path2.CGPath;
testLayer2.lineWidth = 2;
testLayer2.fillColor = [UIColor redColor].CGColor;
testLayer2.strokeColor = [UIColor whiteColor].CGColor;
testLayer2.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer2];
UIBezierPath* path3 = [[UIBezierPath alloc] init];
[path3 moveToPoint:CGPointMake(centerx, 50+64+5+220)];
[path3 addArcWithCenter:CGPointMake(centerx, 50+64+5+220) radius:radius startAngle:M_PI_2 endAngle:M_PI clockwise:YES];
[path3 addLineToPoint:CGPointMake(centerx, 50+64+5+220)];
[path3 closePath];
CAShapeLayer * testLayer3 = [CAShapeLayer layer];
testLayer3.path = path3.CGPath;
testLayer3.lineWidth = 2;
testLayer3.fillColor = [UIColor yellowColor].CGColor;
testLayer3.strokeColor = [UIColor whiteColor].CGColor;
testLayer3.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer3];
UIBezierPath* path4 = [[UIBezierPath alloc] init];
[path4 moveToPoint:CGPointMake(centerx, 50+64+5+220)];
[path4 addArcWithCenter:CGPointMake(centerx, 50+64+5+220) radius:radius startAngle:M_PI endAngle:2*M_PI clockwise:YES];
[path4 addLineToPoint:CGPointMake(centerx, 50+64+5+220)];
[path4 closePath];
CAShapeLayer * testLayer4 = [CAShapeLayer layer];
testLayer4.path = path4.CGPath;
testLayer4.lineWidth = 2;
testLayer4.fillColor = [UIColor blueColor].CGColor;
testLayer4.strokeColor = [UIColor whiteColor].CGColor;
testLayer4.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer4];
}
O código 1, o código 2 e o código3 correspondem respectivamente ao círculo vazio, ao círculo sólido e ao diagrama do setor na figura acima.
Exemplo 3:
Implementação de uma elipse.
Por favor, veja a figura abaixo para o efeito específico:
código mostrado abaixo:
-(void)drawEllipse
{
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:(CGRect){80,50+64,150,100}];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.lineWidth = 2;
testLayer.fillColor = [UIColor redColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
[self.view.layer addSublayer:testLayer];
}
Exemplo 4:
Realização de formas irregulares.
Aqui implementei apenas um pentágono irregular e dois retângulos com cantos arredondados. Por favor, veja a imagem para o efeito específico:
código:
-(void)otherGraph
{
//code 1
UIBezierPath * path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(100, 80)];
[path addLineToPoint:CGPointMake(200, 120)];
[path addLineToPoint:CGPointMake(160, 140)];
[path addLineToPoint:CGPointMake(40.0, 140)];
[path addLineToPoint:CGPointMake(10.0, 120)];
[path closePath];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.lineWidth = 2;
testLayer.fillColor = [UIColor redColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
[self.view.layer addSublayer:testLayer];
//code 2
UIBezierPath *path1 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 200, 150, 100) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];
CAShapeLayer * testLayer1 = [CAShapeLayer layer];
testLayer1.path = path1.CGPath;
testLayer1.lineWidth = 2;
testLayer1.fillColor = [UIColor clearColor].CGColor;
testLayer1.strokeColor = [UIColor blackColor].CGColor;
testLayer1.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer1];
}
O código 1 corresponde a um pentágono irregular e o código 2 corresponde a um retângulo com cantos arredondados.
Exemplo 5:
Implementação de cores gradientes. Por favor, veja a imagem para o efeito:
código mostrado abaixo:
-(void)drawColor
{
//code 1
UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:50 startAngle:0.0 endAngle:M_PI_2 clockwise:NO];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.fillColor = [UIColor clearColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
testLayer.lineWidth = 15;
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.view.frame;
gradientLayer.colors = @[(__bridge id)[UIColor greenColor].CGColor,(__bridge id)[UIColor blueColor].CGColor ];
gradientLayer.startPoint = CGPointMake(0,0.5);
gradientLayer.endPoint = CGPointMake(1,0.5);
[self.view.layer addSublayer:gradientLayer];
gradientLayer.mask = testLayer;
//code 2
UIBezierPath * path1 = [UIBezierPath bezierPath];
[path1 moveToPoint:CGPointMake(100, 280)];
[path1 addLineToPoint:CGPointMake(200, 300)];
[path1 addLineToPoint:CGPointMake(250, 350)];
[path1 addLineToPoint:CGPointMake(150, 400)];
[path1 addLineToPoint:CGPointMake(50, 300)];
[path1 closePath];
CAShapeLayer * testLayer1 = [CAShapeLayer layer];
testLayer1.path = path1.CGPath;
testLayer1.lineWidth = 2;
testLayer1.fillColor = [UIColor redColor].CGColor;
testLayer1.strokeColor = [UIColor blackColor].CGColor;
CAGradientLayer *gradientLayer1 = [CAGradientLayer layer];
gradientLayer1.frame = self.view.frame;
gradientLayer1.colors = @[(__bridge id)[UIColor yellowColor].CGColor, (__bridge id)[UIColor purpleColor].CGColor ];
gradientLayer1.startPoint = CGPointMake(0,0.5);
gradientLayer1.endPoint = CGPointMake(1,0.5);
[self.view.layer addSublayer:gradientLayer1];
gradientLayer1.mask = testLayer1;
}
O código 1 corresponde à realização do arco gradiente e o código 2 corresponde à realização do polígono gradiente. A implementação de cores gradientes depende de CAGradientLayer. Alunos que desejam saber mais, pesquisem você mesmo.
Exemplo 6:
Realização de fotos irregulares.
código mostrado abaixo:
-(void)drawImage
{
UIImage * image = [UIImage imageNamed:@"gggggg"];
UIBezierPath *path = [[UIBezierPath alloc] init];
path.lineCapStyle = kCGLineCapRound;
path.lineJoinStyle = kCGLineJoinRound;
[path moveToPoint:CGPointMake(self.view.frame.size.width/2, 100)];
[path addArcWithCenter:CGPointMake(self.view.frame.size.width/2, 200) radius:150 startAngle:0 endAngle:M_PI clockwise:YES];
[path closePath];
CAShapeLayer * testLayer = [[CAShapeLayer alloc] init];
testLayer.frame = self.view.bounds;
testLayer.fillColor = [UIColor blackColor].CGColor;
testLayer.strokeColor = [UIColor redColor].CGColor;
testLayer.contentsScale = [UIScreen mainScreen].scale;
testLayer.path = path.CGPath;
CALayer * contentLayer = [CALayer layer];
contentLayer.frame = self.view.bounds;
contentLayer.contentsGravity = kCAGravityResizeAspectFill;
contentLayer.mask = testLayer;
contentLayer.contents = (__bridge id _Nullable)(image.CGImage);
[self.view.layer addSublayer:contentLayer];
}
Exemplo 7:
Implementação de curvas de Bézier quadráticas e cúbicas:
código mostrado abaixo:
-(void)drawBezierCurve
{
//code 1
UIBezierPath* path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(20, 150)];
[path addQuadCurveToPoint:CGPointMake(150, 160) controlPoint:CGPointMake(270, 100)];
CAShapeLayer * testLayer = [CAShapeLayer layer];
testLayer.path = path.CGPath;
testLayer.lineWidth = 2;
testLayer.fillColor = [UIColor redColor].CGColor;
testLayer.strokeColor = [UIColor blackColor].CGColor;
[self.view.layer addSublayer:testLayer];
//code 2
UIBezierPath* path1 = [UIBezierPath bezierPath];
[path1 moveToPoint:CGPointMake(20, 260)];
[path1 addCurveToPoint:CGPointMake(290, 280) controlPoint1:CGPointMake(50, 20) controlPoint2:CGPointMake(120, 380)];
[path1 stroke];
CAShapeLayer * testLayer1 = [CAShapeLayer layer];
testLayer1.path = path1.CGPath;
testLayer1.lineWidth = 2;
testLayer1.fillColor = [UIColor redColor].CGColor;
testLayer1.strokeColor = [UIColor blackColor].CGColor;
testLayer1.lineCap = kCALineCapRound;
[self.view.layer addSublayer:testLayer1];
}
O código 1 corresponde à realização da curva quadrática de Bézier e o código 2 corresponde à realização da curva cúbica de Bézier.
No GitHub, o endereço é o seguinte:
https://github.com/BigDad3/BezierPath
Reimpressão:
https://www.jianshu.com/p/81d83fd4a059