2012-01-07 10 views
13

Ho un UIBarButtonItem che ha un UITextField come customView. La barra degli strumenti contiene questo elemento e alcuni pulsanti.fare un UIBarButtonItem con customView comportarsi come elemento Flexible-Space

Mentre la barra degli strumenti viene ridimensionata (ad esempio in caso di modifica dell'orientamento del dispositivo), desidero che lo UITextField aumenti o diminuisca (larghezza) per occupare tutto lo spazio disponibile nella barra degli strumenti.

A corto di capire le dimensioni combinate di tutti i pulsanti nella barra degli strumenti, quindi impostare la larghezza UITextField in modo appropriato, c'è solo un modo magico per rendere questo elemento si comportano come un elemento barra di spazio flessibile?

risposta

2

Se si imposta UIViewAutoresizingFlexibleWidth nel campo di testo, questo dovrebbe ridursi o ingrandirsi automaticamente.

+6

Questo non prenderà in considerazione gli altri pulsanti - vale a dire un lungo un'etichetta supererà i suoi limiti ragionevoli ... –

+0

Questo ha lavorato fantasticamente per il mio campo di testo con un pulsante a destra. Saluti! – Joey

7

Così come ho scritto nel commento, la soluzione suggerita da @Krishna_K non funziona in ogni momento.

Da quando ho scritto il mio metodo, ho pensato di condividere. una parte di esso si basa su: Get the width of a UIBarButtonItem

// Expand the status label to fill remaining space 
CGFloat totalItemsWidth = 0.0; 
CGFloat itemsMargin  = 8.0; 
for (UIBarButtonItem *barButtonItem in myToolbar.items) { 
    if (barButtonItem != self.myLabelItem) { 
     // Get width of bar button item (hack from other SO question) 
     UIView *view = [barButtonItem valueForKey:@"view"]; 
     CGFloat width = view? [view frame].size.width : (CGFloat)0.0; 

     totalItemsWidth += width + itemsMargin; 
    } 
} 

self.myLabelItem.width = (myToolbar.frame.size.width - totalItemsWidth) - itemsMargin; 

Commenti:

  • non può spiegare perché questo funziona con spazi flessibili, ma lo fa

  • Si noti che gli elementi passati a UIToolbar sono copiati non trattenuti - quindi si dovrebbe sempre lavorare sugli elementi della barra dalla t oolbar stesso, non il tuo oggetto locale conservato.

  • Questo hack in là è l'unica cosa che ha funzionato per ottenere larghezza (provato la proprietà width, provato dopo un po 'di tempo in modo che le viste vengano aggiunte, provato a lasciare che le viste si espandano da sole). Soliti hack-avvertimenti applicare ...

Questo è tutto gente ...

+0

Che non può funzionare con spazio flessibile UIBarButtonItem ... non ha una vista. –

+0

Funziona perché i pulsanti flessibili hanno una dimensione pari a 0 e quando si imposta la dimensione di un elemento, in seguito quelli si espandono per riempire il vuoto rimanente, che dovrebbe essere vicino a 0. Cioè, se dimensionato correttamente, gli elementi dello spazio flessibile sarà vicino a 0. –

+0

Questo ha funzionato alla perfezione fino a iOS 7. – Nestor

3

ho un bel UIToolbar sottoclasse che ho appena scritto per fare questo, grazie al codice nel post di Oded. Funziona bene per una barra degli strumenti con 5 elementi: pulsante, spazio flessibile, campo di testo, spazio flessibile, pulsante. Sovrascrivendo layoutSubviews, si può regolare correttamente la larghezza UITextField:

@implementation AdaptingTextFieldToolbar 

- (void)layoutSubviews 
{ 
    CGFloat totalItemsWidth = 0.0; 
    CGFloat itemsMargin  = 8.0; 
    UIBarButtonItem *textFieldBarButtonItem; 
    for (UIBarButtonItem *barButtonItem in self.items) { 
     // Get width of bar button item (hack from other SO question) 
     UIView *view = [barButtonItem valueForKey:@"view"]; 
     if(view) { 
      if([view isKindOfClass:[UITextField class]]) { 
       textFieldBarButtonItem = barButtonItem; 
      } else 
      if(view.bounds.size.width > 0) { 
       // Docs say width can be negative for variable size items 
       totalItemsWidth += view.bounds.size.width + itemsMargin; 
      } 
     } 
     totalItemsWidth += itemsMargin; 
    } 

    textFieldBarButtonItem.width = (self.bounds.size.width - totalItemsWidth) - itemsMargin; 
    NSLog(@"WIDTH=%f", textFieldBarButtonItem.width); 

    [super layoutSubviews]; 
} 
@end 
Problemi correlati