2011-11-22 10 views

risposta

12

Purtroppo, non esiste un modo semplice per determinare la posizione di un UIBarButtonItem. Un UIBarButtonItem è essenzialmente un NSObject che fa solo due cose: descrive l'aspetto di un pulsante della barra degli strumenti e inoltra gli eventi al target designato/selettore di azioni.

Ora, dato che tutti i pulsanti sono sottoview di UIToolbar, e tutti gli eventi di pulsante vengono instradati attraverso i rispettivi UIBarButtonItems, è piuttosto banale scorrere tutte le sottoview della UIToolbar e quando si trova un pulsante il cui target è quello di UIBarButtonItem , ottieni solo la cornice di quel pulsante. Alcuni Codice:

UIToolbar *toolbar = <your toolbar>; 
UIBarButtonItem *barButtonItem = <your item>; 
UIButton *button = nil; 
for (UIView *subview in toolbar.subviews) { 
    if ([subview isKindOfClass:[UIButton class]]) { 
     for (id target in [(UIButton *)subview allTargets]) { 
      if (target == barButtonItem) { 
       button = (UIButton *)subview; 
       break; 
      } 
     } 
     if (button != nil) break; 
    } 
} 
CGRect frame = button.frame; 
+0

Questo non sembra funzionare per me in iOS 5. – Jon

+4

Funziona se si sostituisce UIButton con UIControl. –

+0

Risposta modificata per cambiare UIButton in UIControl. –

0
UIToolbar *toolbar; 

for (UIView *v in [toolbar items]) 
{ 
    if ([v isKindOfClass:[UIBarButtonItem class]]) 
    { 
     UIBarButtonItem *b = (UIBarButtonItem*)v; 
     //do something with b.. 
    } 
} 
+0

Questo risponde alla domanda di determinare la posizione? Non sembra a dir poco. – corsiKa

+0

Non ancora .. Ma puoi accedere a UIBarButtonItem //toolbar.subviews non funziona // prova a migliorare la risposta – morex87

17

Ho usato questo che sembra essere il modo più elegante

- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem 
{ 
    UIView *view = [buttonItem valueForKey:@"view"]; 
    return view ? view.frame : CGRectZero; 
} 
+0

Dovrebbe essere accettato – Husam

+1

non funziona in ios 11 – Sree

6

Questo funziona per me quando si utilizza popovers da UIBarButtonItems.

- (void)buttonClicked:(id)sender{ 
{ 
    CGRect buttonRect = [[sender view] frame]; 
} 
2

Ho usato l'approccio di johosher per ottenere la posizione di un UIBarButtonItem utilizzando Swift.

Da quando ho avuto bisogno la posizione come sourceRect per un popoverPresentationController ho dovuto convertirlo in self.view. Non sono sicuro, se questa è una buona soluzione, ma funziona molto bene e il popover mostra a destra di UIBarButtonItem.

let senderRect = sender.view!!.convertRect(sender.view!!.bounds, toView: self.view) 

// additional code for the popover controller 
alertController.modalPresentationStyle = UIModalPresentationStyle.Popover 
alertController.popoverPresentationController?.sourceRect = senderRect 
alertController.popoverPresentationController?.sourceView = self.view 
+0

grazie, questo funziona perfettamente con Swift 2.0 –

2

A piu 'swifty' via SWIFT:

func userAction(sender: AnyObject) { 
    if let originView = sender.valueForKey("view") { 
     let frame = originView.frame //it's a UIBarButtonItem 
    } else { 
     let frame = sender.frame //it's a regular UIButton 
    } 
} 

UIBarButtonItem non è una sottoclasse di UIView anche se è essenzialmente un pulsante. Vai a capire.

Problemi correlati