Установка изображения UIButton приводит к синей кнопке в iOS 7

В iOS 6 SDK я написал следующие строки кода для отображения изображения внутри кнопки:

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

Но теперь с Xcode 5 и iOS 7 это не сработает. Кнопка не содержит изображения. Кнопка заполнена синим цветом.

Ответ 1

В iOS7 появился новый тип кнопки UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0),//стандартная системная кнопка

Проверьте свой .xib файл и измените тип кнопки на Custom Look at the image

Чтобы сделать это программно, добавьте эту строку в viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 

Ответ 2

Кажется, что iOS 7 использует изображение, представленное как альфа-маску для отображения цвета оттенка кнопки. Изменение типа кнопки на UIButtonTypeCustom сделало трюк для меня (спасибо user716216!). Установка изображения в качестве фона не всегда работает, если у вас уже есть фоновое изображение, как и в моем случае.

Ответ 3

Там есть хороший шанс, что изображение есть, и вы просто не можете его увидеть. Попробуйте изменить тип кнопки на UIButtonTypeCustom. Если это не работает, установите цвет фона кнопки на [UIColor clearColor];

Ответ 4

Swift 3:

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

Ответ 5

Для быстрого:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton

Ответ 6

Проблема заключается в TintColor. По умолчанию iOS бросает синий цвет оттенка на каждую кнопку. Вы можете обойти его тремя способами.

  • Измените цвет оттенка. [button setTintColor:[UIColor blackColor]]; Это может окрасить ваше изображение так, как вы этого не хотите.

  • Как и большинство других, установите фоновое изображение. [button setBackgroundImage:[UIImage...]];

  • Добавьте кнопку UIImageView к своей кнопке.

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

[button addSubView:img];

Ответ 7

У меня была такая же проблема. На моем раскадровке у меня была кнопка без изображения.

Тогда я бы присвоил изображение в коде.

Появилась IOS 7, и у меня появилось много синих изображений.

Разрешение было простым, но сбивающим с толку. Если я назначу любое изображение на раскадровке, а затем изменим изображение во время выполнения, он отлично работает.

Вы всегда должны указывать начальный образ на раскадровке, даже если вы не собираетесь его использовать.

Ответ 8

Это сработало для меня

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

Примечание. Перед этим удалите переднее изображение.

Ответ 9

Ни одно из этих решений не работало для меня. Если вы не установите начальное изображение в Storyboard, вы все равно можете изменить изображение кнопки, используя setBackgroundImage.

Для вашего примера требуется только незначительное изменение.

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

Ответ 10

Эта проблема называется проблемой цветного цвета кнопки в xcode. Когда мы делаем кнопку по коду, кнопка по умолчанию показывает синий цвет оттенка. Это можно решить, назначив цвет оттенков черному или белым в соответствии с цветом вашей ячейки. Код:

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

Ответ 11

Старый поток, но я хотел вмешаться, потому что у меня была та же самая проблема. Проблема была в том, что вы вызываете setImage, когда вам нужно вызвать setBackgroundImage.

Ответ 12

Используя Xcode 9.2, ни одно из вышеперечисленных решений не сработало для того, что я искал.

Я искал решение, которое позволит мне установить .normal и .selected UIControlState изображения внутри раскадровки для их первоначального режима рендеринга, но, внутри Swift файл, не строковые литералы не должны существовать в отношении названий изображений.

В основном, внутри вашего кода вы получите изображение, которое вы установите в раскадровку для .normal состояния и повторного представления в виде .alwaysOriginal ( то же самое для .selected состояния), то вы установите этот образ (который теперь показан как оригинал и не будет зависеть от оттенка) для соответствующего государства (.normal и .selected) вашего UIButton.

Вот:

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

Таким образом, вы можете установить состояние изображения кнопки, и если имя изображения изменится, это не повлияет на ваш код.

Ответ 13

для меня работает цвет оттенка как clearcolor для всех четырех состояний (Default, Highlighted, selected, disabled).

Ответ 14

В Swift 4, инициализируйте вашу UIButton и назначьте ваши данные изображения следующим образом:

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