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()
Tuve el mismo problema y layoutIfNeeded
a layoutIfNeeded
antes de que todas las cosas de esquina redondeada / clipsToBounds
solucionaran el problema. iOS 10 GM con xcode 8 GM hace que las vistas desaparezcan debido a rounded Corners & clipsToBounds
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 ellayoutSubviews()
- Llamando
layoutIfNeeded
en elawakeFromNib
de mi botón (o mi celda que contiene el botón) - Llamando
layoutIfNeeded
en ellayoutSubview
de mi celular - Llamando
contentView.layoutIfNeeded()
en elawakeFromNib
de mi celular - Llamando
view.layoutIfNeeded()
en mi controlador de vista