2012-06-11 8 views
13

Ich bin ein UIBarButtonItem Erstellen und Hinzufügen es bar zu meiner Navigation wie so:ändern Breite eines UIBarButtonItem in einem 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; 
} 

Es sieht richtig, wenn ich laufen, aber ich kann die Bar-Taste Element auswählen durch Antippen die Navigationsleiste irgendwo zwischen x = 0 und ungefähr 100. Wie kann ich den auswählbaren Bereich auf eine Breite von 30 px einstellen?

+2

Ich fürchte, ich glaube nicht, dass es eine Möglichkeit ist, den auswählbaren Bereich einzustellen. Eine Frage, warum möchten Sie die Breite 30 px haben? Gemäß der Richtlinie für menschliche Benutzerschnittstellen von iOS beträgt die komfortable Mindestgröße für tappbare Benutzeroberflächenelemente 44 x 44 Punkte. http://developer.apple.com/bibliothek/ios/# documentation/UserExperience/Konzeptionelle/MobileHIG/Eigenschaften/Characteristics.html –

+0

Hmm, ok danke für den Link zu den Richtlinien. Es erscheint ein bisschen seltsam, dass der auswählbare Bereich so breit ist. – Darren

+0

@AbdSaniAbdJalal können wir die Breite von 'barbuttonitem' im Storyboard ändern? – aircraft

Antwort

12

Darren,

Ein Ansatz, den Sie sich anschauen sollten ist die Schaffung eines UIBarButtonItem von initWithCustomView aufrufen. Dies ist nicht ideal, da Sie "ausgewählte" Zustände nicht sofort aus der Box herausnehmen UND Ihren Rahmenhintergrund (falls gewünscht) mit Ihrem Schaltflächenbild kombinieren möchten, aber damit können Sie einen Rahmen für Ihren Symbolleistenelement Wenn Sie anstelle von Bildern Text für Ihren Titel verwenden, müssen Sie möglicherweise noch ein Hintergrundbild als Unteransicht hinzufügen. Wie auch immer, ich habe das gleiche Problem jetzt und dieser Code funktioniert für mich:

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; 

Gerade jetzt ist dies der einzige Weg, ich kenne die Auto-Dimensionierung der UIBarButtonItems die Beschränkung auf die navigationItem der UINavigationController hinzugefügt .

[EDITED]

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

+2

funktionierte nur, wenn ich "UIButton" als customView verwendet, und nicht "UIImageView" – Kreutzer

+1

diese Lösung wird nicht funktionieren, da es keine Schaltflächenaktionen überhaupt hat. Verwenden Sie stattdessen "UIButton". – Raptor

6

Sie können es tun, indem sie ein Bild an dem Bar-Taste Element aus dem Interface Builder fallen und die Breite der benutzerdefinierten Ansicht mit diesem Code zu ändern:

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

Das Wichtigste dabei ist, dass Sie zu erkennen, ändern die Breite der benutzerdefinierten Ansicht und nicht die UIBarButton selbst. daher

Der Code ist:

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

Sie werden auch die Layoutänderung auslösen müssen:

[myNavigationBar setNeedsLayout]; 

All dies ist selbstverständlich, dass das Layout mit Auto Sizing und Rahmen durchgeführt wird. Einbrüche in Navigationsleisten mit Auto Layout führten zu keinem Erfolg. Siehe meine Frage Auto Layout with UINavigationBar and UIBarButtonItem.

Entschuldigung gerade festgestellt, dass mein Code fast identisch mit @oscartzombie ist. Nicht beabsichtigt! Ich werde diese Antwort verlassen, da ich denke, es lohnt sich, das Layout und andere Punkte hinzuzufügen, zusätzlich zu erklären, ohne Bezug auf Interface Bulder oder Bilder speziell.

+0

Ich hatte Probleme mit der Größe meiner benutzerdefinierten UIBarButtonItem, die Lösung rief '[self.navigationController.navigationBar setNeedsLayout];' in meiner Ansicht Controller '- (void) viewDidLoad' Methode. – LunaCodeGirl

5

Der folgende Ansatz funktioniert, siehe Code zum Ändern der Breite und Höhe der Schaltfläche und zum Hinzufügen von Aktionselementen.

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; 

Hinweis: Das Ziel und Wirkung des UIBarButtonItem gilt nicht für Bildansicht