2017-06-09 88 views
9

Zaimplementowałem podstawowy UIViewController z UITableView, który jest zawinięty w UINavigationController. Ustawić prefersLargeTitles true:iOS 11 preferujeDużeTagi nie aktualizuje się, dopóki nie przewiniesz

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    navigationController?.navigationBar.prefersLargeTitles = true 
    navigationItem.title = "Coffees" 
} 

Jednak tytuł pozostaje mały, dopóki nie przewijać widok, w którym momencie to powiększa. Próbowałem przenieść to wywołanie do miejsca, w którym utworzyłem UINavigationController, ale nie było efektu. Jestem pewien, że navigationController nie jest zerowy, gdy ustawiam prefersLargeTitles.

Czy powinienem aktualizować tę właściwość w innym miejscu? Czy powinienem złożyć radar?

Aktualizacja:

To tylko wydaje się stanie, jeśli mój widok zawiera UITableView albo sama jest UITableViewController

+1

Muckowanie za pomocą 'navigationBar' powinno być generalnie wykonywane w' viewWillAppear (_ :) ', a nie' viewDidLoad() '. –

+0

ten sam numer tutaj – Bren

+0

Próbowałem przenieść go do 'viewWillAppear'. Ten sam problem. –

Odpowiedz

0

To nie wydaje się dziwne zachowanie w pierwszym, ale spróbuj ustawienie navigationItem.largeTitleDisplayMode do always. Wartość domyślna to automatic - i nie jest zdefiniowane, jak to działa w docs.

Również napisał/zaktualizuje odpowiedź dotyczącą dużych tytułów here.

+0

Próbowałem również. To też nie działało dla mnie :( –

1

W scenorysie ustawiam element nawigacyjny Large Title na Never.

Navigation Item

W mojej metody ViewController za viewDidLoad ustawić następujące:

navigationController?.navigationBar.prefersLargeTitles = true 
navigationItem.largeTitleDisplayMode = .always 
+0

Nie używam scenorysów –

+0

Ta praca jest potrzebna nawet w Xcode 9 GM. Wygląda na to, że duża czcionka tytułowa paska nawigacyjnego jest również ignorowana – malhal

1

prostu miałem ten sam problem i, w moim przypadku okazało się, że Storyboard struktura, która działa w iOS 10 z Swift 3 (a także współpracuje z iOS 11 z Swift 3) był przyczyną problemu na iOS 11 z Swift 4.

Aby opracować:

Posiadałem zwykły UIViewController w moim storybooku, który ustawiłem na podklasę UINavigationController (moja hierarchia jest podobna do twojej, z podklasą UITabBarController → podklasa UINavigationController → podklasa UITableViewController).

W iOS 10 wszystko działało dobrze.

W systemie iOS 11 działa to również poprawnie po uruchomieniu istniejącej aplikacji Swift 3.

Jednak w aplikacji Swift 4, działającej na iOS 11, widziałem te same objawy, które opisałeś (duże tytuły pojawiają się tylko podczas przeciągania/przewijania widoku w dół).

Aby naprawić, zastąpiłem elementy oparte na UIViewController w Storyboard z rzeczywistymi instancjami UINavigationController (które zawierają UINavigationBar jawnie w Storyboard - Mam przeczucie, to jest to, gdzie pochodzi sedno problemu, jak instancje UIViewController nie ma tego elementu jawnie zadeklarowanego w Storyboard).

W każdym razie to naprawiło problem.

Złożę radar, ponieważ wygląda na regresję opartą na Swift 4, ponieważ działa ona zarówno w iOS 10 z Swift 3, jak iw iOS 11 z Swift 3.

+0

Nie używam scenorysów, więc Nie sądzę, żeby to było, co się dzieje z moją aplikacją. –

1

Modyfikowanie zawartościInformacja tableView z top:1 zmusi pasek nawigacji do rozwinięcia i wyświetlenia dużych tytułów.

Obj-C

-(void) viewWillAppear:(BOOL)animated { 
    if (@available(iOS 11.0, *)) { 
     tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0); 
    } 
} 

Swift

override func viewWillAppear(_ animated: Bool) 
    if #available(iOS 11.0, *) { 
     tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0) 
    } 
} 

Uwaga: Jeśli masz tableView.reloadData() w viewWillAppear upewnij się nazwać po edycji contentInset

1

wpadłem w tym samym numerze i okazało się, że najlepiej jest ustawić propozycję prefersLargeTitles rty z kontrolera widoku lub obiektu, który je ustawia, i zrobić to, zanim zostanie przedstawiony.

