Eu quero um costume UIView
...: eu só queria uma visualização em branco em branco com cantos arredondados e uma sombra clara (sem efeito de iluminação). Eu posso fazer cada um um por um, mas os habituais clipToBounds
/ maskToBounds
conflitos ocorrem.
iphone
ios
cocoa-touch
uiview
rounded-corners
Aditya Vaidyam
fonte
fonte
Respostas:
O seguinte snippet de código adiciona uma borda, raio da borda e sombra projetada a
v
, aUIView
:Você pode ajustar as configurações para atender às suas necessidades.
Além disso, adicione a estrutura QuartzCore ao seu projeto e:
Veja minha outra resposta sobre
masksToBounds
.Nota
Isso pode não funcionar em todos os casos. Se você achar que esse método interfere com outras operações de desenho que você está executando, consulte esta resposta .
fonte
Rápido
Explorando as opções
Problema 1: a sombra é cortada
E se houver subcamadas ou subvisões (como uma imagem) cujo conteúdo queremos recortar nos limites de nossa visão?
Podemos conseguir isso com
(Como alternativa,
blueView.clipsToBounds = true
fornece o mesmo resultado .)Mas oh não! A sombra também foi cortada porque está fora dos limites! O que fazer? O que fazer?
Solução
Use vistas separadas para a sombra e a borda. A vista base é transparente e tem a sombra. A vista de borda recorta qualquer outro subcontente que possui em suas bordas.
Isso fornece o seguinte resultado:
Problema 2: Baixo desempenho
Adicionar cantos e sombras arredondados pode ser um sucesso. Você pode melhorar o desempenho usando um caminho predefinido para a sombra e também especificando que ela seja rasterizada. O código a seguir pode ser adicionado ao exemplo acima.
Veja este post para mais detalhes. Veja aqui e aqui também.
Esta resposta foi testada com Swift 4 e Xcode 9.
fonte
baseView.backgroundColor = UIColor.clear
remove a sombra. Somente se você definir uma cor de fundo, você a verá.Uma maneira de fazer isso é colocar a vista com cantos arredondados em uma vista com a sombra projetada.
Em seguida, você pode adicionar o shadowView onde quiser.
fonte
Confira o projeto de exemplo no GitHub para garantir que você use o componente corretamente.
Solução simples do Swift 5 sem subvisões ou subclasses adicionais:
Observe que você deve configurar sua exibição com raio de canto e outras propriedades antes de ligar
addShadow
.Depois disso, basta chamar
viewDidLoad
assim:Resultado final:
Super fácil e simples!
fonte
layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath
. Não posso explicar por que, porém, alguém tem uma explicação para isso?Isso funcionou para mim. O truque era mover a cor do plano de fundo da vista principal para a camada.
fonte
UIView extension
aqui - stackoverflow.com/a/43295741/1313939 obrigado pela inspiração!Resolvi o problema usando o seguinte truque ao atribuir o caminho da sombra para a exibição do contêiner:
Observe que o caminho dado à sombra é um retângulo arredondado com o mesmo raio de canto do plano de fundo que a célula contém:
fonte
Se você está lutando por causa do arredondado
corners
vs.subviews
vs.masksToBounds
, tente usar minha função:chame na sua opinião. se sua vista possui cantos arredondados, não importa seu tamanho, sua forma - uma bela sombra será desenhada.
Apenas mantenha o valor de retorno da função para poder consultá-la quando desejar remover a tabela (ou, por exemplo, usar
insertSubview:aboveView:
)fonte
shadow.userInteractionEnabled = NO; // Modify this if needed
linha? Portanto, este é o caso quando necessário.userInteractionEnabled
é uma propriedade básica e popular você deve já estar familiarizado com :-)Usando o Swift 4 e o Xcode 9 , este é um exemplo prático de arredondar um
ImageView
com uma sombra projetada e uma borda.Se você deseja que a imagem seja circular: (e mostrada sem borda)
fonte
Eu criei um ajudante no UIView
você pode chamar assim
Aqui está a implementação
fonte
Depois de um dia inteiro pesquisando a vista do canto redondo com sombra, fico feliz em postar minha classe de uiview personalizada aqui, e espero terminar esta pergunta:
RoundCornerShadowView.h
RoundCornerShadowView.m
portanto, NÃO é necessário adicionar subvisão na vista ou abaixo na visualização de destino, basta adicionar uma camada na visualização atual e fazer 3 etapas para concluí-la!
observe atentamente os comentários no código; é útil entender o componente!
fonte
Algo swifty testado no swift 4
Produz
Se você ativá-lo no Inspetor desta forma:
Ele adicionará o atributo de tempo de execução definido pelo usuário, resultando em:
(Eu adicionei anteriormente o
cornerRadius = 8
):)
fonte
Você precisa usar
shadowView
eroundView
shadowView
roundView
shadowView
um layout interno, e sua sombra precisa brilhar. Ajuste o botãoinsets
para queshadowView
fique completamente invisível atrásroundView
roundView
O código
Ou você pode fazer abaixo sem especificar
clipToBounds/maskToBounds
fonte
Solução Swift 3 e IBInspectable:
Inspirada na solução da Ade
Primeiro, crie uma extensão UIView:
Em seguida, basta selecionar o UIView no construtor de interface, definindo a sombra LIGADA e o raio do canto , como abaixo:
O resultado!
fonte
Aqui está a solução para o problema de conflito do masksToBounds, funciona para mim.
Depois de definir o corderRadius / borderColor / shadow e assim por diante, defina masksToBounds como NO:
fonte
Sombra + borda + raio do canto
fonte
Aqui está a minha versão no Swift 3 para um UIView
fonte
Swift 4: Criar subclasse do UIView
Usando ..
fonte
Bem, se você não deseja alterar suas pontas e visualizar a hierarquia como sugerido por David C., esse método fará isso por você. Para adicionar cantos arredondados e sombra ao seu UIImageView, use este método, por exemplo:
(!) Por motivos de desempenho, acho que não é uma boa ideia usar esse código em algo como UITableView, pois esse código altera a hierarquia de exibição. Então, sugiro alterar sua ponta e adicionar uma exibição de contêiner para efeito de sombra e usar o código Davic C.
fonte
Tópico antigo ainda atual ...
Eu editei o método de Daniel Gindi para tornar possível usá-lo também com botões etc. Se alguém precisar de cantos arredondados ou quiser combinar cantos arredondados e uma borda, ele deverá ser definido na camada da vista que é passada para esse método. Também configurei a rasterização para acelerar um pouco.
fonte
O seguinte funcionou melhor para mim (esse código está na extensão UIView, portanto, denota um UIView ao qual devemos adicionar uma sombra e um canto redondo)
A principal diferença entre esse e outros exemplos de código é que isso adiciona a visualização de sombra como uma visão secundária (contra a adição da visualização atual como subvisão da visualização de sombra), eliminando assim a necessidade de modificar a hierarquia de visualização existente de qualquer maneira.
fonte
A resposta de daniel.gindi acima fez o truque para mim! (+1 daniel) No entanto, tive que fazer pequenos ajustes - alterar o tamanho do shadowFrame para que seja o mesmo do tamanho do quadro da visualização e permitir a interação do usuário. Aqui está o código atualizado:
Gostaria de acrescentar que, no meu caso, estava tentando adicionar isso a um controlador de exibição de terceiros, ou seja, não tinha controle direto sobre o código. Então, aqui está como eu usei a função acima:
fonte
Eu faço algumas alterações no código de daniel.gindi
É tudo o que você precisa para fazer funcionar.
fonte
Você precisa usar dois
UIViews
para conseguir isso. UmUIView
funcionará como sombra e outro funcionará para bordas arredondadas.Aqui está um trecho de código a
Class Method
com a ajuda de aprotocol
:No código acima,
btnCompose_click:
ele se tornará um@required
método delegado que será acionado no clique do botão.E aqui eu adicionei um botão ao meu
UIViewController
assim:O resultado será semelhante a este:
fonte
Eu tentei muitas soluções neste post e acabei com a solução abaixo. Esta é uma solução completa , a menos que você precise soltar sombras em uma exibição de cores nítidas .
fonte
Aqui está a solução que funcionará com certeza!
Eu criei a extensão UIView com as bordas necessárias para aplicar a sombra como abaixo
Por fim, você pode chamar a função de sombra como abaixo para qualquer subclasse do UIView, também pode especificar a borda para aplicar a sombra, experimentar variações diferentes conforme a necessidade de alterar os parâmetros da chamada de método abaixo.
Imagem de resultado
fonte
A resposta fornecida por Evan Mulawski funcionará perfeitamente. O problema é que você precisa definir a cor de plano de fundo para a exibição clearColor e a propriedade masksToBounds como NO.
Você pode definir a cor que desejar para a vista, definir como
Espero que isto ajude..
fonte
É assim que você faz, com cantos arredondados e sombras arredondadas sem se preocupar com caminhos.
A exibição com conteúdo, no meu caso, um UIImageView, tem um raio de canto e, portanto, tem que mascarar até os limites.
Criamos outra visualização de tamanho igual para as sombras, configuramos maskToBounds como NO e adicionamos a visualização de conteúdo à visualização do contêiner (por exemplo, shadowContainer).
fonte
Eu escrevo esse método de categoria UIView para resolver esse problema, usa visualizações separadas para a sombra e o raio do canto.
fonte
Swift 4 Solução para fazer UICollectionViewCell rodada e adicionando sombras , sem quaisquer extensões e complicações :)
Nota: Para visualizações simples, por exemplo, botões. Veja a resposta do @ suragch neste post. https://stackoverflow.com/a/34984063/7698092 . Testado com sucesso para botões
Caso alguém ainda esteja lutando para virar as esquinas e adicionar sombras ao mesmo tempo. Embora esta solução funcione com o UICollectionViewCell, ela pode ser generalizada para qualquer visualização.
Essa técnica funcionou para mim sem fazer nenhuma extensão e todas as coisas complicadas. Estou trabalhando com o storyBoard.
Técnica
Você deve adicionar um UIView (digamos "containerView") dentro do seu UICollectionViewCell no storyBoard e adicionar todas as visualizações necessárias (botões, imagens, etc.) dentro deste containerView. Veja a captura de tela.
Conecte a tomada para o containerView. Adicione as seguintes linhas de código na função delegada CellforItemAtIndexPath.
Resultado
Veja o Screenshot do simulador
fonte
fonte