2012-06-11 10 views
13

Sto creando un UIBarButtonItem e aggiungendolo alla mia barra di navigazione in questo modo:Cambiamento larghezza di un UIBarButtonItem in un 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; 
} 

Sembra corretto quando corro, ma posso selezionare la voce pulsante della barra toccando la barra di navigazione ovunque da x = 0 a circa 100. Come posso regolare l'area selezionabile per avere una larghezza di 30 px?

+2

Temo di non credo che ci sia un modo per regolare l'area selezionabile. Una domanda però, perché vorresti che la larghezza fosse di 30 px? La linea guida per l'interfaccia umana di iOS afferma che la dimensione minima confortevole degli elementi dell'interfaccia utente toccabili è 44 x 44 punti. http://developer.apple.com/library/ios/# documentation/UserExperience/Conceptual/MobileHIG/Caratteristiche/Caratteristiche.html –

+0

Hmm, ok grazie per il collegamento alle linee guida. Sembra un po 'strano che l'area selezionabile sia così ampia. – Darren

+0

@AbdSaniAbdJalal possiamo cambiare la larghezza di 'barbuttonitem' nello storyboard? – aircraft

risposta

12

Darren,

Un approccio che si potrebbe prendere in considerazione è la creazione di un UIBarButtonItem chiamando initWithCustomView. Questo non è l'ideale in quanto non si ottengono gli stati "selezionati" fuori dalla scatola E si deve comporre lo sfondo con bordi (se si vuole quello sguardo) con l'immagine del pulsante, ma con questo è possibile specificare più direttamente una cornice per il proprio elemento della barra degli strumenti. Se stai utilizzando il testo per il tuo titolo anziché le immagini, potresti comunque aver bisogno di aggiungere un'immagine di sfondo sotto forma di sottoscheda. Ad ogni modo, sto avendo lo stesso problema in questo momento e questo codice funziona per me:

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; 

In questo momento questo è l'unico modo che conosco di limitare l'auto-dimensionamento dei UIBarButtonItems aggiunto al navigationItem del UINavigationController .

[Modificato]

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

+2

ha funzionato solo quando ho usato 'UIButton' come customView, e non' UIImageView' – Kreutzer

+1

questa soluzione non funzionerà in quanto non ha alcuna azione del pulsante. Usa invece 'UIButton'. – Raptor

6

Puoi farlo facendo cadere un'immagine alla voce pulsante della barra dal costruttore di interfaccia e cambiare la larghezza della visualizzazione personalizzata con questo codice:

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

La cosa fondamentale di questo è rendersi conto che si stanno cambiando la larghezza della vista personalizzata, anziché lo stesso UIBarButton.

Il codice è quindi:

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

Sarà inoltre necessario per innescare il cambiamento di layout:

[myNavigationBar setNeedsLayout]; 

Tutto questo va da sé che il layout è stato fatto con Auto Dimensionamento e cornici. Le incursioni nelle barre di navigazione con Auto Layout non hanno dato risultati. Vedi la mia domanda Auto Layout with UINavigationBar and UIBarButtonItem.

Mi dispiace ma ho capito che il mio codice è quasi identico a @oscartzombie. Non intenzionale! Lascerò questa risposta poiché penso valga la pena aggiungere il layout e altri punti, oltre a spiegare in modo specifico senza riferimento a Interface Bulder o alle immagini.

+0

Avevo problemi con la dimensione del mio UIBarButtonItem personalizzato, la soluzione stava chiamando '[self.navigationController.navigationBar setNeedsLayout];' nel mio metodo di visualizzazione '- (void) viewDidLoad'. – LunaCodeGirl

5

Il seguente approccio ha funzionato, vedere il codice per modificare la larghezza e l'altezza del pulsante e aggiungere elementi di azione.

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; 

Nota: L'obiettivo e l'azione della UIBarButtonItem non si applica per l'immagine

Problemi correlati