Usar Storyboard para mascarar UIView e dar cantos arredondados?

100

Muitas perguntas como essa explicam como criar programaticamente uma máscara e fornecer cantos arredondados para um UIView.

Existe uma maneira de fazer tudo dentro do Storyboard? Só perguntar porque parece que criar cantos arredondados no Storyboard mantém uma demarcação mais clara entre a apresentação e a lógica.

Crashalot
fonte
Possível duplicata de Definir uma borda para UIButton no Storyboard
bummi

Respostas:

264

Sim, eu uso muito, mas perguntas como essa já foram respondidas várias vezes.

Mas de qualquer maneira no Interface Builder. Você precisa adicionar Atributos de tempo de execução definidos pelo usuário como este:

layer.masksToBounds Boolean YES
layer.cornerRadius Number {View's Width/2}

insira a descrição da imagem aqui

e habilitar

Clips subviews

insira a descrição da imagem aqui

Resultados:

insira a descrição da imagem aqui

Woraphot Chokratanasombat
fonte
onde posso adicionar atributos de tempo de execução definidos pelo usuário?
Henson Fang
Como mostro na primeira imagem, selecione a visualização e, em seguida, no painel direito, selecione o terceiro ícone Atributos de tempo de execução definidos pelo usuário Clique no item abaixo para adicionar caminho, tipo e valor de chave
Woraphot Chokratanasombat
1
Você pode tornar o raio da borda dinâmico para que seja sempre 50% da largura ou precisa ser um inteiro estático?
Crashalot
1
Pelo que eu sei, apenas valor fixo.
Woraphot Chokratanasombat
1
Apenas para sua informação, se como eu você veio aqui pensando que isso funcionaria no LaunchScreen.storyboard, não funciona. Você obterá: Error: Launch screens may not use user defined runtime attributes. Parece que se você precisa de uma imagem redonda na Tela Inicial, você está sem opções.
Código Knox
22

Você pode fazer isso em um storyboard usando propriedades definidas pelo usuário. Selecione a vista que deseja arredondar e abra seu Inspetor de identidade. Na seção Atributos de tempo de execução definidos pelo usuário , adicione as duas entradas a seguir:

  • Caminho da chave:, layer.cornerRadiusTipo: Número, Valor: (qualquer raio que você desejar)
  • Caminho da chave:, layer.masksToBoundsTipo: Booleano, Valor: verificado

Você pode ter que importar QuartzKitno arquivo de classe correspondente da sua visão (se houver), mas eu juro que fiz funcionar sem fazer isso. Seus resultados podem variar.

EDIT: Exemplo de raio dinâmico

extension UIView {

    /// The ratio (from 0.0 to 1.0, inclusive) of the view's corner radius
    /// to its width. For example, a 50% radius would be specified with
    /// `cornerRadiusRatio = 0.5`.
    @IBDesignable public var cornerRadiusRatio: CGFloat {
        get {
            return layer.cornerRadius / frame.width
        }

        set {
            // Make sure that it's between 0.0 and 1.0. If not, restrict it
            // to that range.
            let normalizedRatio = max(0.0, min(1.0, newValue))
            layer.cornerRadius = frame.width * normalizedRatio
        }
    }

}

Verifiquei que isso funciona em um playground.

NRitH
fonte
1
Você pode tornar o raio da borda dinâmico para que seja sempre 50% da largura ou precisa ser um inteiro estático?
Crashalot
5
Você pode, mas apenas em código. Uma alternativa interessante, porém, é adicionar uma propriedade IBInspectable à classe da sua visualização que é um valor numérico entre 0 e 100 e indica a porcentagem da largura que o raio deve ter. Por exemplo, um valor de 50 significa que o raio deve ser 50% da largura. Por ser uma propriedade computada (não armazenada), você pode até adicioná-la a uma extensão de UIView para que todas as visualizações possam ter a propriedade.
NRitH
@NRitH, eu estaria interessado em ver algo assim. Você acha que pode postar o código aqui?
Cobie Fisher
17

Selecione a vista você alterou Corner Rediuse, Border Widthe e Border Color também usando StoryBord

extension UIView {

    @IBInspectable var cornerRadiusV: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidthV: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColorV: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}
Ananda Aiwale
fonte
3
por que usar cornerRadiusV em vez de cornerRadius?
luhuiya de
1
é definido como cornerRadius usando o storyboard por meio de, salve a codificação de escrita em Projeto
Ananda Aiwale
Funcionou perfeitamente
Hassan Tareq
0

Mesmo depois de fazer todas as alterações no storyboard, a resposta de Woraphot não funciona para mim.

Isso funcionou para mim:

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

Resposta longa :

Cantos arredondados de UIView / UIButton etc

customUIView.layer.cornerRadius = 10

Espessura da borda

pcustomUIView.layer.borderWidth = 1

Cor da borda

customUIView.layer.borderColor = UIColor.blue.cgColor
SwiftBoy
fonte
Isso não tenta responder à pergunta e é apenas uma duplicata de sua outra resposta aqui .
shim