2011-01-17 14 views
31

Come rimuovere il riempimento orizzontale a sinistra ea destra degli elementi personalizzati di sinistra e destra di UINavigationBar? Sembra che ci siano ~ 10 punti di riempimento che iOS imposta di default.Posizionamento di un UIBarButtonItem basato su visualizzazione personalizzata nella barra di spostamento senza riempimento orizzontale predefinito

Sto personalizzando i pulsanti della barra di navigazione sinistra e destra (ho rinunciato a provare a impostare il mio backButtonItem, quindi sto solo usando il leftBarButtonItem).

In entrambi i casi (a sinistra oa destra), premendo questi pulsanti personalizzati si indica che Apple sembra conservare un riempimento a sinistra di LeftBarButtonItem e alla destra di rightBarButtonItem; a prescindere dall'ampiezza dello sfondo personalizzato e delle proprietà dell'immagine di UIButton, posto come elemento personalizzato all'interno della barra dei pulsanti sinistra/destra.

Poiché UIBarButtonItem non ha "frame" a cui posso accedere, non riesco a posizionarli all'interno della loro superview come se fosse normale.

Qualche suggerimento su come rimuovere questo riempimento predefinito? Vedi la schermata allegata per vedere il bit che sto cercando di ridurre a una larghezza zero. Nella schermata, l'icona più appare spostata a destra perché ho inserito un riquadro; ma l'immagine di sfondo evidenziata, presumibilmente usando anche questo riquadro, viene ritagliata sul lato destro).

vedi immagine a: https://skitch.com/starbaseweb/rj2e5/ios-simulator

Per riferimento, ecco come sto creando il mio personalizzato UIBarButtonItem (in questo caso, è il tasto destro):

- (UIBarButtonItem *)customAddButtonItemWithTarget:(id)target action:(SEL)action { 
    UIButton *customButtonView = [UIButton buttonWithType:UIButtonTypeCustom]; 

    customButtonView.frame = CGRectMake(0.0f, 0.0f, 45.0f, 44.0f); 

    [customButtonView setBackgroundImage: 
     [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Normal.png"] 
     forState:UIControlStateNormal]; 
    [customButtonView setBackgroundImage: 
     [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Highlighted.png"] 
     forState:UIControlStateHighlighted]; 

    [customButtonView setImage: 
     [UIImage imageNamed:@"bgNavBarButton-Add-Normal.png"] 
     forState:UIControlStateNormal]; 
    [customButtonView setImage: 
     [UIImage imageNamed:@"bgNavBarButton-Add-Highlighted.png"] 
     forState:UIControlStateHighlighted]; 

    [customButtonView addTarget:target action:action 
     forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *customButtonItem = [[[UIBarButtonItem alloc] 
     initWithCustomView:customButtonView] autorelease]; 
    [customButtonView setImageEdgeInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f)]; 

    //customButtonItem.imageInsets = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f); 

    return customButtonItem;  
} 
+0

+1: ho avuto questo problema e ho provato un certo numero di cose .. compresi gli inserti, e semplicemente facendo l'immagine a -10 nella posizione x ed ecc. Non ho avuto fortuna quindi ho solo tenuto il piccolo padding e ho rifatto il immagine per renderlo più appropriato. in bocca al lupo. –

risposta

82

55 Come sopra commentato, la soluzione che ho seguito si basa su questa risposta a una domanda diversa, ma molto correlata: How to adjust UIToolBar left and right padding. È inoltre facilitato da (e dipende da) iOS5, che consente di impostare più pulsanti sul lato sinistro o destro, anziché solo uno.

Ecco un esempio di rimuovere il padding a sinistra di un elemento pulsante personalizzato sinistra:

UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view 

// Create a negative spacer to go to the left of our custom back button, 
// and pull it right to the edge: 
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
    target:nil action:nil]; 
negativeSpacer.width = -5; 
// Note: We use 5 above b/c that's how many pixels of padding iOS seems to add 

// Add the two buttons together on the left: 
self.navigationItem.leftBarButtonItems = [NSArray 
    arrayWithObjects:negativeSpacer, backButtonItem, nil]; 

E con questo, l'imbottitura sinistra per l'elemento pulsante della barra a sinistra in una barra di navigazione, è andato!

NOTA: questo ha funzionato per me in iOS5 e iOS6. Dato che iOS7 è considerevolmente diverso (dalle demo pubbliche), quelli di voi con i primi semi di iOS7 dovrebbero testare se qualcosa di così non intenzionale, come questo hack, continuerà a funzionare per voi oltre iOS6.

+7

Funziona anche con rightBarButtonItems senza modificare l'ordine (potresti essere tentato di invertire l'ordine di backButtonItem e negativeSpace ma non lo è) – Martin

+0

Grazie per questo! – chourobin

+0

Davvero grazie per quest'uomo! :) –

3

Ho provato questo e funziona :

1) Creare una sottoclasse UIToolbar personalizzata, che non fa nulla in -drawRect :, e non è opaca, e ha backgroundColor = [UIColor clearColor].

2) Creare un UIBarButtonItem personalizzato con la barra degli strumenti come vista personalizzata.

3) Aggiungere i pulsanti alla barra degli strumenti personalizzata.

4) Nella barra degli strumenti personalizzata sovrascrivere -visualizzaSubView e fai la tua spaziatura.

+0

Un altro trucco è che puoi semplicemente rendere la barra di navigazione in qualche modo più larga della finestra, in modo che il riempimento destro venga tagliato e il tuo pulsante appaia nel posto giusto! Funziona solo se gestisci direttamente UINavigationBar, cioè non attraverso un controller di navigazione. –

+0

Grazie Evadne. L'ho passato con una soluzione alternativa, ma cercherò di tornare a questa versione post per confermare la soluzione suggerita che è possibile quindi contrassegnarla come risposta accettata. – idStar

+0

Ho trovato un'implementazione più pulita, possibile con iOS5. Vedere la risposta qui: http://stackoverflow.com/questions/6021138/how-to-adjust-uitoolbar-left-and-right-padding/7042201#7042201 Ho testato questa soluzione e ha funzionato. Due linee di codice e la meno intrusiva. – idStar

Problemi correlati