2014-10-25 16 views
5

Mogłem zmienić pozycję pionową ikony przycisku Wstecz, ale nie tekst.Zmiana pozycji pionowej tekstu przycisku Wstecz w UINavigationBar

Używam metody layoutSubviews w UINavigationBar:

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    BOOL fixed = NO; 
    NSArray *classNamesToReposition = @[@"_UINavigationBarBackIndicatorView", @"UINavigationButton", @"UINavigationItemButtonView"]; 
    for (UIView *view in [self subviews]) { 
     if ([classNamesToReposition containsObject:NSStringFromClass([view class])] && !fixed) { 
      CGRect frame = [view frame]; 
      if ([NSStringFromClass([view class]) isEqualToString:@"_UINavigationBarBackIndicatorView"]) { 
       frame.origin.y = 14.5; 
      } else if ([NSStringFromClass([view class]) isEqualToString:@"UINavigationButton"]) { 
       frame.origin.y = 9.0; 
      } else if ([NSStringFromClass([view class]) isEqualToString:@"UINavigationItemButtonView"]) { 
       frame.origin.y = 5.0; 
      } 
      [view setFrame:frame]; 
     } 
    } 
} 

Problemem jest to, że każda zmiana ramki robię na UINavigationItemButtonView wydaje się nie mieć żadnego wpływu, ani zmiana ramki robię na jego UILabel subview to jest faktyczny tekst przycisku. Podczas rejestrowania widoków ramki wydają się zmieniać, ale tekst nie porusza się w moim widoku. Co ja robię źle?

+0

Jack, czy próbowałeś umieścić ten kod w 'viewDidAppear:' zamiast? Testowałem na moim projekcie i ustawiłem pozycję y. – carlodurso

Odpowiedz

4

Podklasę UINavigationBar o nazwie MyNavigationBar, w layoutSubviews, zmień pozycję tylnego wskaźnika.

for (UIView *view in [self subviews]) { 
    CGRect frame = [view frame]; 
    if ([NSStringFromClass([view class]) isEqualToString:@"_UINavigationBarBackIndicatorView"]) { 
     frame.origin.y = 19.5; //default is 11.5, move down by 8. 
    } 
    [view setFrame:frame]; 
} 

I możesz zmienić pozycję tytułu backBarItem przez dodanie tego w applicationDidFinished.

[[UIBarButtonItem appearanceWhenContainedIn:[MyNavigationBar class], nil] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, 8) forBarMetrics:UIBarMetricsDefault]; 
+0

Czy te bloki kodu wzajemnie się wykluczają; można ustawić pozycję za pomocą samego [UIBarButtonItem appearanceWhenContainedIn ...], czy też trzeba powtórzyć te widoki? –

+0

Nie, muszę dodać obie, pierwsza to zmiana tylnego wskaźnika (strzałka wsteczna), druga to zmiana tytułu backbarItem, tutaj jest [przykład] (https: //www.dropbox .com/s/uh0d7f258diynrs/VeticalPosition.zip? dl = 0), jeśli chcesz zobaczyć, jak to działa. – gabbler

+0

To jest świetne, ale niestety to usuwa powiązanie tekstu z strzałki wstecznej tworząc self.navigationItem.hidesBackButton = YES; tylko ukryj tylną strzałę niestety. Czy wymyśliłeś rozwiązanie tego dylematu? –