2012-06-11 8 views
13

Tworzę UIBarButtonItem i dodanie go do mojego paska nawigacyjnego tak:Zmień szerokość UIBarButtonItem w UINavigationBar

(void)viewDidLoad { 

    ... 

    // Add the refresh button to the navigation bar 
    UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [refreshButton setFrame:CGRectMake(0,0,30,30)]; 
    [refreshButton setImage:[UIImage imageNamed:@"G_refresh_icon.png"] forState:UIControlStateNormal]; 
    [refreshButton addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *refreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:refreshButton] autorelease]; 
    self.navigationItem.leftBarButtonItem = refreshBarButton; 
} 

Wygląda poprawne kiedy biegnę, ale mogę wybrać pozycję przycisk paska dotykając pasek nawigacji w dowolnym miejscu od x = 0 do około 100. Jak mogę dostosować obszar do wyboru tak, aby miał szerokość 30 pikseli?

+2

Obawiam się, że nie sądzę, istnieje sposób, aby dostosować obszar selekcyjny. Pytanie jednak, dlaczego miałbyś mieć szerokość 30 px? Wytyczne dla interfejsu użytkownika interfejsu iOS określają, że wygodny minimalny rozmiar elementów interfejsu UI to 44 x 44 punkty. http://developer.apple.com/library/ios/# documentation/UserExperience/Conceptual/MobileHIG/Characteristics/Characteristics.html –

+0

Hmm, ok, dzięki za link do wytycznych. Wydaje się nieco dziwne, że obszar do wyboru jest tak szeroki. – Darren

+0

@AbdSaniAbdJalal możemy zmienić szerokość 'barbuttonitem' w storybooku? – aircraft

Odpowiedz

12

Darren,

Jedno podejście można rozważyć jest stworzenie UIBarButtonItem wywołując initWithCustomView. Nie jest to idealne rozwiązanie, ponieważ nie pojawiają się "wybrane" stany poza polem ORAZ trzeba skomponować tło z obramowaniem (jeśli chcesz, aby wyglądać) z obrazem przycisku, ale dzięki temu możesz bardziej bezpośrednio określić ramkę element paska narzędzi. Jeśli używasz tekstu do tytułu zamiast zdjęć, nadal możesz potrzebować dodać obraz tła jako podgląd. W każdym razie, mam ten sam problem teraz i ten kod działa dla mnie:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"button-image.png"]]; 
imageView.frame = CGRectMake(0, 0, 43, 30); 

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageView]; 

self.navigationItem.leftBarButtonItem = barButtonItem; 

Teraz jest to jedyny sposób, znam ograniczenie automatycznego zaklejanie z UIBarButtonItems dodany do UINavigationController za navigationItem .

[edited]

Albo try Maggie's solution, which is more thorough than mine.

+2

działa tylko wtedy, gdy użyłem 'UIButton' jako customView, a nie' UIImageView' – Kreutzer

+1

to rozwiązanie nie będzie działało, ponieważ nie ma w ogóle żadnych akcji przycisków. Zamiast tego użyj 'UIButton'. – Raptor

6

Można to zrobić przez upuszczenie obrazu do pozycji przycisk paska z konstruktora interfejsu i zmieniając szerokość niestandardowego widoku z tym kodem:

CGRect frame = self.navigationItem.leftBarButtonItem.customView.frame; 
frame.size.width = 141; 
self.navigationItem.leftBarButtonItem.customView.frame = frame; 
5

Kluczową rzeczą na tym, aby uświadomić sobie, że zmieniają szerokość niestandardowego widoku, a nie samą UIBarButton.

Kod jest zatem:

CGRect resizedFrame = myBarButtonItem.customView.frame; 
resizedFrame.size.width = myNewWidth; 
myBarButtonItem.customView.frame = resizedFrame; 

Potrzebny będzie również powodować zmianę układu:

[myNavigationBar setNeedsLayout]; 

Wszystko to oczywiste, że układ jest wykonywana z automatycznym doborem i ramek. Napady na paski nawigacji z automatycznym układem nie przyniosły sukcesu. Zobacz moje pytanie Auto Layout with UINavigationBar and UIBarButtonItem.

Niestety, zdałem sobie sprawę, że mój kod jest prawie identyczny z @ scalartzombie. Nie celowe! Zostawię tę odpowiedź, ponieważ myślę, że warto dodać układ i inne punkty, oprócz wyjaśnienia bez odniesienia do interfejsu Bulder lub obrazów.

+0

Miałem problemy z rozmiarem mojego niestandardowego UIBarButtonItem, rozwiązanie nazywało '[self.navigationController.navigationBar setNeedsLayout];' w metodzie '- (void) viewDidLoad' kontrolera mojego widoku. – LunaCodeGirl

5

Następujące podejście zadziałało, zobacz kod, aby zmienić szerokość i wysokość przycisku, a także dodać element działania.

UIButton *imageButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 22, 22)]; 
[imageButton setBackgroundImage:[UIImage imageNamed:@"message_button"] forState:UIControlStateNormal]; 
[imageButton addTarget:self action:@selector(messageButtonTapped) forControlEvents:UIControlEventAllEvents]; 
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageButton]; 
self.navigationItem.leftBarButtonItem = leftBarButtonItem; 

Uwaga: cel i działanie UIBarButtonItem nie stosuje się do widoku obrazu