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