La configuración de los resultados de la imagen UIButton en el botón azul en iOS 7

163

En iOS 6 SDK escribí las siguientes líneas de código para mostrar una imagen dentro de un botón:

NSURL *thumbURL2 = [NSURL URLWithString:@"http://example.com/thumbs/2.jpg"];
NSData *thumbData2 = [NSData dataWithContentsOfURL:thumbURL2];
UIImage *thumb2 = [UIImage imageWithData:thumbData2];
[btn2 setImage:thumb2 forState:UIControlStateNormal];
[self.view addSubview:btn2];

Pero ahora con Xcode 5 e iOS 7 esto no funciona. El botón no contiene la imagen. El botón está lleno de color azul.

usuario2665539
fuente
¿Aparece la imagen cuando hace clic en el botón?
JustAnotherCoder

Respuestas:

378

En iOS7 hay un nuevo tipo de botón llamado UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // botón de sistema estándar

Verifique su archivo .xib y cambie el tipo de botón a Personalizado Mira la imagen

Para hacer esto mediante programación, agregue esta línea a viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 
Chamira Fernando
fuente
2
[UIButton buttonWithType: UIButtonTypeSystem];
despiadado
57
Tenga en cuenta que esta solución elimina el color de tinte del sistema, pero también produce una transición difícil entre los estados resaltado y normal. Si está buscando preservar el comportamiento del sistema, las animaciones, etc., pero quiere deshacerse del color del tinte, intente [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(con el tipo de botón establecido en "Sistema" en IB).
JWK
Gracias, esto fue muy útil. En nuestro caso, el botón incluso se recortaba a la forma del PNG transparente y luego se teñía.
g_pass
Cielos, escondieron ese bien, ¿no?
Maury Markowitz
funciona :) podría tener algún otro problema en su código. Si miras Xcode 6.1 puedes ver claramente las opciones disponibles.
Chamira Fernando
53

Parece que iOS 7 está utilizando la imagen proporcionada solo como una máscara Alfa para mostrar el color del tinte del botón. Cambiar el tipo de botón UIButtonTypeCustomhizo el truco para mí (¡gracias user716216!). Establecer la imagen como fondo no siempre funciona si ya tiene una imagen de fondo, como fue mi caso.

usuario3099609
fuente
¡Gracias! El usuario original olvidó aceptarlo como respuesta.
jigzat
está funcionando para mí, pero el cambio al sistema no funciona para mi caso, gracias a todos por su contribución
chings228
29

Swift 3, 4, 5:

let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)
Wilson
fuente
24

Existe una buena posibilidad de que la imagen esté allí y simplemente no se pueda ver. Intenta cambiar el tipo de botón a UIButtonTypeCustom. Si eso no funciona, configure el color de fondo del botón en[UIColor clearColor];

Mick MacCallum
fuente
9

El problema es el TintColor. De forma predeterminada, iOS arroja un color de tinte azul sobre cada botón. Puede sortearlo de 3 maneras.

  1. Cambiar el color del tinte. [button setTintColor:[UIColor blackColor]]; Esto puede colorear su imagen de formas que no desea.

  2. Como la mayoría de los demás sugirió, configure la imagen de fondo. [button setBackgroundImage:[UIImage...]];

  3. Agregue un UIImageView a su botón.

UIImageView * img = [[UIImageView alloc] initWithImage:[UIImage...]];

[button addSubView:img];

DrDisc
fuente
9

Para rápido:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
Esqarrouth
fuente
6

Tuve el mismo problema. En mi guión gráfico tenía un botón sin ninguna imagen.

Luego asignaría la imagen en el código.

IOS 7 llegó y obtuve muchas imágenes azules.

La resolución fue simple pero confusa. Si asigno cualquier imagen en el guión gráfico y luego cambio la imagen en tiempo de ejecución, funciona bien.

Siempre debe especificar una imagen de inicio en el guión gráfico, incluso si no va a usarla.

