¿Cómo puedo get el marco de un UIBarButtonItem?

Estoy intentando get el marco de un UIBarButtonItem, que solo henetworkinga de UIBarItem / NSObject.

En iOS 5.0, 5.1 y 6.0, usa el siguiente método. Este método se puede modificar fácilmente para su uso con un UIToolBar también.

- (UIControl *) findBarButtonItem:(UIBarButtonItem *)barButtonItem { UINavigationBar *toolbar = self.navigationController.navigationBar; UIControl *button = nil; for (UIView *subview in toolbar.subviews) { if ([subview isKindOfClass:[UIControl class]]) { for (id target in [(UIControl *)subview allTargets]) { if (target == barButtonItem) { button = (UIControl *)subview; break; } } if (button != nil) break; } } return button; } 

Uso:

 UIControl *barButton = [self findBarButtonItem:myBarButtonItem]; CGRect barButtonFrame = barButton.frame; 

De esta manera funciona mejor para mí:

 UIView *targetView = (UIView *)[yourBarButton performSelector:@selector(view)]; CGRect rect = targetView.frame; 

Sé que publicaste esta pregunta con el propósito de publicar la respuesta que encontraste. Creí agregar una solución alternativa que no tiene el riesgo de romperse en una futura actualización de iOS.

Si crea su UIBarButtonItem usando una vista personalizada, puede acceder a la propiedad customView del UIBarButtonItem . El frame de customView reflejará su position en la barra de herramientas o la barra de navigation.

Obviamente, esta solución le impide utilizar los botones definidos por el sistema estándar. Pero puedes replicarlos fácilmente con tu propia image.

En general, la vista personalizada que usaría sería un UIButton con una image de icono adecuada. Un truco es asegurarse de habilitar la propiedad showsTouchWhenHighlighted del button para que obtenga el efecto resaltante habitual.

Configura el UIButton con el mismo destino / acción que UIBarButtonItem en UIBarButtonItem .

Esta es una manera de hacer esto sin tener que recurrir a comportamientos o supuestos indocumentados.

En lugar de usar un UIBarButtonSystemItem, use un UIBarButtonItem con una vista personalizada. Puede get la image del UIBarButtonSystemItem utilizando una técnica como esta:

Use el ícono UIBarButtonItem en el button UIB