Ustawienie obrazu UIButton powoduje wyświetlenie niebieskiego przycisku w iOS 7

163

Na iOS 6 SDK napisałem następujące wiersze kodu, aby wyświetlić obraz w przycisku:

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

Ale teraz z Xcode 5 i iOS 7 to nie działa. Przycisk nie zawiera obrazu. Przycisk jest wypełniony kolorem niebieskim.

user2665539
źródło
Czy obraz pojawia się po kliknięciu przycisku?
JustAnotherCoder

Odpowiedzi:

378

W iOS7 pojawił się nowy typ przycisku o nazwie UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS (7_0), // standardowy przycisk systemowy

Sprawdź plik .xib i zmień typ przycisku na Niestandardowy Spójrz na obraz

Aby zrobić to programowo, dodaj ten wiersz do viewDidLoad:

[UIButton buttonWithType:UIButtonTypeSystem]; 
Chamira Fernando
źródło
2
[UIButton buttonWithType: UIButtonTypeSystem];
bezlitosny
57
Zwróć uwagę, że to rozwiązanie usuwa zabarwienie systemu, ale także powoduje twarde przejście między stanem podświetlonym i normalnym. Jeśli chcesz zachować zachowanie systemu, animacje itp., Ale chcesz pozbyć się koloru odcienia, spróbuj [myUIButton setImage: [[UIImage imageNamed: @"myButtonImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] forState: UIControlStateNormal];(z typem przycisku ustawionym na „System” w IB).
JWK,
Dzięki temu było to bardzo pomocne. W naszym przypadku przycisk przycinał się nawet do kształtu przezroczystego PNG, a następnie przyciemniał.
g_pass
Rany, dobrze go ukryli, prawda ?!
Maury Markowitz
to działa :) u może mieć inny problem w kodzie ur. Jeśli spojrzysz na Xcode 6.1, możesz wyraźnie zobaczyć dostępne opcje ..
Chamira Fernando
53

Wygląda na to, że iOS 7 używa obrazu dostarczonego tylko jako maski alfa do wyświetlania koloru odcienia przycisku. Zmiana typu przycisku, aby UIButtonTypeCustomzałatwić sprawę (dzięki user716216!). Ustawienie obrazu jako tła nie zawsze działa, jeśli masz już obraz tła, tak jak w moim przypadku.

user3099609
źródło
Dziękuję Ci! Oryginalny użytkownik zapomniał zaakceptować to jako odpowiedź.
jigzat
to działa dla mnie, ale zmiana na system nie działa w moim przypadku, dziękuję wszystkim za wkład
chings228
29

Swift 3, 4, 5:

let image = UIImage(named: "my-image")
myButton.setImage(image.withRenderingMode(.alwaysOriginal), for: .normal)
Wilson
źródło
24

Jest duża szansa, że ​​obraz tam jest i po prostu go nie widać. Spróbuj zmienić typ przycisku na UIButtonTypeCustom. Jeśli to nie zadziała, ustaw kolor tła przycisku na[UIColor clearColor];

Mick MacCallum
źródło
9

Problemem jest TintColor. Domyślnie iOS rzuca niebieski odcień na każdy przycisk. Możesz obejść to na 3 sposoby.

  1. Zmień kolor odcienia. [button setTintColor:[UIColor blackColor]]; Może to pokolorować Twój obraz w sposób, w jaki nie chcesz.

  2. Jak większość sugerowała, ustaw obraz tła. [button setBackgroundImage:[UIImage...]];

  3. Dodaj UIImageView do swojego przycisku.

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

[button addSubView:img];

DrDisc
źródło
9

Dla szybkiego:

    let aButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
Esqarrouth
źródło
6

Miałem ten sam problem. Na moim storyboardzie miałem przycisk bez obrazu.

Następnie przypisałbym obraz w kodzie.

Pojawił się IOS 7 i otrzymałem dużo niebieskich obrazów.

Rozwiązanie było proste, ale zagmatwane. Jeśli przypiszę dowolny obraz w serii ujęć, a następnie zmienię obraz w czasie wykonywania, działa dobrze.

Zawsze musisz określić obraz początkowy w serii ujęć, nawet jeśli nie zamierzasz go używać.

Ryan Heitner
źródło
3

To zadziałało dla mnie

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

Uwaga: usuń przedni obraz zanim to zrobisz.

datha
źródło
jak usunąć obraz tła, proszę !!
simbesi.com,
3

Stary wątek, ale chciałem się wtrącić, ponieważ miałem ten sam problem. Problem polegał na tym, że wywołujesz setImage, kiedy powinieneś wywołać setBackgroundImage.

Rob Schlackman
źródło
1

Żadne z podanych rozwiązań nie działało dla mnie. Jeśli nie ustawisz obrazu początkowego w Storyboard, nadal możesz zmienić obraz przycisku za pomocą setBackgroundImage.

Na przykład potrzebna jest tylko niewielka zmiana.

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
źródło
1

Ten problem jest nazywany problemem niebieskiego koloru przycisku w xcode. Kiedy tworzymy przycisk po kodzie, przycisk domyślnie pokazuje niebieski odcień.Można to rozwiązać, przypisując kolor odcień do czerni lub bieli zgodnie z kolorem komórki. Kod to:

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
źródło
jego bardzo pomocne @Shane
Rudra
1

Używając Xcode 9.2 żadne z powyższych rozwiązań nie działało dla tego, czego szukałem.

Szukałem rozwiązania, które pozwoli mi ustawić .normali .selected UIControlStateobrazy wewnątrz scenorysu dla ich oryginalnego trybu renderowania , ale w pliku Swift nie powinny istnieć żadne literały ciągów dotyczące nazw obrazów.

Zasadniczo w kodzie otrzymasz obraz, który ustawisz w swojej serii ujęć dla .normalstanu i ponownie wyrenderujesz go jako .alwaysOriginal(Tak samo dla .selectedstanu), a następnie ustawisz ten obraz (który jest teraz renderowany jako oryginalny i nie będzie miał na niego wpływu odcień) dla odpowiedniego stanu ( .normali .selected) twojegoUIButton .

Oto ona:

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

W ten sposób możesz ustawić stany obrazu przycisku, a jeśli nazwa obrazu ulegnie zmianie, nie wpłynie to na kod.

OhadM
źródło
1

W iOS 13 - po prostu ustaw właściwość Tint na White, zachowując typ UIButton jako Custom

rommex
źródło
0

ustawienie koloru tinty jako clearcolor dla wszystkich czterech stanów (domyślny, podświetlony, wybrany, wyłączony) działało dla mnie.

Rajashekar
źródło
-1

W Swift 4 zainicjalizuj UIButtoni przypisz dane obrazu w następujący sposób:

let myButton = UIButton(type: .cutsom)
myButton.setImage(UIImage(data:myImageData), for: .normal)
Frank Eno
źródło