settitle cocoa-touch uibutton uilabel calayer drawrect

cocoa-touch - settitle - set title swift



Cómo agregar un segundo UILabel a un UIButton, configurable por UIControlState (2)

El segundo de tu enfoque funciona bien. Simplemente agregue 2 objetivos: Primera actualización al objetivo de "estado normal" usando "todos los eventos táctiles". Segunda actualización para "resaltado" usando el evento "tocar hacia abajo".

Si los estados no solo se modifican mediante toques y se desea manejar esto de manera más general, Id sugiero el multihilo. Todo lo que realmente necesita es llamar a performSelectorInBackground al inicializar todos estos elementos (el selector actualiza la etiqueta según el estado del botón) y luego llamar al mismo performSelectorInBackground al final del método "update label", creando un ciclo infinito.

Quiero mostrar 2 cadenas (en diferentes posiciones en el botón) con diferentes fuentes y colores (estoy usando el setTitle del botón para uno, y necesito otro), y algunos atributos se deben cambiar en función del UIControlState actual (como el color).

Por lo tanto, estoy buscando la mejor manera de agregar una segunda etiqueta a un UIButton . Necesito que la etiqueta sea configurable por UIControlState (quiero un color diferente para UIControlStateNormal y UIControleStateHighlighted por ejemplo).

He intentado los siguientes enfoques:

  • Subclass a UIButton y use drawRect : aunque no se recomienda (y ahora entiendo por qué), no creo que sea posible, parece que se llama al método drawRect del botón (y después de la de mi subclase) incluso si no lo hago t llamar super.
  • Cree un nuevo UILabel y agréguelo como una subview a mi botón: esto funciona bastante bien, excepto que no sé cómo cambiar el color cuando el UIControlState del botón está cambiando
  • Crea una nueva capa y usa drawLayer : no sé cómo llamar al método drawLayer cada vez que cambia el estado del botón (mi drawLayer solo se llama una vez, cuando uso setNeedsDisplay justo después de agregar mi capa al botón)

¿Hay alguna otra manera de lograr lo que estoy tratando de hacer, o tal vez una de esas soluciones podría funcionar (con algunos ajustes)?

¡Gracias!


Ok, creo que encontré una solución de trabajo (para mi problema al menos).

Estoy subclasificando la clase UIButton (funciona para mí, ya que estoy usando un botón dibujado personalizado de todos modos), y titleRectForContentRect método titleRectForContentRect que se llama cada vez que se debe mostrar el título (incluso después de un cambio de estado, justo antes monitor).

UILabel un UILabel a la vista del botón para mostrar la segunda cadena que quiero, y durante el titleRectForContentRect , titleRectForContentRect la ubicación de frame correcta para mi etiqueta, actualizo la fuente y el color del texto de la etiqueta en función del estado del botón ( self.state ). y eso es todo lo que necesito