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


Чи відображається зображення при натисканні кнопки?
JustAbodyCoder

Відповіді:


378

В iOS7 є новий тип кнопки під назвою UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // стандартна системна кнопка

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

Щоб це зробити програмно, додайте цей рядок до viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 

2
[Кнопка UIButtonWithType: UIButtonTypeSystem];
avuthless

57
Зауважте, що це рішення видаляє системний колір відтінку, але також призводить до жорсткого переходу між виділеним та нормальним станами. Якщо ви хочете зберегти системну поведінку, анімацію тощо, але хочете позбутися відтінку кольору, спробуйте [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(для типу кнопки встановлено значення "Система" в IB).
JWK

Спасибі це було дуже корисно. У нашому випадку кнопка навіть була обрізана до форми прозорого PNG, а потім тонізувалася.
g_pass

Гезм, вони сховали, що одного колодязя чи не так ?!
Maury Markowitz

це працює :) u може бути якась інша проблема в ур-коді. Якщо ви подивитесь на Xcode 6.1, ви чітко бачите доступні варіанти ..
Chamira Fernando

53

Здається, iOS 7 використовує зображення, що надається як маска Alpha, для відображення кольору відтінку кнопки. Зміна типу кнопки 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.