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


163

В 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 это не работает. Кнопка не содержит изображение. Кнопка заполнена синим цветом.


Изображение появляется при нажатии кнопки?
JustAnotherCoder

Ответы:


378

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

Проверьте файл .xib и измените тип кнопки на Пользовательский Посмотрите на изображение

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

[UIButton buttonWithType:UIButtonTypeSystem]; 

2
[UIButton buttonWithType: UIButtonTypeSystem];
безжалостно

57
Обратите внимание, что это решение удаляет оттенок системы, но также приводит к сложному переходу между выделенным и нормальным состояниями. Если вы хотите сохранить поведение системы, анимацию и т. Д., Но хотите избавиться от цвета оттенка, попробуйте [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(с типом кнопки, установленным в «Система» в IB).
JWK

Спасибо, это было очень полезно. В нашем случае кнопка даже обрезала форму прозрачного PNG и затем тонировала.
g_pass

Боже, они спрятали это хорошо, не так ли ?!
Мори Марковиц

это работает :) у вас может быть другая проблема в вашем коде. Если вы посмотрите на Xcode 6.1, вы можете четко увидеть доступные варианты ..
Chamira Fernando

53

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


Спасибо! Оригинальный пользователь забыл принять его как ответ.
Джигзат

это работает для меня, но переход на систему не работает для моего случая, спасибо всем за ваш вклад
chings228

29

Свифт 3, 4, 5:

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

24

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


9

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

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

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

  3. Добавьте UIImageView к вашей кнопке.

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

[button addSubView:img];



6

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

Я бы тогда назначил изображение в коде.

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

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

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


3

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

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

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


как убрать фоновое изображение пожалуйста !!
simbesi.com

3

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


1

Ни одно из данных решений не помогло мне. Если вы не установите исходное изображение в раскадровке, вы все равно можете изменить изображение кнопки с помощью 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];

1

Эта проблема называется проблемой синего цвета кнопки в 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];

это очень полезно @Shane
Рудра

1

Используя 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)

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


1

В iOS 13 - просто установите для свойства Tint значение White, сохраняя тип UIButton как Custom


0

создание цвета оттенка в качестве прозрачного цвета для всех четырех состояний (по умолчанию, выделено, выбрано, отключено) работало для меня.


-1

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

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.