2012-05-25 9 views
12

Zrobiłem samouczek na moim blogu, więc wiem, jak zrobić rozciągliwy przycisk, który może wyświetlać dolny (stos) tytuł kontrolera viewcontroller. Ale miałem nadzieję, że mam ikony (jak dom dla DOMU) i bez tekstu i nie będę zmieniać rozmiaru.iOS 5: W jaki sposób zaimplementować niestandardowy przycisk powrotu (obrazu)?

Korzystając z mojego niestandardowego obrazu i poniższego kodu, otrzymuję rozciągniętą wersję (nie jest wymagana) z tytułem nad górną częścią (nie jest wymagana) i po kliknięciu (jest dobra) ma zabarwienie/podświetlenie;

UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

screen shot 1

Teraz Rozglądałem się tu i czytać wszystkie podobne pytania, na które zwracają stare odpowiedzi i mają dziwne wyniki dla mnie. Oto kod, który wypróbowałem;

UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"]; 
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStyleBordered target:nil action:nil]; 
    self.navigationItem.backBarButtonItem = backButton; 

Ta metoda nie wyciągnę przycisku niestandardowego obrazu (to dobrze), ani też nie pokazuje tekstu (co chcę) jednak wciąż jest oryginalny niebieski przycisk pod nim (WTF), a mój zwyczaj przycisk nie odcień po kliknięciu, tylko niebieski przycisk pod nim działa!

screen shot 2

Proszę o pomoc, co mi brakuje?

* UPDATE

Naprawiłem to trochę stosując zmienny rozmiar obrazu. To zmusza go, aby nie „odcinku”

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

Aby rozwiązać ten tytuł pokazujący się na przycisku musiałem zrobić

self.title [email protected]" "; 

Teraz jest trochę brudny fix ale wydaje się działać . Jedynym problemem, który pozostało, jest to, że chcę mieć inny przycisk wstecz w różnych widokach, a ta metoda powoduje pewne problemy; ostatni widok, który ustawia przycisk over-rides wszystkich innych widoków. Ostatecznie, w zależności od sposobu poruszania się po aplikacji, powrót do poprzedniego widoku ma niewłaściwy przycisk powrotu i nigdy nie jest resetowany do prawidłowego.


UPDATE 2: Potencjał IDEA:

Czy dodaje się być rozsądnym rozwiązaniem, czy też jest to hack, który jest odpowiedzialny złamać coś?

Ukrywanie domyślny przycisk Wstecz, jak tak,

[self.navigationItem setHidesBackButton:YES animated:NO]; 

... a następnie przy użyciu niestandardowego UIBarButtonItem, z przyciskiem w stylu I rzeczywiście chcesz umieścić w położeniu przycisku tyłu, który wysyła komunikat popViewControllerAnimated: do UINavigationController po dotknięciu.

Jeśli znasz bardziej niezawodne rozwiązanie, proszę podziel się, dziękuję.

+0

Nie możesz po prostu zmienić go z Inspektora atrybutów? – nemesis

+0

Chciałbym wiedzieć, w jaki sposób ... Wybrałem pierwszy kontroler widoku w scenorysie, potem poszedłem do inspektora atrybutów i rzeczywiście widzę pudełko pod elementem nawigacyjnym, który mówi przycisk wstecz, jednak nie mam pojęcia, jak tego użyć; Próbowałem wpisywać nazwę obrazu, ale wydaje się, że nic nie robi. Jakieś sugestie? – RobDigital

+0

Istnieje inne podejście do rozwiązania tego problemu - możesz przeciągnąć ogólny przycisk na pasek nawigacji, a następnie odtwarzać niestandardowe obrazy i nazwy. Mam nadzieję, że to ci pomoże! – nemesis

Odpowiedz

13

Zakładając, że obecne rozwiązanie

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

jest do zaakceptowania dla Ciebie, więc jedynym problemem pozostaje to, jak zaktualizować ten przycisk appeareance gdy idziesz tam iz powrotem między widokami, podejście, które może pracować realizuje powyższy kod w każdym viewWillAppear: metody kontrolerów:

- (void)viewWillAppear:(BOOL)animated { 
    UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
} 

Jeśli nie jesteś zadowolony z obecnego podejścia do posiadania zwyczaj UIBarButtonItem, droga jest inicjowanie paska pozycję przycisk z initWithCustomView:. W tym przypadku, można określić, na przykład, do UIImageView z obrazem chcesz i to powinno działać:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:[UIImageView ...]]; 

nadzieję, że to pomaga.

9

Na iOS 5+ używać [[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"someimage.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault].

+0

Tak jak napisałem wcześniej, właśnie to już wypróbowałem i otrzymałem wersję rozciągniętą (nie chciałam) z tytułem nad topem (nie chciałam). – RobDigital

+1

Twój obraz musi mieć taką samą wysokość/szerokość jak Apple. Możesz również utworzyć obraz skalowalny za pomocą '[[UIImage imageNamed: @" someimage.png "] resizableImageWithCapInsets: UIEdgeInsetsMake (6, 6, 6, 6)]'. Rzeczywisty obraz musi mieć taką samą wysokość jak Apple, ale szerokość powinna być tylko tak duża, jak jest to konieczne, aby dopasować lewy i prawy czepek + 1 piksel w środku, który zostanie rozciągnięty programowo w celu dopasowania do tekstu. –

+2

Dzięki za sugestię Andrew, jednak nie rozwiązałeś głównego problemu posiadania różnych niestandardowych przycisków wstecz w każdym widoku z różnymi obrazami i ŻADNYM TEKSTEM. – RobDigital

0

Jeśli używasz deski historia, jego zbyt łatwe. weź okrągły prostokątny przycisk i umieść go na pasku nawigacyjnym. następnie kliknij dwukrotnie przycisk (po wybraniu, po pierwsze, pokazuje tylko atrybuty przycisku paska, ale wybierając dwa razy, możesz zmienić wszystkie jego właściwości tak, jakbyś dostosowywał zwykły przycisk UI).

0

UIAppearance ma zastosowanie w tym przypadku.

Próbowałem użyć: - [UIBarButtonItem initWithCustomView:]. Widok tutaj umożliwia dodanie obrazu tła i tytułu, niezależnie od tego, co chcesz.

3

Niektóre kod użyłem w projekcie:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *btnImg = [UIImage imageNamed:@"ButtonRetourInactive"]; 
[btn setImage:btnImg forState:UIControlStateNormal]; 

btn.frame = CGRectMake(0, 0, btnImg.size.width, btnImg.size.height); 
[btn addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside]; 
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease]; 

Uwaga, to działa na iOS 4 i 3 również.

Powiązane problemy