Tengo un par de UIButtons, y en IB están configurados en Aspect Fit, pero por alguna razón siempre se estiran. ¿Hay algo más que tengas que configurar? Probé todos los modos de vista diferentes y ninguno de ellos funciona, todos se estiran.
ios
iphone
uibutton
aspect-fit
marty
fuente
fuente
Respuestas:
Ya tuve ese problema antes. Lo resolví poniendo mi imagen en un lugar
UIImageView
donde lacontentMode
configuración realmente funciona, y colocando una personalizada transparenteUIButton
encima de eso.EDITAR: Esta respuesta es obsoleta. Consulte la respuesta de @Werner Altewischer para obtener la respuesta correcta en las versiones modernas de iOS.
fuente
La solución es establecer
contentMode
en laimageView
propiedad deUIButton
. ElUIButton
tiene que ser creado con el tipo personalizado para que esto funcione creo (de lo contrarionil
se devuelve para esta propiedad).fuente
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Este método me funcionó muy bien:
En Xib seleccione el botón y configure
user defined runtime attributes
:self.imageView.contentMode
Number
1
fuente
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
funcionó para mí!Si está haciendo esto en Interface Builder, puede usar el inspector de atributos en tiempo de ejecución para configurarlo directamente sin ningún código.
Establezca la ruta de la clave en el botón para que sea "imageView.contentMode" con un tipo de "Número" y un valor de "1" (o el modo que desee).
fuente
Utilice imageView del botón para contentMode. No directamente en el propio botón.
fuente
Si coloca la imagen
UIImageView
detrás del botón, perderá la funcionalidad incorporada de laUIButton
clase, comoadjustsImageWhenHighlighted
yadjustsImageWhenDisabled
, y, por supuesto, la capacidad de configurar diferentes imágenes para diferentes estados (sin la molestia de hacerlo usted mismo).Si queremos tener una imagen sin estirar para todos los estados de control , una cosa es obtener la imagen usando
imageWithCGImage:scale:orientation
, como en el siguiente método:Para implementar esto escribiríamos:
Esto debería evitar que la imagen se estire en todos los estados de control. Me funcionó, ¡pero avíseme si no funciona!
NOTA: Aquí estamos abordando un problema relacionado con
UIButton
, peroinsideButton:
bien podría serinsideView:
, o lo que sea que a uno le gustaría encajar la imagen.fuente
Tuve este problema hace un tiempo. El problema que tuve fue que estaba tratando de aplicar este efecto al UIButton de fondo, que es limitado y, por lo tanto, significa que no puede ajustarlo tan fácilmente.
El truco es configurarlo como solo una imagen y luego aplicar la técnica de @ayreguitar y eso debería solucionarlo.
fuente
Esto funcionó para mi
Gracias a @ayreguitar por su comentario
fuente
Aquí hay una respuesta alternativa en rápido:
fuente
Combinando algunas respuestas diferentes en una solución: cree un botón con un tipo personalizado, establezca la propiedad imageView contentMode del botón y establezca la imagen para el botón (no la imagen de fondo, que aún se escalará para llenar).
fuente
fuente
Esta respuesta se basa en la respuesta de @ WernerAltewischer .
Para evitar tener que conectar mi botón a un IBOutlet para ejecutar el código en él, subclasé la clase de UIButton:
Ahora cree un botón personalizado en su xib y configure su imagen (no la imagen de fondo):
Luego, establezca su clase:
¡Listo!
En lugar del
ajuste de aspecto de la imagen de su botón, ahora es el esperado:
fuente
ios 12. Debes agregar también la alineación de contenido
fuente
Tuve problemas con la imagen que no cambiaba de tamaño proporcionalmente, por lo que la forma en que la arreglé fue con inserciones de borde.
fuente
Los modos de contenido de UIView se aplican al "contenido" del CALayer correspondiente. Esto funciona para
UIImageView
s porque establecen elCALayer
contenido en el correspondienteCGImage
.drawRect:
finalmente se renderiza al contenido de la capa.Un personalizado
UIButton
(hasta donde yo sé) no tiene contenido (los botones de estilo rectángulo redondeado pueden renderizarse usando contenido). El botón tiene subvistas: el fondoUIImageView
, la imagenUIImageView
y el títuloUILabel
. Configurar elcontentMode
en las subvistas puede hacer lo que quiera, pero jugar con laUIButton
jerarquía de vistas es un poco prohibido .fuente
Cambiar
UIButton.imageView.contentMode
no funcionó para mí.Resolví el problema configurando la imagen en la propiedad 'Fondo'.
Puede agregar una restricción de relación si lo necesita
fuente
Esto se superpone a muchas de las otras respuestas, pero la solución para mí fue
contentMode
delUIImageView
para el botón en.ScaleAspectFit
- lo que se puede hacer en los "Atributos de tiempo de ejecución definidos por el usuario" en Interface Builder (es decirself.imageView.contentMode
, Número, 1) o en unUIButton
subclase;fuente
Puede usar imageWithCGImage como se muestra arriba (pero sin los paréntesis que faltan).
Además ... millones de teléfonos que no sean 4.0 no funcionarán con ese código en absoluto.
fuente
[button sizeToFit]
trabajó para mi.fuente
Similar a @Guillaume, he creado una subclase de UIButton como Swift-File. Luego configure mi clase personalizada en el Interface Builder:
.
Y aquí el archivo Swift:
fuente
Tuve el mismo problema, pero no pude hacerlo funcionar (tal vez sea un error con el SDK).
Finalmente, como solución, coloqué un
UIImageView
detrás de mi botón y configuré las opciones que quería en eso, luego simplemente coloqué un espacioUIButton
en blanco encima.fuente