Ryan Heitner
fuente
3

Esto funciono para mi

[myButton1 setBackgroundImage:[UIImage imageNamed:@"phones.png"] forState:UIControlStateNormal];

Nota: Elimine la imagen frontal antes de hacer esto.

datha
fuente
¡Cómo eliminar la imagen de fondo por favor!
simbesi.com
3

Hilo antiguo, pero quería intervenir porque simplemente tenía el mismo problema. El problema era que estaba llamando a setImage cuando debería llamar a setBackgroundImage.

Rob Schlackman
fuente
1

Ninguna de las soluciones dadas funcionaba para mí. Si no establece una imagen inicial en Storyboard, aún puede cambiar la imagen del botón utilizandosetBackgroundImage .

Para su ejemplo, solo se necesita un cambio menor.

NSURL *thumbURL2 = [NSURL URLWithString:@"http://example.com/thumbs/2.jpg"];
NSData *thumbData2 = [NSData dataWithContentsOfURL:thumbURL2];
UIImage *thumb2 = [UIImage imageWithData:thumbData2];
[btn2 setBackgroundImage:thumb2 forState:UIControlStateNormal];
[self.view addSubview:btn2];
Alex
fuente
1

Este problema se llama problema de color azul del botón en xcode. Cuando hacemos un botón por código, el botón muestra el color de tinte azul de manera predeterminada. Esto se puede resolver asignando el color de tinte a negro o blanco de acuerdo con el color de su celda. El codigo es:

UIImage *closebtnimg = [UIImage imageNamed:@"icon_uncheck.png"];
 UIImage *closebtnimg1 = [UIImage imageNamed:@"icon_checked.png"];

Custombutton *button = [Custombutton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(52, 66, 25, 24)];
[button setBackgroundImage:closebtnimg forState:UIControlStateNormal];
[button setBackgroundImage:closebtnimg1 forState:UIControlStateSelected];
[button setTintColor:[UIColor whiteColor]];
[cell.contentView addSubview:button];
[button addTarget:self action:@selector(changeImage:)  forControlEvents:UIControlEventTouchUpInside];
Shane
fuente
@Shane es muy útil
Rudra
1

Usando Xcode 9.2 ninguna de las soluciones anteriores funcionó para lo que estaba buscando.

Estaba buscando una solución que me permitiera configurar .normale .selected UIControlStateimágenes dentro del guión gráfico para su modo de representación original , pero, dentro del archivo Swift, no deberían existir literales de cadena con respecto a los nombres de las imágenes.

Básicamente, dentro de su código obtendrá la imagen que configuró dentro de su guión gráfico para el .normalestado y la volverá a representar como .alwaysOriginal(Lo mismo para el .selectedestado), luego, configurará esa imagen (que ahora se representa como original y no se verá afectada por el tinte) para el estado relevante ( .normaly .selected) de suUIButton .

Aquí está:

// Get your .normal image (you set via your storyboard) and render it as original
let unselectedImage = yourButton.image(for: .normal)?.withRenderingMode(.alwaysOriginal)
// Set your normal image but this time rendered as original
yourButton.setImage(unselectedImage, for: .normal)
// Same for selected state
let selectedImage = yourButton.image(for: .selected)?.withRenderingMode(.alwaysOriginal)
yourButton.setImage(selectedImage, for: .selected)

De esta manera, puede configurar los estados de imagen de su botón y si el nombre de la imagen cambia, no afectará su código.

OhadM
fuente
1

En iOS 13, simplemente configure la propiedad Tinte en Blanco, manteniendo el tipo de UIButton como Personalizado

rommex
fuente
0

hacer que el color de tinte sea transparente para los cuatro estados (predeterminado, resaltado, seleccionado, deshabilitado) funcionó para mí.

Rajashekar
fuente
-1

En Swift 4 , inicialice UIButtony asigne sus Datos de imagen de la siguiente manera:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Frank Eno
fuente