2012-04-11 21 views
22

Próbuję dostosować mój czcionki UINavigationBar, stosując następujący kod dla iOS 5 w moim app delegata application:didFinishLaunchingWithOptions:Dostosuj UINavigationBar czcionki

if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) 
{ 
    [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                  [UIColor whiteColor], UITextAttributeTextColor, 
                  [UIColor blackColor], UITextAttributeTextShadowColor, 
                  [NSValue valueWithUIOffset:UIOffsetMake(1, 0)], UITextAttributeTextShadowOffset, 
                  [UIFont fontWithName:kDefaultFont size:0.0], UITextAttributeFont, 
                  nil]]; 
} 

To działa dobrze i pasek nawigacyjny jest renderowane za pomocą mojego czcionki. Wspaniały.

The references Znalazłem sugerowanie, że możesz użyć rozmiaru czcionki równego zero i zmieni on rozmiar czcionki, aby pasował do paska nawigacji (używając nieco mniejszej czcionki dla krótszego paska nawigacyjnego dla układu krajobrazu). I wybiera rozmiar czcionki, który ładnie pasuje do wysokości paska nawigacji. Wygląda jednak na to, że jeśli przejdziesz z widoku pionowego do poziomego iz powrotem, szerokość etykiety tytułu paska nawigacyjnego zostanie zerwana, więc to, co pojawia się jako tytuł, na przykład "Długi pasek tytułu", wygląda dobrze po pierwszym wyświetleniu w orientacji pionowej wygląda dobrze, gdy oglądasz go w orientacji poziomej (z odpowiednio mniejszą czcionką), ale kiedy wracam do portretu, czcionka poprawnie powraca do większej czcionki, ale sam tekst tytułu jest obcięty, stając się "Długi .. ", mimo że jest dużo miejsca na pełny tytuł. Czy ktoś inny widział to zachowanie, gdy używa czcionki o rozmiarze 0,0?

Oczywiście, mogę tylko określić rzeczywisty rozmiar czcionki (w którym to przypadku nie widzę tego zachowania obciętego), ale potem ręcznie ustalam, jaki rozmiar użyć. Co gorsza, rozmiar czcionki jest taki sam dla krajobrazu i portretu, więc używam teraz rozmiaru czcionki pasującego do krótszego pejzażu nawigacyjnego, a tytuł jest mniejszy niż na wyższym pionowym pasku nawigacyjnym.

Czy ktoś z personelu miał doświadczenie w używaniu setTitleTextAttributes do zmiany czcionki [UINavigationBar appearance] w taki sposób, że rozmiar czcionki zmienia się między portretem a krajobrazem, ale nie ma tego obcięcia tytułu po powrocie do portretu po przejściu do pejzażu? Mam zamiar realizować różne obejścia kludgy, ale jeśli masz jakieś doświadczenie w tym problemie, daj mi znać.

Aktualizacja:

W procesie składania ten błąd do Apple, postanowiłem pokazać, jak odtworzyć problem:

  1. Utwórz nowy iOS Master-Detail Zastosowanie w Xcode 4.3. 2.

  2. Umieść powyższy kod setTitleTextAttributes w aplikacji delegata użytkownika application:didFinishLaunchingWithOptions (użyłem czcionki @ "GillSans").

  3. Idź do MasterViewController i dodać wiersz, który mówi self.title = @"Long Title";

  4. Komentarz z oznaczeniem UIBarButtonItem *addButton.

  5. Uruchom program. Zauważ, że tytuł poprawnie mówi "Długi tytuł". Obróć do orientacji poziomej. Nadal wygląda dobrze. Obróć z powrotem do portretu, a tytuł mówi "Długo ...", chociaż jest dużo miejsca.

  6. Co ciekawe, po przywróceniu kodu UIBarButtonItem *addButton tytuł działa tak, jak powinien. Ale jeśli albo wyeliminujesz element UIBarButton, albo zastąpisz go przyciskiem, który używa initWithTitle, a nie initWithBarButtonSystemItem, pojawia się problem z tytułem paska nawigacji po obróceniu z portretu na krajobraz, a następnie z powrotem do portretu.

+0

Miałem problem polegający na tym, że moje niestandardowe tytuły paska nawigacyjnego czcionek były "przedwcześnie obcięte" przy pierwszym wyświetleniu, ale później były w porządku. Wydaje się, że to 6-ismowy system iOS. W każdym razie odkrycie, że mogę ustawić rozmiar czcionki na 0.0, rozwiązało problem. Dzięki! – mharper

+1

