En algún momento de mi aplicación, tengo un resaltado UIButton
(por ejemplo, cuando un usuario tiene el dedo en el botón) y necesito cambiar el color de fondo mientras el botón está resaltado (por lo tanto, mientras el dedo del usuario todavía está en el botón) .
Intenté lo siguiente:
_button.backgroundColor = [UIColor redColor];
Pero no está funcionando. El color sigue siendo el mismo. Intenté el mismo código cuando el botón no está resaltado y funciona bien. También intenté llamar -setNeedsDisplay
después de cambiar el color, no tuvo ningún efecto.
¿Cómo forzar el botón para cambiar el color de fondo?
ios
objective-c
xcode
uibutton
MartinMoizard
fuente
fuente
Respuestas:
Puedes anular
UIButton
elsetHighlighted
método.C objetivo
Swift 3.0 y Swift 4.1
fuente
backgroundColor = isHighlighted ? .lightGray : .white
No estoy seguro de si esto resuelve lo que buscas o si se ajusta a tu panorama general de desarrollo, pero lo primero que intentaría sería cambiar el color de fondo del botón en el evento touchDown.
Opción 1:
Necesitaría dos eventos para capturar, UIControlEventTouchDown sería para cuando el usuario presiona el botón. UIControlEventTouchUpInside y UIControlEventTouchUpOutside serán para cuando suelten el botón para devolverlo al estado normal
Opcion 2:
Devuelva una imagen hecha del color de resaltado que desee. Esto también podría ser una categoría.
y luego cambie el estado resaltado del botón:
fuente
layer.cornerRadius
y opta por la opción n. ° 2, deberá asegurarse de establecerloclipsToBounds
en verdadero para redondear también las esquinas de la imagen.No es necesario anular
highlighted
como propiedad calculada. Puede usar el observador de propiedades para activar el cambio de color de fondo:Swift 4
fuente
File>New>File>Cocoa Touch Class
y configurándola ensubclass of UIButton
. Nombre el archivo para exCustomButton
, que se convertirá en el nombre del archivo y el nombre de la clase. Dentro de este archivo, coloque eloverride var highlighted
código que se muestra arriba. Último paso, configure el UIButton en Interface Builder para usar estaCustomButton
subclase yendo a la página de Propiedades donde dice "Clase personalizada" y tiene un cuadro desplegable. Dirá "UIButton" en letras grises. La lista desplegable debe mostrar CustomButton. Seleccione esto, y el botón ahora está subclasificado.isHighlighted = false
algún lugar al principio (por ejemplo, en la inicialización).Una práctica extensión genérica en Swift:
Swift 3.0
fuente
En Swift puede anular el descriptor de acceso de la propiedad resaltada (o seleccionada) en lugar de anular el método setHighlighted
fuente
highlighted
era una propiedad en UIButton. La respuesta es que es una propiedad en UIControl de la cual UIButton hereda.Anular variable resaltada. Agregar le
@IBInspectable
hace editar el backgroundColor resaltado en el guión gráfico, que también es ingenioso.fuente
Una solución más compacta (basada en la respuesta @ aleksejs-mjaliks ):
Swift 3/4 + :
Swift 2:
Si no desea anular, esta es una versión actualizada de la respuesta de @ timur-bernikowich ( Swift 4.2 ):
fuente
Extensión UIButton con sintaxis Swift 3+ :
Úselo como:
Respuesta original: https://stackoverflow.com/a/30604658/3659227
fuente
Aquí hay un enfoque en Swift, usando una extensión UIButton para agregar un IBInspectable, llamado resaltadoBackgroundColor. Similar a la subclase, sin requerir una subclase.
Espero que esto ayude.
fuente
Puede usar esta categoría que agrega el método setBackgroundColor: forState:
https://github.com/damienromito/UIButton-setBackgroundColor-forState-
fuente
Mi mejor solución para Swift 3+ sin subclases.
Con esta extensión, es fácil administrar los colores para diferentes estados y se desvanecerá su color normal automáticamente en caso de que no se proporcione el color resaltado.
fuente
ACTUALIZAR:
Use la biblioteca UIButtonBackgroundColor Swift.
ANTIGUO:
Utilice los siguientes ayudantes para crear una imagen de 1 px x 1 px con un color de relleno en escala de grises:
o un color de relleno RGB:
Luego, use eso
image
para configurar la imagen de fondo del botón:Ayudantes
Nota:
ACU
es el prefijo de clase de mi biblioteca estática Cocoa Touch llamada Acani Utilities, donde AC es para Acani y U es para Utilities.fuente
Prueba esto !!!!
Para TouchedDown Event, configure un color y para TouchUpInside configure el otro.
fuente
- (IBAction)onButtonTouchDragOutside:(UIButton *)sender {
para asegurarme de que el color no permanezca encendido cuando el usuario accidentalmente arrastra su dedo del botón.Subclasifique el UIButton y agregue propiedades inspeccionables para un uso conveniente (escrito en Swift 3.0):
fuente
Puedes subclasificar el UIButton y hacer un buen forState.
colourButton.h
colourButton.m
Notas (Este es un ejemplo, sé que hay problemas y aquí hay algunos)
He usado un NSMutableDictionay para almacenar el UIColor para cada estado, tengo que hacer una conversión de texto desagradable para la clave ya que el UIControlState no es un buen int. Si pudiera iniciar una matriz con tantos objetos y usar el estado como índice.
Debido a esto, puede tener dificultades con, por ejemplo, un botón seleccionado y deshabilitado, se necesita más lógica.
Otro problema es que si intenta configurar varios colores al mismo tiempo, no lo he intentado con un botón, pero si puede hacerlo, puede que no funcione
Supuse que esto es StoryBoard, no hay init, initWithFrame, así que agrégalos si los necesitas.
fuente
Swift 5 , gracias @Maverick
fuente
Detalles
Solución
Uso
fuente
Prueba esto si tienes una imagen:
o ver si
showsTouchWhenHighlighted
es suficiente para ti.fuente
He abierto una subclase de UIButton , STAButton , para llenar este vacío de funcionalidad. Disponible bajo la licencia MIT. Funciona para iOS 7+ (no lo he probado con versiones anteriores de iOS).
fuente
Para resolver este problema, creé una categoría para manejar
backgroundColor
estados conUIButtons
:ButtonBackgroundColor-iOS
Puedes instalar la categoría como un pod .
Fácil de usar con Objective-C
Aún más fácil de usar con Swift :
Te recomiendo importar el pod con:
Usando use_frameworks! en su Podfile facilita el uso de sus pods con Swift y Objective-C.
IMPORTANTE
También escribí una publicación de blog con más información.
fuente
fuente
Utilizar https://github.com/swordray/UIButtonSetBackgroundColorForState
Agregar a Podfile usando CocoaPods
Rápido
C objetivo
fuente
Prueba
tintColor
:fuente
NSLog(@"%@", _button);
?UIButtonTypeCustom
.Aquí está el código en Swift para seleccionar el estado del botón:
Ejemplo:
fuente
Suéltelo y estará listo para comenzar : * la proeza se puede establecer en IB, y si no se establece un fondo resaltado, el fondo no cambiará cuando se presione
fuente
La
UIIImage
extensión a continuación generará un objeto de imagen con el parámetro de color especificado.Se puede aplicar un uso de ejemplo para un botón para el objeto de botón como:
fuente
simple es usar esa extensión UIButton SOLAMENTE
y usa esto
fuente
si no va a anular, simplemente configure dos acciones touchDown touchUpInside
fuente
Swift 3:
fuente
en Swift 5
Para aquellos que no quieren usar un fondo de color para superar el estado seleccionado
Simplemente puede superar el problema utilizando la instrucción #Selector & if para cambiar fácilmente los colores UIButton para cada estado individualmente
Por ejemplo:
fuente