¿Usar Storyboard para enmascarar UIView y dar esquinas redondeadas?


100

Muchas preguntas como esta explican cómo crear una máscara mediante programación y proporcionar esquinas redondeadas a una UIView.

¿Hay alguna forma de hacerlo todo dentro de Storyboard? Solo preguntar porque parece que crear esquinas redondeadas en Storyboard mantiene una demarcación más clara entre presentación y lógica.


Respuestas:


264

Sí, lo uso mucho, pero preguntas como esta ya fueron respondidas muchas veces.

Pero de todos modos en Interface Builder. Debe agregar atributos de tiempo de ejecución definidos por el usuario como este:

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

ingrese la descripción de la imagen aquí

y habilitar

Clips subviews

ingrese la descripción de la imagen aquí

Resultados:

ingrese la descripción de la imagen aquí


¿Dónde puedo agregar atributos de tiempo de ejecución definidos por el usuario?
Henson Fang

Como muestro en la primera imagen seleccione Vista de ahí en adelante el panel derecho, seleccione el tercer icono de usuario definido por el tiempo de ejecución de Atributos Haga clic elemento de abajo para agregar ruta de la clave, tipo, valor
Woraphot Chokratanasombat

1
¿Puede hacer que el radio del borde sea dinámico para que sea siempre el 50% del ancho o debe ser un número entero estático?
Crashalot

1
Hasta donde yo sé, solo valor fijo.
Woraphot Chokratanasombat

1
Solo para su información, si como yo, viniste aquí pensando que esto funcionaría en LaunchScreen.storyboard, no es así. Obtendrá: Error: Launch screens may not use user defined runtime attributes. Parece que si necesita una imagen redonda en LaunchScreen, no tiene opciones.
Code Knox

22

Puede hacerlo en un guión gráfico utilizando propiedades definidas por el usuario. Seleccione la vista que desea redondear y abra su Inspector de identidad. En la sección Atributos de tiempo de ejecución definidos por el usuario , agregue las dos entradas siguientes:

  • Ruta de acceso clave:, layer.cornerRadiusTipo: Número, Valor: (cualquier radio que desee)
  • Ruta de acceso clave:, layer.masksToBoundsTipo: Booleano, Valor: marcado

Es posible que tenga que importar QuartzKiten el archivo de clase correspondiente de su vista (si corresponde), pero juro que lo hice funcionar sin hacer eso. Tus resultados pueden variar.

EDITAR: Ejemplo de un radio 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
        }
    }

}

Verifiqué que esto funciona en un patio de recreo.


1
¿Puede hacer que el radio del borde sea dinámico para que sea siempre el 50% del ancho o debe ser un número entero estático?
Crashalot

5
Puedes, pero solo en código. Una solución alternativa interesante, sin embargo, es agregar una propiedad IBInspectable a la clase de su vista que es un valor numérico entre 0 y 100 e indica el porcentaje del ancho que debería tener el radio. Por ejemplo, un valor de 50 significa que el radio debe ser el 50% del ancho. Debido a que es una propiedad calculada (no almacenada), incluso puede agregarla a una extensión de UIView para que todas las vistas puedan tener la propiedad.
NRitH

@NRitH, me interesaría ver algo así. ¿Crees que puedes publicar el código aquí?
Cobie Fisher

17

Seleccionar vista cambió Corner Rediuse, Border Widthe y Border Color también con 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
        }
    }
}

3
¿Por qué usar cornerRadiusV en lugar de cornerRadius?
luhuiya

1
se establece cornerRadius usando el guión gráfico, guarde la codificación de escritura en Project
Ananda Aiwale

Funcionó perfectamente
Hassan Tareq

0

Incluso después de realizar todos los cambios en el guión gráfico, la respuesta de Woraphot no me funciona.

Esto funcionó para mí:

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

Respuesta larga :

Esquinas redondeadas de UIView / UIButton, etc.

customUIView.layer.cornerRadius = 10

Grosor del borde

pcustomUIView.layer.borderWidth = 1

Color del borde

customUIView.layer.borderColor = UIColor.blue.cgColor

Esto no intenta responder la pregunta y es solo un duplicado de su otra respuesta aquí .
calzar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.