Co ciekawe na symulatorze iOS5.1 przy użyciu tej metody tytuł jest obcinany * podczas * przejścia pushModalViewController, ale po przejściu jest wyświetlany poprawnie. Na symulatorze iOS 6.0 działa zgodnie z oczekiwaniami. –

Odpowiedz

1

następujące jest moje obejście tego problemu, a tutaj jest komentarz, który pojawia się obok mojego realizacji obejścia w każdym przypadku jako przypomnienie dla siebie, dlaczego ja wdrożyły ten kawałek kodu:

// when using an appearance proxy to set a custom font for the navigation bar (generally in 
// application:didFinishLaunchingWithOptions: in the appDelegate code) for both iOS 5 & 6, 
// there's a glitch that incorrectly auto-truncates the title in the following cirumstances: 
// 
// 1) when a 0.0 value is used for UITextAttributeFont in the titleTextAttributes dictionary 
// and a device/simulator running pre-iOS 5 rotates back to portrait from landscape 
// solution: perform [self.navigationController.navigationBar setNeedsLayout] in 
//    didRotateFromInterfaceOrientation: the view controller in which the 
//    auto-truncation is incorrectly occurring for systemVersion < 6.0 
// 
// 2) when a view initially loads running iOS 6 for a non-0.0 value for the UITextAttributeFont 
// in the titleTextAttributes dictionary 
// solution: perform [self.navigationController.navigationBar setNeedsLayout] 
//    in viewDidLoad in the view controller in which the auto truncation is 
//    incorrectly occurring for systemVersion >= 6.0 

tak więc, w przypadku, gdy Nic mi z wykorzystaniem wartości 0,0 za UITextAttributeFont ale muszą nadal wspierać iOS5, użyć roztworu (1):

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation) 
     && UIDevice.currentDevice.systemVersion.floatValue < 6.0) 
     [self.navigationController.navigationBar setNeedsLayout]; 
} 
#endif 

i T kilka przypadków starszego kodu, w którym chciałem obsługiwać iOS 6 i naprawić usterkę, gdy najpierw pojawia się widok bez konieczności ponownego pisania metod klasy MyAppAppearance. Mam ustawioną wartość inną niż 0,0 dla mojego [UINavigationBar appearance] titleTextAttributes, i okazało się, że łatwiej jest wdrożenie rozwiązania (2) w następujący sposób:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 
    if (UIDevice.currentDevice.systemVersion.floatValue >= 6.0) 
#endif 
     [self.navigationController.navigationBar setNeedsLayout]; 

    // … other viewDidLoadCode 

(i wspornik __IPHONE_OS_VERSION_MIN_REQUIRED tylko pomaga mi przypominać których kod może ostatecznie odejdzie w razie potrzeby w przyszłości, a które mogą mieć na pobyt.)

zobaczyć trochę dokładniej, co się tutaj dzieje, szczególnie w przypadku rotacji, uruchom symulator z włączonymi powolnymi animacjami.

1

Myślę, że dobrym rozwiązaniem jest odświeżenie tytułu paska nawigacyjnego po obrocie urządzenia. Coś takiego jak

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 

     self.navigationItem.title = @"Your title"; 

} 

Mam nadzieję, że to pomoże!

+0

To była, oczywiście, jedna z pierwszych rzeczy, których próbowałem. Brak przyjemności. – Rob

3

Nawiasem mówiąc, nie zauważyłem, że Apple odpowiedziało na mój raport o błędzie, uznając, że był to znany problem. Mam nadzieję, że wkrótce zostanie rozwiązany!

1

Na podstawie odpowiedzi z @Abramodj (która nie działa) próbowałem tego. Prawdopodobnie nic nie działo się w tym rozwiązaniu, ponieważ system zauważył, że tekst się nie zmienił. Przestawienie na nic, a potem z powrotem sortuje to.

Testowany jako zdecydowanie działający na iOS5.0.

// iOS5 has a bug where if you switch orientation the title bar text gets cut off... 
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation  { 
    self.navigationItem.title = @""; 
    self.navigationItem.title = @"Your Title"; 
} 
0

Błąd, w którym tekst tytułu UINavigationBar jest odcięty po zastosowaniu zmian za pośrednictwem wyglądu, może się zdarzyć, nawet jeśli nie zmieniasz orientacji, jak opisuje Ben Clayton. Widziałem problem występujący w aplikacji, która obsługuje tylko orientację pionową.

[self.navigationItem setTitle:@""]; 
[self.navigationItem setTitle:@"The real title"]; 

Działa dobrze nawet w takim przypadku.

Nawiasem mówiąc, miałem ten problem od iOS 5. Właśnie przetestowałem to teraz w iOS 6 i TO JEST NADAL. Co do cholery, Apple?