objective animatedimage ios uiimageview uiimage ios10 xcode8

animatedimage - clipsToBounds hace que UIImage no se muestre en iOS10 y XCode 8



objective c uiimage (10)

Acabo de implementar el redondeo de la esquina como este

@implementation RoundImageView - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { self.layer.masksToBounds = YES; self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; [self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(self)]; } return self; } -(void)dealloc { [self removeObserver:self forKeyPath:@"bounds" context:(__bridge void * _Nullable)(self)]; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"]) { self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; } } @end

Por eso siempre tengo esquinas adecuadamente redondeadas. Y no tuve problemas en la actualización a iOS10 y XCode8

Cambié mi proyecto a nuevas versiones beta de iOS 10 y XCode 8. En las tres áreas de mi aplicación donde uso:

imageView.layer.cornerRadius = imageView.frame.size.width/2 imageView.clipsToBounds = true

Las imágenes asociadas no se muestran en absoluto. He intentado limpiar el proyecto, así como la carpeta de compilación, reiniciar el dispositivo, probar varios simuladores, volver a agregar la imageView, configurar mediante programación el UIImage asociado en lugar de elegir uno de los activos.

Al eliminar la línea clipsToBounds se muestra la imagen rectangular independientemente de si masksToBounds es true o false . ¿Cómo puedo hacer una imagen circular en XCode8 / iOS10?

Edición: el proyecto es Swift 2.x y aún no se ha actualizado a la sintaxis de Swift 3.0.


Creo que el problema ocurre porque configuramos las subvistas de la esquina redonda y del clip como dijo @Pranoy C.

Resolví los problemas usando layoutIfNeeded para la celda my tableview que muestra la imagen de perfil de un usuario. Quiero asegurar que la imagen sea esquina redonda.

El código es el siguiente: - (void) awakeFromNib {[super awakeFromNib]; [auto layoutIfNeeded];

[self.inputIndicator_imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; self.profile_pic_edit_imageView.layer.cornerRadius = self.profile_pic_edit_imageView.frame.size.width/2; self.profile_pic_edit_imageView.layer.borderWidth = 1.0; self.profile_pic_edit_imageView.layer.borderColor = GRAY_COLOR_SUPER_LIGHT.CGColor; self.profile_pic_edit_imageView.clipsToBounds = YES;}


Debe llamar a layoutSubviews () en la vista principal antes de llamar a imageView.frame.size.width

[self.view layoutSubviews]; imageView.layer.cornerRadius = imageView.frame.size.width/2 imageView.clipsToBounds = true


Este problema también me pasó a mí.

imageView.layer.cornerRadius = imageView.frame.size.width/2 estos códigos imageView.layer.cornerRadius = imageView.frame.size.width/2 de - (void)awakeFromNib a - (void)drawRect:(CGRect)rect y este problema desapareció.

Mi imageView tiene un tamaño de autolayout. Creo que la altura y el ancho no se deciden cuando se despierta de la punta en iOS 10.


Esto parece que podría deberse a un nuevo error desde iOS 10 y Xcode 8, donde las vistas se inicializan en un tamaño de 1000x1000 y cuando se trata de establecer el radio de la esquina en la mitad de su marco, en su lugar se establece en 500. Esto se documenta más detalladamente en esta pregunta aquí: desde Xcode 8 y iOS10, las vistas no tienen el tamaño adecuado en viewDidLayoutSubviews . Mi razón para pensar que esta es la solución para el problema 1000x1000 es llamar subvistas de diseño antes de hacer cualquier cosa que requiera tamaños para algo que se haya construido en el generador de interfaces.


Podría ser un problema de diseño. Establecer clipToBounds en falso mostraría la imagen incluso si su tamaño es cero. ¿Puedes imprimir el frame de tus imágenes?

Si establece las propiedades cornerRadius y clipToBounds en viewDidLoad , intente hacerlo en viewDidLayoutSubviews() .

También puede intentar llamar self.view.layoutIfNeeded() .


Tuve ImageView que es totalmente circular en forma. A continuación se muestra el código:

//MARK:- Misc functions func setProfileImage() { imgProfile.layer.masksToBounds = false imgProfile.layer.cornerRadius = imgProfile.frame.size.height/2 imgProfile.clipsToBounds = true imgProfile.contentMode = UIViewContentMode.ScaleToFill }

Esto funciona bien en iOS 9. Sin embargo, in iOS 10 Xcode 8 the ImageView disappears. Después de la depuración se encontró que ClipsToBound es culpable.

Así que colocó el código en viewDidLayoutSubviews() resolvió el problema.

override func viewDidLayoutSubviews() { setProfileImage() }

También puedes usar self.view.layoutIfNeeded()



Usando obj-c, mover la sintaxis de viewDidLoad a viewDidLayoutSubviews funcionó para mí.


Yo tuve el mismo problema. No se muestra en el teléfono, pero es perfecto en el guión gráfico y el depurador de UI También funcionaba cuando estaba poniendo el proyecto "Abre con Xcode 7" en lugar de 8, pero no era una solución satisfactoria. Así que cavé y descubrí el problema. El problema era que una clase se veía así:

@IBDesignable public class MyButton: UIButton { @IBInspectable var styleName: String = "" { didSet { switch styleName { case "RoundedLight": tintColor = UIColor.lightPinkColor() layer.borderColor = UIColor.whiteColor().CGColor layer.borderWidth = 1 layer.masksToBounds = true default: break } } } override public func layoutSubviews() { super.layoutSubviews() switch styleName { case "RoundedLight": layer.cornerRadius = frame.height / 2 default: break } } }

Esto lo cambié y ahora funciona:

@IBDesignable public class MyButton: UIButton { @IBInspectable var styleName: String = "" { didSet { layoutIfNeeded() } } override public func layoutSubviews() { super.layoutSubviews() switch styleName { case "RoundedLight": tintColor = UIColor.lightPinkColor() layer.borderColor = UIColor.whiteColor().CGColor layer.borderWidth = 1 layer.cornerRadius = frame.height / 2 layer.masksToBounds = true default: break } } }

Tenga en cuenta que ninguno de los anteriores funcionó para mí, y quiero decir:

  • Llamando a layoutIfNeeded en el layoutSubviews()
  • Llamando layoutIfNeeded en el awakeFromNib de mi botón (o mi celda que contiene el botón)
  • Llamando layoutIfNeeded en el layoutSubview de mi celular
  • Llamando contentView.layoutIfNeeded() en el awakeFromNib de mi celular
  • Llamando view.layoutIfNeeded() en mi controlador de vista