ios - ¿Cómo establecer el radio de la esquina de imageView?
swift uiimageview (10)
Hay una pequeña diferencia en Swift 3.0 y Xcode8
Siempre que desee aplicar el radio de esquina a UIView, asegúrese de llamar a su
yourUIView.layoutIfNeeded()
antes de llamar a
cornerRadius
.
De lo contrario, devolverá el valor predeterminado para la altura y el ancho de UIView (1000.0), lo que probablemente hará que su vista desaparezca.
Asegúrese siempre de que todos los efectos que cambian el tamaño de UIView (restricciones del generador de interfaz, etc.) se apliquen antes de establecer las propiedades de capa.
Ejemplo de implementación de clase UIView
class BadgeView: UIView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
En Objective-C tal línea
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0f;
hace su trabajo, lo probé en Swift usando analogía
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
y no cambia nada, las esquinas son las mismas que antes. Además, Xcode no muestra ningún error de sintaxis. ¿Swift admite alguna otra forma de alcanzar este objetivo? Revisé algunos otros hilos aquí y generalmente se está haciendo en Swift de la manera que se muestra arriba.
La capa se extrae de la región de recorte, debe configurarla para enmascarar los límites:
self.mainImageView.layer.masksToBounds = true
De los docs :
Por defecto, el radio de la esquina no se aplica a la imagen en la propiedad de contenido de la capa; solo se aplica al color de fondo y al borde de la capa. Sin embargo, al establecer la propiedad masksToBounds en true, el contenido se recorta en las esquinas redondeadas
La forma más fácil es crear una subclase UIImageView (lo he probado y funciona perfectamente en iPhone 7 y XCode 8):
class CIRoundedImageView: UIImageView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
y luego también puedes establecer un borde:
imageView.layer.borderWidth = 2.0
imageView.layer.borderColor = UIColor.blackColor().CGColor
Marcados con
@IBInspectable
en swift (o IBInspectable en Objective-C), son fácilmente editables en el panel del inspector de atributos de Interface Builder.
Puede configurar directamente
borderWidth
,
cornerRadius
,
borderColor
en el inspector de atributos
view.layer.cornerRadius = view.frame.width/4.0
view.clipsToBounds = true
Prueba esto en Swift:
self.photoView.layer.cornerRadius = self.photoView.frame.height/2
Swift 3, Xcode 8, iOS 10
DispatchQueue.main.async {
self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
self.mainImageView.clipsToBounds = true
}
en swift 3 ''CGRectGetWidth'' ha sido reemplazado por la propiedad ''CGRect.width''
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get{
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = borderColor?.cgColor
}
}
}
prueba esto
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
UIView
una extensión
UIView
que permite redondear esquinas específicas:
import UIKit
enum RoundType {
case top
case none
case bottom
case both
}
extension UIView {
func round(with type: RoundType, radius: CGFloat = 3.0) {
var corners: UIRectCorner
switch type {
case .top:
corners = [.topLeft, .topRight]
case .none:
corners = []
case .bottom:
corners = [.bottomLeft, .bottomRight]
case .both:
corners = [.allCorners]
}
DispatchQueue.main.async {
let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
}
}
}