2011-11-22 16 views

Respuesta

12

Desafortunadamente, no hay una manera fácil de determinar la posición de un UIBarButtonItem. Un UIBarButtonItem es esencialmente un objeto NSO que solo hace dos cosas: describir el aspecto y la sensación de un botón de la barra de herramientas, y reenviar eventos al selector designado de objetivo/acción.

Ahora, dado que todos los botones son subvistas de UIToolbar y todos los eventos de botón se enrutan a través de sus UIBarButtonItems respectivos, es bastante trivial recorrer todas las subvistas de su UIToolbar y cuando encuentra un botón cuyo objetivo es el de su UIBarButtonItem , solo consigue el marco de ese botón. Algunos código:

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

Esto no parece funcionar para mí en iOS 5. – Jon

+4

Funciona si reemplaza UIButton con UIControl. –

+0

Respuesta modificada para cambiar UIButton a UIControl. –

0
UIToolbar *toolbar; 

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

¿Responde esto a la pregunta de determinar el puesto? No parece fuera de lugar. – corsiKa

+0

Todavía no .. Pero puedes acceder al UIBarButtonItem //toolbar.subviews no funciona // intenta mejorar la respuesta – morex87

17

He utilizado este que parece ser la más elegante manera

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

Debe aceptarse – Husam

+1

no funciona en ios 11 – Sree

6

Esto funciona para mí cuando se utiliza panecillos de UIBarButtonItems.

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

He usado el enfoque de johosher para obtener la posición de un UIBarButtonItem utilizando Swift.

Como necesitaba la posición como sourceRect para un PopoverPresentationController tuve que convertirlo a self.view. No estoy seguro de si esta es una buena solución, pero funciona muy bien y el popover se muestra a la derecha del 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

gracias, esto funciona perfecto con Swift 2.0 –

2

A 'swifty' forma más 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 NO es una subclase de UIView pesar de que es esencialmente un botón. Imagínate.

Cuestiones relacionadas