Tenho uma visão simples (lado esquerdo da imagem) e preciso criar algum tipo de sobreposição (lado direito da imagem) para essa visão. Esta sobreposição deve ter alguma opacidade, de forma que a vista abaixo dela ainda seja parcialmente visível. O mais importante é que essa sobreposição deve ter um orifício circular no meio dela para que não sobreponha o centro da vista (veja a imagem abaixo).
Posso facilmente criar um círculo como este:
int radius = 20; //whatever
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0,radius,radius) cornerRadius:radius].CGPath;
circle.position = CGPointMake(CGRectGetMidX(view.frame)-radius,
CGRectGetMidY(view.frame)-radius);
circle.fillColor = [UIColor clearColor].CGColor;
E uma sobreposição retangular "completa" como esta:
CAShapeLayer *shadow = [CAShapeLayer layer];
shadow.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) cornerRadius:0].CGPath;
shadow.position = CGPointMake(0, 0);
shadow.fillColor = [UIColor grayColor].CGColor;
shadow.lineWidth = 0;
shadow.opacity = 0.5;
[view.layer addSublayer:shadow];
Mas não tenho ideia de como posso combinar essas duas camadas para que criem o efeito que desejo. Qualquer um? Eu tentei realmente de tudo ... Muito obrigado pela ajuda!
ios
objective-c
calayer
quartz-core
animal_chin
fonte
fonte
moveToPoint
, adicione o retângulo arredondado. Verifique os documentos para os métodos oferecidos porUIBezierPath
.Respostas:
Consegui resolver isso com a sugestão de Jon Steinmetz. Se alguém se importar, aqui está a solução final:
Swift 3.x:
Swift 4.2 e 5:
fonte
Para criar esse efeito, achei mais fácil criar uma visão inteira sobrepondo a tela e, em seguida, subtrair partes da tela usando camadas e UIBezierPaths. Para uma implementação Swift:
Testei o código acima e aqui está o resultado:
Eu adicionei uma biblioteca ao CocoaPods que abstrai muito do código acima e permite que você crie facilmente sobreposições com orifícios retangulares / circulares, permitindo que o usuário interaja com as visualizações atrás da sobreposição. Usei-o para criar este tutorial para um de nossos aplicativos:
A biblioteca é chamada TAOverlayView e é um código-fonte aberto no Apache 2.0. Espero que seja útil!
fonte
Solução aceita compatível com Swift 3.0
fonte
Adotei uma abordagem semelhante à animal_chin, mas sou mais visual, então configurei a maior parte dela no Interface Builder usando outlets e layout automático.
Aqui está minha solução em Swift
fonte
Compatível com Code Swift 2.0
Começando com a resposta @animal_inch, eu codifico uma pequena classe de utilitário, espero que goste:
Então, em qualquer parte do seu código:
fonte