2011-11-10 12 views
8

Sto provando a riposizionare il mio UIBarButtonItem in modo che si trovi con i suoi bordi contro l'estremità superiore e destra di UINavigationBar. Ho trovato this accepted answer su come farlo, ma non capisco davvero come codificarlo.Sovrascrivere layoutSubviews per chiamare [super layoutSubviews] e quindi trovare e riposizionare la vista del pulsante

Ho iniziato creando una nuova classe chiamata CustomNavBar che eredita da UINavigationBar. Ho poi messo questo metodo per l'attuazione:

- (void) layoutSubviews 
{ 


} 

Quello che non capisco è la parte nella risposta che dice

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

Come faccio a codice questo? Sarebbe utile anche una piccola spinta nella giusta direzione. Grazie!

risposta

15

Trova il pulsante che si desidera spostare dopo si chiama layoutSubviews perché sarà riposizionato al punto in cui iOS vuole che sia ogni volta layoutSubviews si chiama.

- (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

È un ciclo tra i subviews e può confrontare se quello attuale è quello che si desidera utilizzando NSClassFromString, in questo modo, per esempio:

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

Si potrebbe anche usare NSLog nel ciclo for per guarda le diverse sottoview.

+2

Perché dovresti voler usare 'NSClassFromString' invece di' [TheClassNameYouWant class] '? In quest'ultimo caso, si otterrebbero avvertimenti dopo un refactoring, cosa che non si farebbe nel primo caso. – Zappel

+0

Suppongo che '[TheClassNameYouWant class]' dovrebbe essere più performante – yano

Problemi correlati