2015-04-26 17 views
6

Chcę, aby mój pasek nawigacji pokazywał dwie rzeczy w środku. Jedną z nich będzie nazwa listy, a druga będzie nazwą użytkowników. Nazwy użytkowników zostaną umieszczone pod nazwą listy. To, co dotychczas zrobiłem, stworzyłem programowo dwie etykiety i jeden superview i ustawiłem titleView z navigationItem.Tytuł paska nawigacyjnegoView wyrównanie

override func viewDidLoad() { 
     super.viewDidLoad() 
     var rectForView = CGRect(x: 0, y: 0, width: 190, height: 176) 
     var viewForTitle = UIView(frame: rectForView) 

     var rectForNameLabel = CGRect(x: 0, y: 63, width: 190, height: 30) 
     var listNameLabel = UILabel(frame: rectForNameLabel) 
     listNameLabel.text = "Name of the List...." 
     listNameLabel.textAlignment = NSTextAlignment.Center 
     listNameLabel.font = UIFont(name: "HelveticaNeue-Bold", size: 15) 

     var rectForListLabel = CGRect(x: 0, y: 93, width: 190, height: 20) 
     var usersOfListLabel = UILabel(frame: rectForListLabel) 
     usersOfListLabel.text = "some Users...." 
     usersOfListLabel.textAlignment = NSTextAlignment.Center 
     usersOfListLabel.font = UIFont(name: "HelveticaNeue", size: 10) 

     viewForTitle.addSubview(listNameLabel) 
     viewForTitle.addSubview(usersOfListLabel) 


     self.navigationItem.titleView = viewForTitle 

Chodzi o to, że wybieram szerokość losowo, co prowadzi do problemów z wyrównaniem w różnych urządzeniach. Jak uzyskać w moim przypadku średnie wyrównanie? iphone 6

iphone 5

+0

Czy spróbować ustawienie NSLayoutConstraint dla CenterX? – gutenmorgenuhu

+0

Ja nie. Ale starałem się ustawić "centerForViews" center x zmienną na widoki (to przychodzi ze sterownikiem) center x variable – Salihcyilmaz

+0

Przy okazji, jak programowo dodawać ograniczenia? – Salihcyilmaz

Odpowiedz

3

Chodzi o to, nawigacja titleView zawsze starają się centrum widoku. Powodem, dla którego tytuł nie jest widoczny na środku ekranu, jest to, że szerokość niestandardowego titleView wykracza poza szerokość maksimum titleView.

Jeśli ustawisz wartość na 160, zobaczysz ją wyśrodkowaną dla drugiej sytuacji.

ogólne rozwiązanie

Jeśli chcesz dostosować tytuł szerokość do różnych urządzeń, istnieje kilka metod, które mogą pomóc w rozwiązaniu problemu.

  1. Ustaw inną szerokość w zależności od szerokości ekranu. Na przykład, gdy szerokość ekranu wynosi 320, ustaw ją na nie więcej niż 160. Jeśli jest większa niż 320, przypisz wartość na podstawie różnej wielkości ekranu. To nie jest eleganckie rozwiązanie, ale prawie proste, nie wbijając głowy w ustawienie i próbując skomplikowanych ograniczeń.

  2. Oblicz rzeczywistą szerokość tytułuView. Szerokość titleView jest określana przez szerokość paska nawigacyjnego minus lewy i prawy przycisk barbuttonitem. Coś jak

TitleViewWidth = Nawigacja szerokość - leftbarbuttonitem.width +/- rightbarbuttonitem.width - someConstant

Musisz trochę eksperyment na znalezienie odpowiedniej stałej, który pasuje do tego wzoru.

  1. Utwórz plik xib dla tego tytułu Wyświetl, ustaw wiązania bardziej elastycznie niż twierdz o stałej szerokości. Załaduj widok z Xib, a następnie przypisz do titleView. To może kosztować dłuższy czas, aby dostroić go do pracy.

Edit

myślę o inny sposób, który może być łatwiejsze, jeśli jesteś nowy w tym.

W serii ujęć znajdź i upuść widok do paska tytułu nawigatora tego widoku.

Rozwiń tak długo, jak chcesz, aby widok był.

Upuść dwie etykiety do tego widoku i ustaw wiązania początkowe i końcowe oraz wysokości i pionowe.

Jak to wygląda na ujęć

storyboard image

Jak to działa na 4S

4S running

+0

Myślałem coś podobnego do rozwiązania wspomnianego w 1. Ale nie mogłem się zorientować, jak mogę to zrobić ... Jak mogę ustawić inną ilość dla różnych urządzeń lub ekrany? Dla numeru 3, nie wiem, jak utworzyć plik xib. Jestem nowy na iOS i Apple wydaje się przeciwko tworzeniu plików stalówki, odwołując się do dokumentacji w ogóle.Czy możesz dać mi kilka linków na temat Xibs lub coś w stylu "go dive w tej dokumentacji, naucz się tych "... W każdym razie, dziękuję za zainteresowanie – Salihcyilmaz

+0

@Salihcyilmaz sprawdź moją edycję dla łatwiejszego podejścia 1. Możesz spróbować użyć UIScreen lub po prostu spróbuj uzyskać szerokość nawigacji pasek, zobacz, jaka jest liczba, i przypisz inną szerokość w zależności od szerokości nawigacji. –

+0

@Salihcyilmaz Dla 3, nie znalazłem teraz czegoś przydatnego. Jest sporo informacji o tym, jak utworzyć plik xib lub jak ponownie użyć pliku xib, po prostu nie wiedziałem, czy naprawdę działają na razie :) Wystarczy przeszukać plik wielokrotnego użytku xib, jeśli potrzebujesz w przyszłości. –

0

Podejście:

  • titleView zawsze skupione
  • więc ustawić szerokość widoku niestandardowego, aby pasować do navigationBar (szerokość -40)

Kod

private func setupNavigationItems() { 

    let label = UILabel() 

    label.translatesAutoresizingMaskIntoConstraints = false 

    label.text = "aaaaa" 
    label.backgroundColor = .green 

    label.textAlignment = .left 

    navigationItem.titleView = label 

    if let navigationBar = navigationController?.navigationBar { 

     label.widthAnchor.constraint(equalTo: navigationBar.widthAnchor, constant: -40).isActive = true 
    } 
} 

Custom Title View for the entire width of the navigation bar

Powiązane problemy