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.


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

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.


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)

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


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


9

Dla szybkiego:

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

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ć.


3

To zadziałało dla mnie

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

Uwaga: usuń przedni obraz zanim to zrobisz.


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.


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

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

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.


1

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


0

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


-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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.