Existe uma maneira de definir cornerRadius
apenas o canto superior esquerdo e superior direito de um UIView
?
Eu tentei o seguinte, mas ele acabou não vendo mais a vista.
UIView *view = [[UIView alloc] initWithFrame:frame];
CALayer *layer = [CALayer layer];
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:frame byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(3.0, 3.0)];
layer.shadowPath = shadowPath.CGPath;
view.layer.mask = layer;
view.bounds
, nãoframe
, (2) a camada deve ser aCAShapeLayer
, nãoCALayer
; (3) defina a camadapath
, nãoshadowPath
.Respostas:
Preste atenção ao fato de que, se você tiver restrições de layout associadas, atualize-o da seguinte forma na subclasse UIView:
Se você não fizer isso, não aparecerá.
E para os cantos arredondados, use a extensão:
Caso adicional do controlador de vista : Se você não pode ou não deseja subclassificar uma vista, ainda pode arredondá-la. Faça isso a partir do seu controlador de exibição, substituindo a
viewWillLayoutSubviews()
função, da seguinte maneira:fonte
Não sei por que sua solução não funcionou, mas o código a seguir está funcionando para mim. Crie uma máscara de bezier e aplique-a à sua visualização. No meu código abaixo, eu estava arredondando os cantos inferiores do
_backgroundView
com um raio de 3 pixels.self
é um costumeUITableViewCell
:Versão Swift com algumas melhorias:
Versão Swift 3.0:
Extensão rápida aqui
fonte
viewDidLoad
método, movi- lo paraviewDidAppear
e funcionou.simulator
tamanho do storyboard.ex: if the simulator size is 6s it works fine for 6s, but not of others.
como posso superar isso.path.CGPath
deveria serpath.cgPath
viewWillAppear
. Isso também funciona.Aqui está uma versão Swift da resposta @JohnnyRockex
Nota
Se você estiver usando o Layout automático , precisará subclassificar
UIView
e chamarroundCorners
a visualizaçãolayoutSubviews
para obter o efeito ideal.fonte
.TopRight
e.BottomRight
não parece funcionar para mim.view.roundCorners([.TopLeft , .BottomLeft], radius: 10)
.layoutIfNeeded()
esse método.E finalmente… existe o CACornerMask no iOS11! Com
CACornerMask
isso pode ser feito muito fácil:fonte
Exemplo de código Swift aqui: https://stackoverflow.com/a/35621736/308315
Não diretamente. Voce terá que:
CAShapeLayer
path
comoCGPathRef
baseado,view.bounds
mas com apenas dois cantos arredondados (provavelmente usando+[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:]
)view.layer.mask
para ser oCAShapeLayer
fonte
Aqui está um método curto implementado assim:
fonte
No Swift 4.1 e no Xcode 9.4.1
No iOS 11, essa única linha é suficiente:
Veja o código completo:
Mas para versões inferiores
O código completo é.
Se você estiver usando o AutoResizing no storyboard, escreva este código em viewDidLayoutSubviews () .
fonte
iOS 11, Swift 4
E você pode tentar este código:
E você pode usar isso na célula de exibição de tabela.
fonte
Esta seria a resposta mais simples:
fonte
Experimente este código,
fonte
Emma:
.TopRight
e.BottomRight
não está trabalhando para você, talvez porque a chamada paraview.roundCorners
é feita ANTES da finalview bounds
ser calculada. Observe que o valorBezier Path
deriva dos limites da vista no momento em que é chamada. Por exemplo, se o layout automático restringir a vista, os cantos arredondados no lado direito podem estar fora da vista. Tente ligarviewDidLayoutSubviews
, onde o limite da visualização é final.fonte
Swift 4 Swift 5 maneira fácil em 1 linha
Uso:
Função:
No Objetivo-C
Uso:
[self.verticalSeparatorView roundCorners:UIRectCornerTopLeft radius:10.0];
Função usada em uma categoria (apenas um canto):
fonte
Minha solução para arredondar cantos específicos do UIView e UITextFiels no swift é usar
e
de UIView ou UITextFields reais.
Exemplo:
E usando
e
, Posso especificar o canto superior direito e inferior direito do UITextField a ser arredondado.
Você pode ver o resultado aqui:
fonte
Swift 4
fonte
Uma maneira de fazer isso programaticamente seria criar uma
UIView
parte superior da parteUIView
que possui cantos arredondados. Ou você pode esconder o topo por baixo de alguma coisa.fonte
fonte
A maneira mais fácil seria fazer uma máscara com uma camada de canto arredondado.
E não se esqueça de:
fonte
Todas as respostas já dadas são realmente boas e válidas (especialmente a idéia de Yunus de usar a
mask
propriedade).No entanto, eu precisava de algo um pouco mais complexo, porque minha camada costumava mudar de tamanho, o que significa que eu precisava chamar essa lógica de mascaramento todas as vezes e isso era um pouco chato.
Usei
extensions
propriedades rápidas e computadas para criar umacornerRadii
propriedade real que cuida da atualização automática da máscara quando a camada é colocada.Isto foi conseguido usando a grande biblioteca de Aspectos Peter Steinberg para swizzling.
O código completo está aqui:
Eu escrevi um post simples explicando isso.
fonte
Se você procura uma solução exclusiva para o construtor de interfaces, existe uma para o iOS 11 e superior . Veja minha resposta aqui: https://stackoverflow.com/a/58626264
fonte
É assim que você pode definir um raio de canto para cada canto de um botão com o Xamarin em C # :
fonte
Uma extensão adorável para reutilizar a solução Yunus Nedim Mehel
Swift 2.3
Uso
fonte
Depois da alteração do código @apinho No Swift 4.3 funcionando bem
Para usar esta função para você visualizar
fonte
Outra versão da resposta de Stephane .
fonte
No Swift 4.2, crie-o
@IBDesignable
assim:fonte
Extensão simples
Uso:
fonte