Das Festlegen des UIButton-Bilds führt in iOS 7 zu einer blauen Schaltfläche

163

Unter iOS 6 SDK habe ich die folgenden Codezeilen geschrieben, um ein Bild in einer Schaltfläche anzuzeigen:

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];

Aber jetzt mit Xcode 5 und iOS 7 funktioniert das nicht. Die Schaltfläche enthält das Bild nicht. Die Schaltfläche ist mit blauer Farbe gefüllt.

user2665539
quelle
Wird das Bild angezeigt, wenn Sie auf die Schaltfläche klicken?
JustAnotherCoder

Antworten:

378

In iOS7 gibt es einen neuen Schaltflächentyp namens UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // Standard-Systemschaltfläche

Überprüfen Sie Ihre .xib-Datei und ändern Sie den Schaltflächentyp in Benutzerdefiniert Schau dir das Bild an

Fügen Sie dazu programmgesteuert folgende Zeile hinzu viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 
Chamira Fernando
quelle
2
[UIButton buttonWithType: UIButtonTypeSystem];
Avuthless
57
Beachten Sie, dass diese Lösung zwar die Systemtönungsfarbe entfernt, aber auch zu einem harten Übergang zwischen dem hervorgehobenen und dem normalen Zustand führt. Wenn Sie das Systemverhalten, Animationen usw. beibehalten möchten, aber die Farbtonfarbe entfernen möchten, versuchen Sie es [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(wobei der Schaltflächentyp in IB auf "System" eingestellt ist).
JWK
Danke das war sehr hilfreich. In unserem Fall wurde der Knopf sogar an die Form des transparenten PNG angepasst und dann getönt.
g_pass
Meine Güte, sie haben das gut versteckt, nicht wahr?!
Maury Markowitz
es funktioniert :) u könnte ein anderes Problem in Ihrem Code haben. Wenn Sie sich Xcode 6.1 ansehen, sehen Sie deutlich die verfügbaren Optionen.
Chamira Fernando
53

Es scheint, dass iOS 7 das bereitgestellte Bild nur als Alpha-Maske zur Anzeige der Farbtonfarbe der Schaltfläche verwendet. Das Ändern des Schaltflächentyps UIButtonTypeCustomhat den Trick für mich erledigt (danke user716216!). Das Einstellen des Bildes als Hintergrund funktioniert nicht immer, wenn Sie bereits ein Hintergrundbild haben, wie es in meinem Fall der Fall war.

user3099609
quelle
Danke dir! Der ursprüngliche Benutzer hat vergessen, dies als Antwort zu akzeptieren.
Jigzat
es funktioniert für mich, aber ein Systemwechsel funktioniert für meinen Fall nicht, danke für all Ihren Beitrag
chings228
29

Swift 3, 4, 5:

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

Es besteht eine gute Chance, dass das Bild vorhanden ist und Sie es einfach nicht sehen können. Versuchen Sie, den Typ der Schaltfläche in zu ändern UIButtonTypeCustom. Wenn dies nicht funktioniert, stellen Sie die Hintergrundfarbe der Schaltfläche auf ein[UIColor clearColor];

Mick MacCallum
quelle
9

Das Problem ist die TintColor. Standardmäßig wirft iOS über jede Schaltfläche eine blaue Tönungsfarbe. Sie können es auf drei Arten umgehen.

  1. Ändern Sie die Farbtonfarbe. [button setTintColor:[UIColor blackColor]]; Dies kann Ihr Bild auf eine Weise färben, die Sie nicht möchten.

  2. Stellen Sie wie die meisten anderen Vorschläge das Hintergrundbild ein. [button setBackgroundImage:[UIImage...]];

  3. Fügen Sie Ihrer Schaltfläche eine UIImageView hinzu.

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

[button addSubView:img];

DrDisc
quelle
9

Für schnell:

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

Ich hatte das gleiche Problem. Auf meinem Storyboard hatte ich einen Knopf ohne Bild.

Ich würde dann das Bild im Code zuweisen.

IOS 7 kam und ich bekam viele blaue Bilder.

Die Auflösung war einfach, aber verwirrend. Wenn ich ein Bild im Storyboard zuweise und es dann zur Laufzeit ändere, funktioniert es einwandfrei.

Sie müssen immer ein Startbild im Storyboard angeben, auch wenn Sie es nicht verwenden möchten.

Ryan Heitner
quelle
3

Das hat bei mir funktioniert

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

Hinweis: Entfernen Sie vorher das Frontbild.

datha
quelle
wie man Hintergrundbild bitte entfernt !!
simbesi.com
3

Alter Thread, aber ich wollte mich einschalten, weil ich nur das gleiche Problem hatte. Das Problem war nur, dass Sie setImage aufrufen, wenn Sie setBackgroundImage aufrufen sollten.

Rob Schlackman
quelle
1

Keine der angegebenen Lösungen funktionierte für mich. Wenn Sie im Storyboard kein erstes Bild festlegen, können Sie das Bild der Schaltfläche dennoch mithilfe von ändern setBackgroundImage.

Für Ihr Beispiel ist nur eine geringfügige Änderung erforderlich.

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
quelle
1

Dieses Problem wird als blaues Farbproblem der Schaltfläche in xcode bezeichnet. Wenn wir eine Schaltfläche per Code erstellen, zeigt die Schaltfläche standardmäßig die blaue Tönungsfarbe an. Dies kann gelöst werden, indem Schwarz oder Weiß entsprechend der Farbe Ihrer Zelle eine Tönungsfarbe zugewiesen wird. Der Code lautet:

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
quelle
Es ist ziemlich hilfreich @Shane
Rudra
1

Mit Xcode 9.2 funktionierte keine der oben genannten Lösungen für das, was ich suchte.

Ich war auf der Suche nach einer Lösung , die ich eingestellt werden lassen .normalund im .selected UIControlStateInnern des Storyboard für ihre Bilder ursprünglichen Wiedergabe - Modus , aber innerhalb der Swift - Datei sollten keine Stringliterale in Bezug auf die Bildnamen existieren.

Grundsätzlich erhalten Sie in Ihrem Code das Bild, das Sie in Ihrem Storyboard für den .normalStatus festgelegt haben, und rendern es erneut als .alwaysOriginal(Gleiches für den .selectedStatus). Anschließend legen Sie das Bild fest (das jetzt als Original gerendert wird und von dem es nicht betroffen ist) den Farbton) für den relevanten Zustand ( .normalund .selected) Ihres UIButton.

Hier ist es:

// 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)

Auf diese Weise können Sie den Bildstatus Ihrer Schaltfläche festlegen. Wenn sich der Bildname ändert, wirkt sich dies nicht auf Ihren Code aus.

OhadM
quelle
1

Setzen Sie in iOS 13 die Tint-Eigenschaft einfach auf Weiß, während Sie den Typ des UIButton als Benutzerdefiniert beibehalten

rommex
quelle
0

Das Erstellen der Farbtonfarbe als Klarfarbe für alle vier Zustände (Standard, Hervorgehoben, Ausgewählt, Deaktiviert) hat bei mir funktioniert.

Rajashekar
quelle
-1

Initialisieren Sie in Swift 4 Ihre UIButtonBilddaten und weisen Sie sie wie folgt zu:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Frank Eno
quelle