A configuração da imagem UIButton resulta no botão azul no iOS 7

163

No iOS 6 SDK, escrevi as seguintes linhas de código para exibir uma imagem dentro de um botão:

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];

Mas agora com o Xcode 5 e o iOS 7 isso não funciona. O botão não contém a imagem. O botão está cheio de cor azul.

user2665539
fonte
A imagem aparece quando você clica no botão?
JustAnotherCoder

Respostas:

378

No iOS7, há um novo tipo de botão chamado UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // botão padrão do sistema

Verifique seu arquivo .xib e altere o tipo de botão para Personalizado Olhe para a imagem

Para fazer isso programaticamente, adicione esta linha ao viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 
Chamira Fernando
fonte
2
[UIButton buttonWithType: UIButtonTypeSystem];
avuthless
57
Observe que esta solução remove a cor da tonalidade do sistema, mas também resulta em uma transição difícil entre os estados destacado e normal. Se você deseja preservar o comportamento do sistema, animações etc., mas deseja se livrar da cor da tonalidade, tente [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(com o tipo de botão definido como "Sistema" no IB).
JWK
Obrigado, isso foi muito útil. No nosso caso, o botão foi recortado até a forma do PNG transparente e depois tingido.
g_pass
Nossa, eles esconderam esse poço, não?
Maury Markowitz
funciona :) você pode ter algum outro problema no seu código ur. Se você olhar para o Xcode 6.1, poderá ver claramente as opções disponíveis.
Chamira Fernando 22/10
53

Parece que o iOS 7 está usando a imagem fornecida apenas como uma máscara Alpha para exibir a cor da tonalidade do botão. Alterar o tipo de botão para UIButtonTypeCustomfazer o truque para mim (obrigado user716216!). Definir a imagem como plano de fundo nem sempre funciona se você já tiver uma imagem de plano de fundo, como foi o meu caso.

user3099609
fonte
Obrigado! O usuário original esqueceu de aceitá-lo como resposta.
jigzat
ele está trabalhando para mim, mas a mudança de sistema não trabalho para o meu caso, agradece a todos da sua contribuição
chings228
29

Swift 3, 4, 5:

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

Há uma boa chance de a imagem estar lá e você simplesmente não a poder ver. Tente alterar o tipo do botão para UIButtonTypeCustom. Se isso não funcionar, defina a cor de fundo do botão como[UIColor clearColor];

Mick MacCallum
fonte
9

A questão é a TintColor. Por padrão, o iOS lança uma cor azul sobre cada botão. Você pode contornar isso de três maneiras.

  1. Mude a cor da tonalidade. [button setTintColor:[UIColor blackColor]]; Isso pode colorir sua imagem de maneiras que você não deseja.

  2. Como a maioria das outras sugestões, defina a imagem de fundo. [button setBackgroundImage:[UIImage...]];

  3. Adicione um UIImageView ao seu botão.

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

[button addSubView:img];

DrDisc
fonte
9

Para rápida:

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

Eu tive o mesmo problema. No meu storyboard, eu tinha um botão sem nenhuma imagem.

Eu atribuiria a imagem no código.

O iOS 7 chegou e eu recebi muitas imagens em azul.

A resolução foi simples, mas confusa. Se eu atribuir qualquer imagem no storyboard e depois alterá-la no tempo de execução, ela funciona bem.

Você sempre deve especificar uma imagem inicial no storyboard, mesmo que não a utilize.

Ryan Heitner
fonte
3

Isso funcionou para mim

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

Nota: Remova a imagem frontal antes de fazer isso.

datha
fonte
como remover a imagem de fundo por favor !!
Simbesi.com
3

Tópico antigo, mas eu queria conversar porque tinha o mesmo problema. O problema era exatamente o que você estava chamando setImage quando deveria chamar setBackgroundImage.

Rob Schlackman
fonte
1

Nenhuma das soluções fornecidas estava funcionando para mim. Se você não definir uma imagem inicial no Storyboard, ainda poderá alterar a imagem do botão usando setBackgroundImage.

Para o seu exemplo, apenas uma pequena alteração é necessária.

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
fonte
1

Esse problema é chamado de problema de cor azul do botão no xcode. Quando criamos botão por código, o botão mostra a cor da tonalidade azul por padrão. Isso pode ser resolvido ao atribuir a cor da tonalidade a preto ou branco de acordo com a cor da célula. O código é:

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
fonte
o seu muito útil @Shane
Rudra
1

Usando o Xcode 9.2, nenhuma das soluções acima funcionou para o que eu estava procurando.

Eu estava procurando uma solução que permitisse definir .normale .selected UIControlStateimagens dentro do storyboard para o modo de renderização original , mas, dentro do arquivo Swift, nenhuma literal de cadeia de caracteres deve existir em relação aos nomes das imagens.

Basicamente, dentro do seu código, você obterá a imagem definida no storyboard para .normalestado e a renderizará novamente como .alwaysOriginal(o mesmo para .selectedestado); depois, você definirá a imagem (que agora é renderizada como original e não será afetada por tonalidade) para o estado relevante ( .normale .selected) do seuUIButton .

Aqui 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)

Dessa forma, você pode definir os estados da imagem do botão e, se o nome da imagem mudar, isso não afetará o seu código.

OhadM
fonte
1

No iOS 13 - basta definir a propriedade Tint como Branco, mantendo o tipo do UIButton como Personalizado

rommex
fonte
0

fazer a cor da tonalidade como cor clara para todos os quatro estados (Padrão, Realçado, selecionado, desativado) funcionou para mim.

Rajashekar
fonte
-1

No Swift 4 , inicialize seu UIButtone atribua seus dados de imagem da seguinte maneira:

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