No meu aplicativo - existem quatro botões com o seguinte nome:
Superior - esquerda
Acima dos botões, há uma visualização de imagem (ou uma UIView).
Agora, suponha que um usuário toque no botão superior esquerdo. A imagem / vista acima deve ser arredondada nesse canto específico.
Estou com alguma dificuldade em aplicar cantos arredondados ao UIView.
No momento, estou usando o código a seguir para aplicar os cantos arredondados a cada exibição:
O código acima aplica a redondeza em cada um dos cantos da vista fornecida. Em vez disso, eu só queria aplicar a redondeza nos cantos selecionados, como - superior / superior + esquerdo / inferior + direito etc.
É possível? Quão?
Eu usei a resposta em Como criar um UILabel de canto arredondado no iPhone? e o código de Como é feita uma visualização retangular arredondada com transparência no iphone? para fazer esse código.
Então percebi que havia respondido à pergunta errada (dei um UILabel arredondado em vez de UIImage), então usei esse código para alterá-lo:
Faça um projeto do iPhone com o modelo View. No controlador de exibição, adicione isto:
MyViewé apenas uma UIImageViewsubclasse:
Eu nunca tinha usado contextos gráficos antes, mas consegui manobrar esse código. Está faltando o código para dois dos cantos. Se você ler o código, poderá ver como eu implementei isso (excluindo algumas das CGContextAddArcchamadas e excluindo alguns dos valores de raio no código. O código para todos os cantos está lá, use-o como ponto de partida e exclua o peças que criam cantos de que você não precisa.Tenha em mente que também pode fazer retângulos com 2 ou 3 cantos arredondados.
Não esqueça que você precisará obter a estrutura do QuartzCore para que isso funcione.
— rei nevan
Não funciona como esperado com visualizações cujo tamanho pode mudar. Exemplo: um UILabel. Definir o caminho da máscara e, em seguida, alterar o tamanho, definindo o texto como ele manterá a máscara antiga. Será necessário subclassificar e sobrecarregar o drawRect.
A partir do iOS 3.2, é possível usar a funcionalidade UIBezierPaths para criar um retângulo arredondado pronto para uso (onde apenas os cantos especificados são arredondados). Você pode usar isso como o caminho de a CAShapeLayere usá-lo como uma máscara para a camada da sua exibição:
E é isso: não é necessário definir formas manualmente no Core Graphics, nem criar imagens mascaradas no Photoshop. A camada nem precisa ser invalidada. Aplicar o canto arredondado ou alterar para um novo canto é tão simples quanto definir um novo UIBezierPathe usá-lo CGPathcomo o caminho da camada de máscara. O cornersparâmetro do bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:método é uma máscara de bits e, portanto, vários cantos podem ser arredondados ORing juntos.
Se você deseja adicionar uma sombra a isso, é necessário um pouco mais de trabalho.
Como " imageView.layer.mask = maskLayer" aplica uma máscara, uma sombra normalmente não aparece fora dela. O truque é usar uma vista transparente e, em seguida, adicionar duas subcamadas CALayerà camada da vista: shadowLayere roundedLayer. Ambos precisam fazer uso do UIBezierPath. A imagem é adicionada como o conteúdo de roundedLayer.
Boa, isso me ajudou muito na selectedBackgroundViews agrupados célula UITableView :-)
— Luke47
De qualquer forma, para adicionar uma sombra projetada a essa exibição depois de virar as esquinas? Tentou o seguinte sem sucesso. `self.layer.masksToBounds = NO; self.layer.shadowColor = [UIColor blackColor] .CGColor; self.layer.shadowRadius = 3; self.layer.shadowOffset = CGSizeMake (-3, 3); self.layer.shadowOpacity = 0.8; self.layer.shouldRasterize = YES; `
@ ChrisWagner: veja minha edição, com relação à aplicação de uma sombra na exibição arredondada.
@StuDev excellent! Eu tinha escolhido uma subview para a view shadow, mas isso é muito melhor! Não pensou em adicionar sub-camadas como esta. Obrigado!
Por que minha imagem fica branca, quando eu rolar o UITableView e a célula é recriada - ela funciona! Por quê?
— Fernando Redondo
Eu usei esse código em muitos lugares no meu código e funciona 100% corretamente. Você pode alterar qualquer corder alterando uma propriedade "byRoundingCorners: UIRectCornerBottomLeft"
Ao usar esta solução em UITableView-subviews (por exemplo, UITableViewCells ou UITableViewHeaderFooterViews), isso resulta em uma suavidade ruim ao rolar . Outra abordagem para esse uso é essa solução com melhor desempenho (ela adiciona um cornerRadius a todos os cantos). Para 'mostrar' apenas cantos arredondados específicos (como os cantos superior e inferior direito), adicionei uma subvisão com um valor negativo frame.origin.xe atribuai o cornerRadius à sua camada. Se alguém encontrou uma solução melhor, estou interessado.
— AnneBlue
Extensão CALayer com sintaxe Swift 3+
O exemplo de stuarts para arredondar cantos específicos funciona muito bem. Se você deseja arredondar vários cantos, como o canto superior esquerdo e o direito, é assim que se faz
Obrigado por compartilhar. Aqui, gostaria de compartilhar a solução no swift 2.0 para obter mais referências sobre esse problema. (para conformar o protocolo do UIRectCorner)
— Jog Dan
existe uma resposta mais fácil e rápida que pode funcionar dependendo de suas necessidades e também funciona com sombras. você pode definir maskToBounds na superlayer como true e deslocar as camadas filho para que 2 dos seus cantos fiquem fora dos limites da superlayer, cortando efetivamente os cantos arredondados em 2 lados.
é claro que isso só funciona quando você deseja ter apenas 2 cantos arredondados no mesmo lado e o conteúdo da camada fica igual quando você corta alguns pixels de um lado. funciona muito bem com gráficos de barras arredondados apenas no lado superior.
Veja esta pergunta relacionada . Você terá que desenhar seu próprio retângulo em um CGPathcom alguns cantos arredondados, adicionar o CGPathao seu CGContexte depois prendê-lo usando CGContextClip.
Você também pode desenhar o retângulo arredondado com valores alfa em uma imagem e usá-la para criar uma nova camada que você define como maskpropriedade da sua camada ( consulte a documentação da Apple ).
Meia década atrasada, mas acho que a maneira atual como as pessoas fazem isso não é 100% correta. Muitas pessoas tiveram o problema de que o uso do método UIBezierPath + CAShapeLayer interfere no layout automático, especialmente quando ele é definido no Storyboard. Não há respostas sobre isso, então decidi adicionar as minhas.
Existe uma maneira muito fácil de contornar isso: Desenhe os cantos arredondados na drawRect(rect: CGRect)função.
Por exemplo, se eu quisesse os cantos arredondados no topo de uma UIView, subclasseia o UIView e usaria essa subclasse sempre que apropriado.
Essa é a melhor maneira de conquistar o problema e não leva tempo para se adaptar.
Este não é o caminho certo para resolver o problema. Você deve substituir apenas drawRect(_:)se estiver fazendo um desenho personalizado em sua visualização (por exemplo, com gráficos principais), caso contrário, mesmo uma implementação vazia poderá afetar o desempenho. Criar uma nova camada de máscara sempre é desnecessário. Tudo o que você realmente precisa fazer é atualizar a pathpropriedade da camada de máscara quando os limites da exibição mudarem e o local para fazer isso estiver dentro de uma substituição do layoutSubviews()método.
Arredondar apenas alguns cantos não funcionará bem com redimensionamento automático ou layout automático.
Portanto, outra opção é usar regular cornerRadiuse ocultar os cantos que você não deseja em outra visualização ou fora dos limites da superview, certificando-se de que ela esteja configurada para cortar seu conteúdo.
Para adicionar à resposta e à adição , criei um simples, reutilizável UIViewno Swift. Dependendo do seu caso de uso, convém fazer modificações (evite criar objetos em todos os layouts etc.), mas eu queria mantê-lo o mais simples possível. A extensão permite aplicar isso a outras visualizações (ex. UIImageView) Com mais facilidade se você não gosta de subclassificar.
Veja como você o aplicaria a UIViewController:
Para finalizar a resposta de Stuart, você pode usar o método de canto arredondado da seguinte maneira:
Para aplicar o canto arredondado, basta:
Eu sugiro definir a máscara de uma camada. A própria máscara deve ser um CAShapeLayerobjeto com um caminho dedicado. Você pode usar a próxima extensão UIView (Swift 4.2):