2011-11-10 9 views
8

Estoy intentando cambiar la posición de mi UIBarButtonItem para que se asiente con sus bordes en la parte superior y derecha de UINavigationBar. Encontré this accepted answer sobre cómo hacer esto, pero realmente no entiendo cómo codificarlo.Ignorar diseñoSubviews para llamar a [superdispositivoSubviews] y luego buscar y reposicionar la vista del botón

Empecé creando una nueva clase llamada CustomNavBar que hereda de UINavigationBar. Entonces coloqué este método en la implementación:

- (void) layoutSubviews 
{ 


} 

Lo que no entiendo es la parte de la respuesta que dice

call [super layoutSubviews] and then find and reposition the button's view. 

¿Cómo código de esto? Incluso un pequeño empujón en la dirección correcta sería útil. ¡Gracias!

Respuesta

15

Encuentra el botón que desea mover después de llamar layoutSubviews porque va a ser colocado de nuevo a donde IOS quiere que sea cada vez layoutSubviews se llama.

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    for (UIView *view in self.subviews) { // Go through all subviews 
     if (view == buttonYouWant) { // Find the button you want 
      view.frame = CGRectOffset(view.frame, 0, -5); // Move it 
     } 
    } 
} 
3

Puede recorrer los subvistas y comparar si la actual no es el que desea mediante el uso de NSClassFromString, así por ejemplo:

-(void)layoutSubviews { 
    [super layoutSubviews]; 
    for (UIView *view in self.subviews) { 
     if ([view isKindOfClass:NSClassFromString(@"TheClassNameYouWant")]) { 
      // Do whatever you want with view here 
     } 
    } 
} 

También es posible usar NSLog en el bucle for para ver las diferentes subvistas

+2

¿Por qué querrías usar 'NSClassFromString' en lugar de' [The ClassNameYouWant class] '? En este último caso, recibirá advertencias después de un refactor, que no lo haría en el primer caso. – Zappel

+0

Supongo que '[The ClassNameYouWant class]' debería ser más eficiente también – yano

Cuestiones relacionadas