Установка изображения 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)