it-swarm.com.de

Ändern Sie die Breite eines UIBarButtonItem in einer UINavigationBar

Ich erstelle ein UIBarButtonItem und füge es wie folgt meiner Navigationsleiste hinzu:

(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 korrekt aus, wenn ich ausgeführt werde, aber ich kann das Element der Schaltflächenschaltfläche durch Tippen auf die Navigationsleiste von x = 0 bis ungefähr 100 auswählen. Wie kann ich den auswählbaren Bereich auf eine Breite von 30 px einstellen?

16
Darren

Ein Ansatz, den Sie in Betracht ziehen könnten, ist das Erstellen einer UIBarButtonItem durch Aufrufen von initWithCustomView:. Dies ist nicht ideal, da Sie nicht "ausgewählte" Zustände aus der Box bekommen UND Sie müssen den umrandeten Hintergrund (falls gewünscht) mit Ihrem Schaltflächenbild kombinieren, aber damit können Sie direkt einen Rahmen für Ihr Bild angeben Symbolleistenelement. Wenn Sie Text für Ihren Titel anstelle von Bildern verwenden, müssen Sie möglicherweise noch ein Hintergrundbild als Unteransicht hinzufügen. Jedenfalls habe ich jetzt das gleiche Problem 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;

Im Moment ist dies die einzige Möglichkeit, die automatische Größenanpassung der UIBarButtonItems einzuschränken, die der UINavigationControllernavigationItem hinzugefügt wird.

Oder versuchen Sie es mit Maggies Lösung, die gründlicher ist als meine .

12
Aaron

Seit iOS 11 funktioniert das Festlegen von Frame für customView und nicht für UIBarButtonItem nicht (wie in akzeptierte Antwort vorgeschlagen). Es scheint, als würde das Hinzufügen von Autolayout zu UIBarButtonItem den gesetzten Frame überschreiben . Dieser Beitrag gab mir die Idee:

navigationItem.leftBarButtonItem?.customView = yourCustomButtonView
let desiredWidth = 35.0
let desiredHeight = 35.0

let widthConstraint = NSLayoutConstraint(item: yourCustomButtonView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: desiredWidth)
let heightConstraint = NSLayoutConstraint(item: yourCustomButtonView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: desiredHeight)

yourCustomButtonView.addConstraints([widthConstraint, heightConstraint])

Beachten Sie auch, dass Sie vorzugsweise UIButton als CustomView verwenden, da Sie sich darauf verlassen müssen, um die Aktion auszulösen.

13
roxanneM

Sie können dies tun, indem Sie ein Bild aus dem Interface-Builder in das Schaltflächenelement einfügen und die Breite der benutzerdefinierten Ansicht mit diesem Code ändern:

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

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

Der Code lautet daher:

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

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

[myNavigationBar setNeedsLayout];

All dies ist selbstverständlich, dass das Layout mit Auto-Sizing und Frames erstellt wird. Einbrüche in Navigationsleisten mit automatischem Layout führten zu keinem Erfolg. Siehe meine Frage Automatisches Layout mit UINavigationBar und UIBarButtonItem

Sorry, ich habe gerade festgestellt, dass mein Code fast identisch mit @oscartzombie ist. Nicht absichtlich! Ich lasse diese Antwort, da ich denke, dass es sich lohnt, das Layout und andere Punkte hinzuzufügen, und nicht nur den Interface Bulder oder die Bilder speziell zu erklären.

5
Max MacLeod

Der folgende Ansatz hat funktioniert. Siehe Code zum Ändern der Breite und Höhe der Schaltfläche sowie 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 die Aktion von UIBarButtonItem gelten nicht für die Bildansicht

5
Abdullah Saeed

Keine dieser Lösungen hat für mich funktioniert, und ich finde heraus, dass die automatische Größenanpassung die von Ihnen in Code geschriebenen Maße überschreibt.

nach dem Erstellen der Schaltfläche auf UIButton-Weise schreiben Sie den folgenden Codeblock:

[self.navigationItem.rightBarButtonItem.customView.widthAnchor constraintEqualToConstant:mWidth].active = YES;
[self.navigationItem.rightBarButtonItem.customView.heightAnchor constraintEqualToConstant:mHeight].active = YES;
0
ACAkgul