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:
E uma sobreposição retangular "completa" como esta:
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!
— animal_chin
Você pode criar um bezier que contém o retângulo e o círculo e então a regra de enrolamento usada durante o desenho criará um buraco (eu não tentei).
não sei como fazer :)
Crie com o retângulo e, em seguida moveToPoint, adicione o retângulo arredondado. Verifique os documentos para os métodos oferecidos por UIBezierPath.
Veja se esta pergunta e resposta semelhantes ajudam: [Corte o furo transparente em UIView] [1] [1]: stackoverflow.com/questions/9711248/…
— dichen
Confira minha solução aqui: stackoverflow.com/questions/14141081/… Espero que isso ajude alguém
— James Laurenstin
Consegui resolver isso com a sugestão de Jon Steinmetz. Se alguém se importar, aqui está a solução final:
Swift 4.2 e 5:
Para maior flexibilidade, torne sua subclasse de visualização "IBDesignable". É muito fácil! Para começar, conecte o código acima à resposta que dei a esta pergunta: stackoverflow.com/questions/14141081/…
Como um desenvolvedor iOS novato, passei algumas horas tentando descobrir por que esse código produz resultados estranhos. Finalmente descobri que as subcamadas adicionadas devem ser removidas se a máscara de sobreposição for recalculada em algum ponto. Isso é possível por meio da propriedade view.layer.sublayers. Muito obrigado pela resposta!
— Serzhas
Por que estou obtendo exatamente o oposto disso. Camada de cor clara com forma semi-transparente preta ??
— Chanchal Warde
Como posso adicionar um texto transparente a um círculo usando este modo, é possível? não acho como
Quase 6 anos, ainda ajuda, mas lembre-se de que o buraco oco não 'perfura' a camada que o contém. Digamos, se sobrepor o furo sobre um botão. O botão não está acessível, o que é necessário se você estiver tentando fazer um 'tutorial guiado' como eu. A biblioteca fornecida por @Nick Yap fará o trabalho para você, substituindo o ponto de função (ponto interno: CGPoint, com evento: UIEvent?) -> Bool {} de UIView. Verifique sua biblioteca para mais detalhes. Mas, o que você espera é apenas 'visibilidade do que está por trás da máscara', esta é uma resposta válida.
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!
— Nick Yap
Além disso, não poste respostas duplicadas . Em vez disso, considere outras ações que podem ajudar futuros usuários a encontrar a resposta de que precisam, conforme descrito na postagem vinculada. Quando essas respostas são pouco mais do que um link e recomendação para usar suas coisas, elas parecem muito spam.
— Mogsdad,
@Mogsdad Eu não queria que parecesse spam, apenas gastei uma boa quantidade de tempo nesta biblioteca e achei que seria útil para pessoas que tentam fazer coisas semelhantes. Mas obrigado pelo feedback, atualizarei minhas respostas para usar exemplos de código
Boa atualização, Nick. Estou ao seu lado - eu mesmo publiquei bibliotecas e utilitários, e entendo que pode parecer redundante colocar respostas completas aqui quando minha documentação já cobre isso ... no entanto, a ideia é manter as respostas autocontidas que possível. E lá são pessoas postando nada além de spam, por isso eu prefiro não ser consideradas em conjunto com eles. Presumo que você pense da mesma maneira, e é por isso que indiquei isso a você. Felicidades!
Usei o pod que você criou, obrigado por isso. Mas minhas visualizações sob a sobreposição param de interagir. O que há de errado com isso? Eu tenho um Scrollview com imageview dentro dele.
@AmmarMujeeb A sobreposição bloqueia a interação, exceto através dos "orifícios" que você cria. Minha intenção com o pod eram sobreposições que destacassem partes da tela e só permitissem a interação com os elementos destacados.
Solução aceita compatível com Swift 3.0
@Fattie: seu link está morto
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
— skwashua
Eu amo essa solução porque você pode mover o circlePath em tempo de design e tempo de execução com muita facilidade.
isso não funcionou para mim, embora eu tenha modificado para usar um retângulo normal em vez de oval, mas a imagem da máscara final está saindo errada :(
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: