iphone - fit - UIButton no escucha la configuración del modo de contenido?
content mode xcode (15)
firstButton es un UIButton de tipo Personalizado. Estoy programáticamente poniendo tres de ellos en cada celda de una tabla, así:
[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];
En otro lugar, le estoy diciendo a clipToBounds. Lo que obtengo es un recorte del cuadrado central de la imagen, en lugar de una representación a escala de aspecto. Lo he intentado de muchas maneras, incluida la configuración de la propiedad mode en firstButton.imageView, que tampoco parece funcionar.
Al tratar de resolver esto, mi método se hizo un poco más complicado a medida que pasaba el tiempo, y terminé subclasificando UIButton y reemplazando setHighlighted:
Para mí, funciona simplemente derribar la imagen alfa a .5, porque están en un fondo negro.
Sin embargo, solo funciona si hago un comentario [super setHighlighted:] (donde parece que está pasando el código de imagen elástica), lo cual no parece ser la forma correcta de resolverlo ... todo parece ser trabajando bien, sin embargo. Veremos cómo se mantiene mientras sigo trabajando en ello.
- (void)setHighlighted:(BOOL)highlight {
if (highlight) {
[self.imageView setAlpha:.5];
} else {
[self.imageView setAlpha:1];
}
// [super setHighlighted:highlight];
}
Creo que aquí tenemos un problema simple de creación de interfaz: al parecer, el IB ignora cualquier cambio en el modo de contenido DESPUÉS de haber establecido la propiedad de la imagen.
la solución es simple: configure el modo de contenido, elimine los nombres de imagen previamente establecidos (asegúrese de eliminarlos en todos los estados, por defecto, resaltados, etc.), luego vuelva a ingresar los nombres de imagen deseados en todos los estados deseados - et voilà .
Después de un par de horas de confusión, así es cómo lo hice funcionar en iOS 3.2. Como mencionó Dusker, usar setBackgroundImage en lugar de setImage hizo el trabajo por mí.
CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];
En lugar de configurar el modo de contentMode
en el botón, querrá establecer las propiedades contentHorizontalAlignment
y contentVerticalAlignment
y (crucialmente) el contentMode
para el imageView
del botón para cualquier tipo de relleno o ajuste de aspecto. Aquí hay un ejemplo:
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Por supuesto, también puede hacer otras cosas, como alinear la imagen del botón con la parte superior del botón. Si no necesita un relleno o ajuste de aspecto, simplemente puede establecer la alineación por sí mismo:
button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
En Swift, querrás usar:
button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit
Esto funciona para todas las versiones de iOS, incluidas las últimas versiones con diseño automático (es decir, iOS 4 hasta iOS 11+).
En lugar de setImage prueba setBackgroundImage
Encontré una solución para esto. Establezca la propiedad adjustsImageWhenHighlighted
de UIButton
en NO
.
UIButton *b = [[UIButton alloc] initWithFrame:rect];
[b setImage:image forState:UIControlStateNormal];
[b.imageView setContentMode:UIViewContentModeScaleAspectFill];
[b setAdjustsImageWhenHighlighted:NO];
Espero que esto ayude. Siéntase libre de comentar a continuación, daré seguimiento a cualquier pregunta que tenga.
La única solución que funcionó para mí:
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
La respuesta es usar UIImageView con todas las configuraciones adorables del modo de contenido que desee, y luego aplicarle un botón personalizado encima. Tonto que no puedes hacer eso de una sola vez, pero parece que no puedes.
Mi respuesta es similar a la de Kuba. Necesitaba que mi imagen estuviera programada.
UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won''t work without it.
for(UIView *view in button.subviews) {
view.contentMode = UIViewContentModeScaleAspectFill;
}
Si alguien está buscando una respuesta que funcione en iOS 6 y iOS 7 y en el guión gráfico:
Puedes establecer una imagen en tu guión gráfico:
Y entonces:
for(UIView* testId in self.subviews) {
if([testId isKindOfClass:[UIImageView class]])
[testId setContentMode:UIViewContentModeScaleAspectFill];
}
Si el UIButton no parece escuchar la configuración de restricción de diseño, verifique si las imágenes son más grandes que el tamaño del botón. Utilice siempre las imágenes @ 2x y @ 3x para las resoluciones retina.
Si está tratando con la imagen de UIButton (a diferencia de su imagen de fondo, configurar el modo de contenido en el UIButton mismo o en su imageView no tiene ningún efecto (a pesar de lo que digan otras respuestas).
Alternativamente, haga esto en su lugar:
self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
O dimensione su imagen en consecuencia.
O simplemente use un UIImageView (que respeta adecuadamente el modo de contenido) con un UITAPGestureRecognizer adjunto, o un UIButton transparente encima.
También adjustsImageWhenHighlighted
echar un vistazo a la propiedad adjustsImageWhenHighlighted
UIButton
para evitar deformaciones extrañas de la imagen, cuando se presiona el botón.
Yo tuve el mismo problema. Veo que esta pregunta es un poco antigua, pero quiero proporcionar una respuesta clara y correcta para salvar a otras personas (como yo) en algún momento cuando aparezca en sus resultados de búsqueda.
Me llevó un poco buscar y experimentar, pero encontré la solución. Simplemente configure el ContentMode del ImageView "oculto" que está dentro del UIButton.
[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
Quizás es a lo que se refería Dan Ray en su respuesta aceptada, pero sospecho que no.
Swift 3
self.firstButton.imageView?.contentMode = .scaleAspectFill