UIButton: establece la imagen para el estado seleccionado resaltado

158

Configuré imágenes para los estados de los botones Normal, Destacado y Seleccionado, pero cuando presioné el botón en el estado seleccionado y lo presioné / resalté, no vi mi imagen resaltada sino solo una imagen en gris. ¿Es posible establecer una imagen para el estado resaltado cuando se selecciona el botón?

mi código:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

Cuando lo hago:

[button setSelected:YES];

y presiona el botón, la imagen "press.png" no selecciona.

usuario478681
fuente
+1 Tengo el mismo problema, espero que haya respuestas.
Nick Weaver
3
¡Brillante! ¡Quién sabría que podrías configurar imágenes para combinaciones! ¡Funcionó como un encanto para mí!
David H
1
¡¡¡Increíble!!! tu pregunta en sí es respuesta para mí ... ¡Funcionó!
Kiran S
1
Funciona para mí solo con UIControlStateHighlighted, pero llamo button.adjustsImageWhenHighlighted = NO;primero.
Graham Perks el
Esta. Mucho mejor que la solución que tenía antes.
Meshach

Respuestas:

231

Encontré la solución: necesito agregar una línea de suma

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
usuario478681
fuente
55
¿Alguna forma de hacer esto a través del generador de interfaces?
Stephen
66
@stephen: Establecer la propiedad "Fondo" (imagen) de UIButton para diferentes condiciones de la propiedad "StateConfig" (Predeterminado / Destacado / Seleccionado / Desactivado) me funciona.
Ajeet
2
La solución de Ajeet no funcionó para mí. También me gustaría saber cómo hacerlo en IB
Lucas
3
Como no puede configurar esto en IB, puede poner esto en su método viewDidLoad, y será casi tan bueno, ya que puede cambiar la imagen en IB y no tener que preocuparse por actualizar siempre el código para que coincida. [button setImage: [button imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood
44
Usted puede hacer esto en IB. Ver capturas de pantalla en la respuesta a continuación!
Ríomhaire
121

Puede hacer esto en Interface Builder.

Seleccione el UIButtonque desea configurar y IBluego vaya a attributes inspector.

En las capturas de pantalla, estoy usando un tipo de botón personalizado, pero eso no importa.

Personalizado por defecto

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Ríomhaire
fuente
55
La costumbre o el sistema es realmente muy importante. Juega con ambos y verás.
Ben Sinclair
9
No en el contexto de la pregunta.
Ríomhaire
77
Esto no responde la pregunta. Él dice que la combinación de estado resaltado + seleccionada
Rafael Nobre
+1 porque me perdí totalmente estos menús desplegables (solía hacer todo mediante programación hasta hace muy poco ...)
Nicolas Miari
30

Swift 3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

Para establecer la imagen de fondo podemos usar setBackgroundImage(_:for:)

Swift 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])
kvothe
fuente
La versión de matriz no funcionó para mí. (al menos durante setImage)
huggie
1
iOS 10 atenuará sus imágenes normales / seleccionadas, lo cual es agradable y se ve bien. Si configura una imagen seleccionada y resaltada, no se atenuará automáticamente. Lo cual es un fastidio.
snakeoil
28

Creo que la mayoría de los carteles aquí pierden el punto por completo. Yo tuve el mismo problema. La pregunta original era sobre el estado resaltado de un botón Seleccionado (COMBINAR AMBOS ESTADOS) que no se puede establecer en IB y vuelve al estado Predeterminado con algo de oscurecimiento. Solo solución de trabajo como una publicación mencionada:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
alghanor
fuente
lo sé pero de alguna manera no estaba permitido
alghanor
1
por alguna razón sigo teniendo el problema incluso si lo configuro como se indica arriba. La única forma de obtener una imagen personalizada para mi estado de control es establecer UIControlStateHighlighted solamente.
Julius
12

Si tiene una buena razón para hacerlo, esto será suficiente.

agregue estos objetivos:

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender{
    UIButton *button=(UIButton *)sender;
    if(button.selected){
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    }
}

-(void)buttonTouchUp:(id)sender{
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
}
Jorge
fuente
Gracias por esto, pero en realidad es demasiado complicado) Esperaré que el botón funcione como se describió anteriormente
user478681
7

En Swift 3.x, puede configurar la imagen resaltada cuando se selecciona el botón de la siguiente manera:

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))
Ashish Verma
fuente
7

En swift puedes hacer:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))
Roland Keesom
fuente
2

Corrígeme si estoy equivocado. Haciendo

   [button setSelected:YES];

Está cambiando claramente el estado de los botones seleccionados. Entonces, naturalmente, por el código que ha proporcionado, la imagen será la del estado seleccionado en su caso.

visakh7
fuente
No entiendo completamente a qué te refieres con "limpiar cambiando el estado ...". esto es muy simple: configuro las imágenes para los estados descritos anteriormente, agrego la acción objetivo para este botón y en el método que procesa mi acción (evento de control UIControlEventTouchUpInside) Alternar el estado seleccionado para el botón [button setSelected: YES / NO]. Y cuando el botón se encuentra actualmente en el estado seleccionado y lo presiono / resalto, solo veo una imagen en gris, como si no hubiera una configuración de imagen para este estado.
user478681
Quise decir claramente allí. Lo siento por eso. Cuando presiona el botón primero, está configurando su estado como seleccionado, de modo que se mostrará la imagen. Entonces, si desea obtener solo la imagen resaltada, establezca su estado como resaltado. Sin embargo, no estoy seguro de si te estoy obteniendo correctamente
visakh7
Cuando presiono el botón primero, lo declaro resaltado y luego, cuando lo libero, se seleccionará el estado (como lo configuré en mi método de acción). Luego lo presiono nuevamente (el botón ya está en el estado seleccionado) y el estado debería cambiarse a resaltado y debería ver la imagen press.png pero no lo veo en este caso.
user478681
1

Si alguien se pregunta cómo funciona esto en Swift, aquí está mi solución:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)
dios base
fuente
@basegod esta es una solución que funciona, pero la forma en que Roland Keesom la escribió es mucho más limpia.
jungledev
1

Swift 3+

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

O

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

Significa que el botón actual en selectedestado, luego lo toca, muestra el highlightestado.

yuanjilee
fuente
0

Tuve problemas para configurar imageView.highlighted = NO; (configurar YES funcionó correctamente y la imagen cambió a la resaltada).

La solución estaba llamando [imageView setHighlighted:NO];

Todo funcionó correctamente.

DrArt
fuente
0

Desde donde quieres llamar

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

El método:

-(void)test:(id)sender{
    UIButton *button=(UIButton *)sender;
    if (_togon){
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    }
    else{
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    }
}

Crédito a Jorge, pero lo mejoré un poco dando la solución de trabajo completa

Kingsley Mitchell
fuente
0

Xamarin C #

Hacer bit a bit O no funciona por alguna razón

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

Los siguientes trabajos

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);
Pierre
fuente
0

Si necesita el tono resaltado que el sistema operativo proporciona de manera predeterminada cuando toca y mantiene presionado un botón personalizado para el estado seleccionado también, use esta subclase de UIButton. Escrito en Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Raj Pawan Gumdal
fuente