Si tengo un UIButton arreglado usando autolayout, su tamaño se ajusta muy bien para adaptarse a su contenido.
Si configuro una imagen como button.image
, el tamaño intrínseco nuevamente parece explicar esto.
Sin embargo, si modifico el titleEdgeInsets
botón, el diseño no tiene en cuenta esto y en su lugar trunca el título del botón.
¿Cómo puedo asegurarme de que el ancho intrínseco del botón tenga en cuenta el recuadro?
Editar:
Estoy usando lo siguiente:
[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
El objetivo es agregar cierta separación entre la imagen y el texto.
ios
cocoa-touch
uiview
uibutton
autolayout
Ben Packard
fuente
fuente
titleEdgeInset
documentación:The insets you specify are applied to the title rectangle after that rectangle has been sized to fit the button’s text. Thus, positive inset values may actually clip the title text.
Entonces, al agregar un recuadro, está forzando el botón para recortar el texto con seguridadRespuestas:
Puede resolver esto sin tener que anular ningún método o establecer una restricción de ancho arbitraria. Puede hacerlo todo en Interface Builder de la siguiente manera.
El ancho del botón intrínseco se deriva del ancho del título más el ancho del icono más las inserciones de los bordes de contenido izquierdo y derecho .
Si un botón tiene una imagen y un texto, están centrados como un grupo, sin relleno entre ellos.
Si agrega un contenido de contenido izquierdo, se calcula en relación con el texto, no con el icono de texto +.
Si establece un recuadro negativo en la imagen izquierda, la imagen se extrae hacia la izquierda pero el ancho general del botón no se ve afectado.
Si establece un recuadro negativo en la imagen izquierda, el diseño real usa la mitad de ese valor. Entonces, para obtener un recuadro izquierdo de -20 puntos, debe usar un valor de recuadro izquierdo de -40 puntos en Interface Builder.
Por lo tanto, proporciona una inserción de contenido izquierda lo suficientemente grande como para crear espacio para la inserción izquierda deseada y el relleno interno entre el icono y el texto, y luego desplaza el icono a la izquierda duplicando la cantidad de relleno que desea entre el icono y el texto. El resultado es un botón con insertos de contenido iguales a la izquierda y a la derecha, y un par de texto e íconos que se centran como un grupo, con una cantidad específica de relleno entre ellos.
Algunos valores de ejemplo:
fuente
UIButton
.Puede hacer que esto funcione en Interface Builder (sin escribir ningún código), mediante el uso de una combinación de títulos y contenidos negativos y positivos.
Actualización : Xcode 7 tiene un error en el que no puede ingresar valores negativos en el
Right
campo Insertar, pero puede usar el control paso a paso al lado para disminuir el valor. (Gracias Stuart)Hacer esto agregará 8 puntos de espacio entre la imagen y el título y aumentará el ancho intrínseco del botón en la misma cantidad. Me gusta esto:
fuente
Right
campo.¿Por qué no anular el
intrinsicContentSize
método en UIView? Por ejemplo:Esto debería indicarle al sistema de distribución automática que debería aumentar el tamaño del botón para permitir las inserciones y mostrar el texto completo. No estoy en mi propia computadora, así que no he probado esto.
fuente
intrinsicContentSize
es un método en UIView, no en UIButton, por lo que no estaría jugando con ningún método de UIButton. Apple no cree que sea un problema: "Anular este método permite que una vista personalizada comunique al sistema de diseño el tamaño que le gustaría tener en función de su contenido". Y el OP no dijo nada sobre diferentes botones, solo el uno.intrinsicContentSize
de hecho, es un método en UIView y UIButton es una subclase de UIView, por lo que, por supuesto, puede anular este método; nada en los documentos de Apple dice que no deberías. Simplemente haga una subclase UIButton usando el método anulado de Maarten y cambie su UIButton en Interface Builder para que sea del tipo YourUIButtonSubclass y funcionará perfectamente.intrinsicContentSize
UIButton debería agregar el título EdgeInsets, voy a presentar un error con Apple.No ha especificado cómo está configurando las inserciones, por lo que supongo que está usando titleEdgeInsets porque veo el mismo efecto que está obteniendo. Si uso contentEdgeInsets en su lugar, funciona correctamente.
fuente
Y para Swift trabajó esto:
Love U Swift
fuente
Este hilo es un poco viejo, pero me encontré con esto y pude resolverlo usando un recuadro negativo. Por ejemplo, sustituya los valores de relleno deseados aquí:
¡Combinado con las restricciones correctas de auto-distribución, terminas con un botón de redimensionamiento automático que contiene una imagen y texto! Visto a continuación con el
desiredLeftPadding
conjunto a 10.Puede ver que el marco real del botón no abarca la etiqueta (ya que la etiqueta se desplaza 10 puntos a la derecha, fuera de los límites), pero hemos logrado 10 puntos de relleno entre el texto y la imagen.
fuente
Para Swift 3 basado en la respuesta de pegpeg :
fuente
Todo lo anterior no funcionó para iOS 9+ , lo que hice es:
Ahora para agregar un borde alrededor del botón solo use el método:
fuente
Quería agregar un espacio de 5 puntos entre mi ícono UIButton y la etiqueta. Así es como lo logré:
La forma en que contentEdgeInsets, titleEdgeInsets e imageEdgeInsets se relacionan entre sí requiere un poco de toma y daca de cada inserción. Entonces, si agrega algunas inserciones a la izquierda del título, debe agregar una inserción negativa a la derecha y proporcionar más espacio (a través de una inserción positiva) en el contenido a la derecha.
Al agregar un recuadro de contenido adecuado para que coincida con el cambio de las inserciones de título, mi texto no sale de los límites del botón.
fuente
La opción también está disponible en el generador de interfaces. Ver el recuadro. Puse izquierda y derecha en 3. Funciona como un encanto.
fuente
La solución que uso es agregar una restricción de ancho en el botón. Luego, en algún lugar de la inicialización, después de configurar el texto, actualice la restricción de ancho de esta manera:
self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;
Donde 8 es cualquiera que sea tu inserción.
fuente
constant
la restricción al nuevo valor ... y saber cuándo cambia el tamaño del contenido intrínseco del botón es difícil sin subclasificar el botón.setNeedsUpdateConstraints
puede realizar una llamada a "manualmente" después de actualizar el título o la imagen del botón. A continuación, puede anularupdateConstraints
y volver a calcularbuttonWidthConstraint
la constante de allí. Este no es necesariamente el mejor enfoque, pero funciona lo suficientemente bien para mí. YMMV;)llamar a sizeToFit () se asegura de que contentEdgeInset tenga efecto
fuente