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

user2665539
источник
Изображение появляется при нажатии кнопки?
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!). Установка изображения в качестве фона не всегда работает, если у вас уже есть фоновое изображение, как было в моем случае.

user3099609
источник
Спасибо! Оригинальный пользователь забыл принять его как ответ.
Джигзат
это работает для меня, но переход на систему не работает для моего случая, спасибо всем за ваш вклад
chings228
29

Свифт 3, 4, 5:

let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)
Wilson
источник
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];

DrDisc
источник
9

Для быстрой:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
Esqarrouth
источник
6

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

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

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

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

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

Райан Хайтнер
источник
3

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

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

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

Datha
источник
как убрать фоновое изображение пожалуйста !!
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];
Alex
источник
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)

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

OhadM
источник
1

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

rommex
источник
0

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

Rajashekar
источник
-1

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

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Фрэнк Ино
источник