it-swarm.com.ru

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

155
user2665539

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

Проверьте файл .xib и измените тип кнопки на Пользовательский Look at the image

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

[UIButton buttonWithType:UIButtonTypeSystem]; 
368
Chamira Fernando

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

53
user3099609

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

21
Mick MacCallum

Свифт 3:

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

Для Свифта:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
9
Esqarrouth

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

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

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

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

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

[button addSubView:img];

8
DrDisc

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

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

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

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

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

6
Ryan Heitner

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

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

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

2
datha

Используя Xcode 9.2, ни одно из вышеперечисленных решений не сработало для того, что я искал.

Я искал решение, которое позволило бы мне устанавливать изображения .normal и .selectedUIControlState внутри раскадровки для их исходного режима рендеринга , но внутри файла 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
OhadM

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

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

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

1
Rob Schlackman

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

0
Rajashekar

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

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
0
xscoder