Na przykład, jeśli kontroler widoku w pytaniu jest pokazany po uruchomieniu aplikacji:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    let window = UIWindow(frame: UIScreen.main.bounds) 

    let someViewController: UIViewController = CustomViewController() 

    let theNavController = UINavigationController(rootViewController: someViewController) 
    theNavController.navigationBar.prefersLargeTitles = true 

    window.rootViewController = theNavController 
    window.makeKeyAndVisible() 

    return true 
} 

lub stwarzające szczególne kontrolera wyświetlania:

let someViewController: UIViewController = CustomViewController() 

let theNavController = UINavigationController(rootViewController: someViewController) 
theNavController.navigationBar.prefersLargeTitles = true 

present(theNavController, animated: true, completion: nil) 

znalazłem tę metodę, aby być bardziej pewny - sposób, aby upewnić się, że tytuł nawigacji jest odpowiednio wyświetlany. Mam nadzieję że to pomoże! :)

+0

Aby dodać do twojego drugiego przykładu: odkryłem, że jeśli utworzysz inny kontroler widoku i natychmiast wciśniesz go na kontroler nawigacyjny, jeśli wrócisz poprzez dotknięcie przycisku wstecz, pierwszym kontrolerem widoku jest błąd, który powoduje, że tekst tytułu znika.Trzeba wywołać 'layoutIfNeeded()' na pierwszym ViewController, aby to naprawić. – JonEasy

0

Miałem podobny problem. Widok jest widokiem tabeli. Właściwość prefersLargeTitles jest ustawiona na zdarzenie viewDidLoad. Następnie ustawiam tytuł widoku w zdarzeniu viewWillAppear.

override open func viewDidLoad() { 
    if #available(iOS 11.0, *) { 
     self.navigationController?.navigationBar.prefersLargeTitles = true 
    } else { 
     // Fallback on earlier versions 
    } 
    ... 
} 

override open func viewWillAppear(_ animated: Bool) { 
    self.navigationItem.title = "something" 
    ... 
} 

W moim przypadku Segue przygotować, ustawić płytkę elementu nawigacyjnego do nil tak że następnego widoku lewo var item nawigacji wyświetla „Powrót” automatycznie.

override func prepare(for segue: UIStoryboardSegue, 
         sender: Any?) { 
    self.navigationItem.title = nil 
    ... 
} 

Po raz pierwszy widok tabeli wyświetla poprawnie duży tytuł. Jeśli jednak wybiorę wiersz do następnego widoku i powrócę do widoku tabeli, tytuł elementu nawigacji stanie się pusty.

Po kilku godzinach zmagań, w końcu dowiaduję się, że tytuł widoku powinien być ustawiony na viewDidAppear! Wygląda na to, że cokolwiek ustawionego na tytuł widoku w zdarzeniu Will zostanie zresetowane przez UIKit wewnętrznie z powrotem do zera. Więc musi być ustawiony w innym wydarzeniu.

Przed wprowadzeniem tej nowej funkcji iOS 11 moja aplikacja działa poprawnie. Wygląda na to, że nowa funkcja ma pewne zmiany w UIKit, więc poprzednia wersja aplikacji może wymagać pewnych aktualizacji/zmian, aby działała.

2

miałem ten sam problem tylko z jednej tableview ...

musiałem ustawić:

self.tableView.contentInsetAdjustmentBehavior = .never 

tak że moim Tableview zatrzymać przewijanie kiedy UIViewController został załadowany.

To tableview automatyczne przewijanie sprawia, że ​​duży tytuł jest ukryty

nadzieję, że to pomaga

4

miałem ten sam problem. Chociaż nie używasz Storyboard, ale mam nadzieję, że to może pomóc komuś. Sprawdziłem "Preferuj duże tytuły" dla kontrolera nawigacyjnego (nie kontrolera widoku) Wbudowałem swój TableViewController w. Wszystkie kontrolery widoku za kontrolerem nawigacyjnym odwróciły się i miały duże tytuły, i powinno działać.

+0

To też działa dla mnie ... –

0

W moim przypadku rozwiązaniem było ustawić tableView Top wyrównać do bezpiecznej okolicy i nie Superview

0

miałem ten sam problem i naprawić go przez kolejność widoków zmianę w moim ViewController w InterfaceBuilder.

Wygląda na to, że jeśli pierwszy widok w hierarchii NIE jest ScrollView, to nawigacja pojawia się w trybie LargeTitle i nie animuje się razem z widokiem przewijania. Jeśli chcesz, aby tytuł paska nawigacyjnego odzwierciedlał Twój zwój, musisz ustawić widok przewijania jako pierwszą w hierarchii widoku.

Ponadto nie jestem do końca pewien, ale wygląda na to, że wygląd paska nawigacji w trybie standardowym lub dużym tytule zależy od hierarchii widoków poprzedniego kontrolera.