No quiero usar una subvista si puedo evitarla. Quiero un UIButton
con una imagen de fondo, texto y una imagen en él. En este momento, cuando hago eso, la imagen está en el lado izquierdo del texto. La imagen de fondo, el texto y la imagen tienen estados de resaltado diferentes.
ios
user-interface
layout
uibutton
jasongregori
fuente
fuente
Respuestas:
A pesar de que algunas de las respuestas sugeridas son muy creativas y extremadamente inteligentes, la solución más simple es la siguiente:
Tan sencillo como eso. Como beneficio adicional, la imagen estará en el lado izquierdo en configuraciones regionales de derecha a izquierda.
EDITAR : como se ha hecho la pregunta varias veces, este es iOS 9+ .
fuente
semanticContentAttribute
es solo un truco / solución alternativa, no una solución real.La solución más simple:
iOS 10 y superior, Swift:
Antes de iOS 10, Swift / Obj-C:
fuente
button.ImageEdgeInsets = new UIEdgeInsets(0, -leftPadding, 0, leftPadding); button.ContentEdgeInsets = new UIEdgeInsets(0, 0, 0, leftPadding);
. Eso está en Xamarin, pero debería traducirse a Swift / Obj-C fácilmente.Hay una manera más fácil del Creador de interfaces .
Seleccione el botón UIB y seleccione esta opción en Ver utilidades> Semántica :
¡Eso es! Agradable y simple!
Si desea ajustar el espacio entre la imagen y el título, puede cambiar el recuadro de imagen aquí:
¡Espero que ayude!
fuente
Subclasificar UIButton es completamente innecesario. En su lugar, simplemente puede establecer un valor de inserción izquierdo alto para las inserciones de imagen y un pequeño recuadro derecho para el título. Algo como esto:
fuente
Le doy crédito a Inspire48 por este. Basado en su sugerencia y mirando esa otra pregunta, se me ocurrió esto. Subclase UIButton y anular estos métodos.
fuente
buttonWithType
If you subclass UIButton, this method does not return an instance of your subclass. If you want to create an instance of a specific subclass, you must alloc/init the button directly
y lasbackgroundRectForBounds
subclases que proporcionan adornos de fondo personalizados pueden anular este método y devolver un rectángulo de límites modificado para evitar que el botón dibuje sobre cualquier contenido personalizado '. Ninguno menciona esos específicos métodos, pero supongo que no les importan las subclases.frame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(frame) - self.imageEdgeInsets.right + self.imageEdgeInsets.left - frame.origin.x;
funciona mejor paraUIControlContentHorizontalAlignmentCenter
y para otros ...Simplemente actualice las inserciones cuando se cambie el título. Debe compensar el recuadro con un recuadro igual y opuesto en el otro lado.
fuente
[thebutton.titleLabel sizeToFit];
antes. El ancho puede ser cero si no ha activado un diseño. Lo mismo ocurre con el tamaño de la imagen (solo use UIImage.size en lugar del tamaño de imageView)titleWidth = [self.titleLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height)].width;
(o si le preocupa que el marco del botón aún no se haya establecido, use CGFLOAT_MAX también para la altura) yimageWidth = self.currentImage.size.width;
layoutSubviews
en miUITableViewCell
subclase, pero está funcionando bien. ¡Gracias!Todas estas respuestas, a partir de enero de 2016, son innecesarias. En Interface Builder, configure View Semantic en
Force Right-to-Left
, o si lo prefiere de forma programática,semanticContentAttribute = .forceRightToLeft
eso hará que la imagen aparezca a la derecha de su texto.fuente
UIBarButtonItem(customView: button)
, pero funcionará si envuelves el botón dentro de una vista vacíaEn el generador de interfaces, puede configurar las opciones Edge Insets para UIButton, por separado cada una de las tres partes: contenido, imagen, título
Xcode 8:
fuente
Actualización: Swift 3
Respuesta original para Swift 2:
Una solución que maneja todas las alineaciones horizontales, con un ejemplo de implementación Swift. Simplemente traduzca a Objective-C si es necesario.
También vale la pena señalar que maneja bastante bien las inserciones de imagen y título.
Inspirado en la respuesta jasongregori;)
fuente
@IBDesignable
a la clase y verla volteada en tiempo de diseño.Si esto debe hacerse en UIBarButtonItem , se debe usar un ajuste adicional a la vista
Esto funcionará
Esto no va a funcionar
fuente
Aquí hay una solución para
UIButton
contenido alineado al centro. Este código hace que la imagen esté alineada a la derecha y permite su usoimageEdgeInsets
ytitleEdgeInsets
para un posicionamiento precioso.Subclase
UIButton
con su clase personalizada y agregue:fuente
Como la solución de transformación no funciona en iOS 11, decidí escribir un nuevo enfoque.
Ajuste de los botones
semanticContentAttribute
nos da la imagen muy bien a la derecha sin tener que retransmitir si el texto cambia. Por eso es la solución ideal. Sin embargo, todavía necesito soporte RTL. El hecho de que una aplicación no pueda cambiar su dirección de diseño en la misma sesión resuelve este problema fácilmente.Dicho esto, es bastante sencillo.
fuente
Forma de extensión
Usando la extensión para establecer la imagen en el lado derecho con desplazamiento personalizado
fuente
Swift - Extiende el UiButton y coloca estas líneas
fuente
Basándose en la elegante solución de Piotr Tomasik: si desea tener un poco de espacio entre la etiqueta del botón y la imagen también, entonces inclúyalo en sus inserciones de borde de la siguiente manera (copiando mi código aquí que funciona perfectamente para mí):
¡Gracias Piotr por tu solución!
Erik
fuente
Hazlo tú mismo. Xcode10, swift4,
Para el diseño programático de la interfaz de usuario
para el diseño de la interfaz de usuario de StoryBoard
fuente
Subclases y diseño superior: las subvistas son probablemente la mejor opción.
Referenciado desde: iPhone UIButton - posición de la imagen
fuente
Tomó la respuesta de @ Piotr y la convirtió en una extensión Swift. Asegúrese de configurar la imagen y el título antes de llamar a esto, para que el botón se ajuste correctamente.
}
fuente
Una opción rápida que hace lo que quieres sin jugar con inserciones:
fuente
Las soluciones mencionadas aquí dejaron de funcionar, una vez que habilité el diseño automático . Tuve que inventar el mío:
Subclase UIButton y
layoutSubviews
método de anulación :Resultado:
fuente
Solución de migración swift 3.0 dada por jasongregori
fuente
Decidí no usar la vista de imagen de botón estándar porque las soluciones propuestas para moverlo se sentían extrañas. Esto me dio la estética deseada, y es intuitivo reposicionar el botón cambiando las restricciones:
fuente
Swift 3:
fuente
¿Qué hay de las restricciones? A diferencia de semanticContentAttribute, no cambian la semántica. Algo como esto quizás:
o en Objective-C:
Advertencias: no probado, iOS 9+
fuente
Para alinear la imagen a la derecha dentro de UIButton, intente debajo del código
fuente
Después de probar varias soluciones en Internet, no estaba logrando el requisito exacto. Así que terminé escribiendo código de utilidad personalizado. Publicar para ayudar a alguien en el futuro. Probado en swift 4.2
fuente
para este problema, puede crear UIView dentro de "etiqueta con vista UIImage" y establecer la clase UIView como UIControl y crear IBAction como una protección lateral
fuente
Swift 4 y 5
Cambiar la dirección de la imagen UIButton (RTL y LTR)
fuente
Utility
?Xcode 11.4 Swift 5.2
Para cualquiera que intente reflejar el estilo del botón Atrás con el galón como este:
Implementación:
fuente
Terminé creando un botón personalizado, que permite configurar la imagen del inspector. Abajo está mi código:
Puede ajustar el valor de Gap Padding desde Inspector para ajustar el espacio entre el texto y la imagen.
PD: Utilicé parte del código de la respuesta de @Mark Hennings
fuente