2015-04-26 2 views
6

Я хочу, чтобы моя панель навигации показывала две вещи посередине. Один из них будет списком, а другой будет именем пользователей. Имена пользователей будут помещаться под именем списка. Что я сделал до сих пор, я создал две метки и один супервизор программно и установил titleView из navigationItem.Навигационная панель titleView alignment

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 

Дело в том, что я выбираю ширину случайным образом, что приводит к проблемам с выравниванием на разных устройствах. Как достичь среднего выравнивания в моем случае? iphone 6

iphone 5

+0

ли вы попробовать установить в NSLayoutConstraint для CenterX? – gutenmorgenuhu

+0

Я этого не сделал. Но я попытался установить центральную переменную «textForViews» в переменную вида (которая идет с контроллером). Центральная переменная x – Salihcyilmaz

+0

Кстати, как добавить ограничение программно? – Salihcyilmaz

ответ

3

Дело в том, навигация titleView всегда стараются сосредоточить Ваше мнение. Причина того, что название, которое вы видите вне центра на меньшем экране, состоит в том, что ширина вашего пользовательского titleView превысила максимальную ширину titleView.

Если вы установили значение 160, вы увидите, что оно центрировано для второй ситуации.

Общее решение

Если вы хотите, чтобы адаптировать ширину заголовка к различным устройствам, существует несколько подходов, которые могут помочь вам решить эту проблему.

  1. Установка различной ширины на основе различной ширины экрана. Например, когда ширина экрана равна 320, установите его не более 160. Если значение больше 320, назначьте значение на основе другого размера экрана. Это не изящное решение, но довольно простое, не разбирая голову и не усложняя сложные ограничения.

  2. Рассчитать фактическую ширину titleView. Ширина titleView определяется шириной панели навигации минус левый и правый барбэттон. Что-то вроде

TitleViewWidth = навигация ширина - leftbarbuttonitem.width +/- rightbarbuttonitem.width - someConstant

Вам нужно немного эксперимента для нахождения соответствующей константы, которая соответствует этой формуле.

  1. Создайте xib-файл для этого titleView, установите ограничения более гибко, чем требуется фиксированная ширина. Загрузите представление из xib и затем назначьте titleView. Это может стоить больше времени, чтобы настроить его на работу.

Редактировать

Я думаю, что другой способ, который может быть проще для вас, если вы новичок в этом.

В раскадровке найдите и снимите этот вид на панели навигации заголовка контроллера.

Развернуть, однако, вы хотите, чтобы вид был.

Откажитесь от двух ярлыков к этому виду и установите передние и конечные и вертикальные и вертикальные ограничения.

Как это выглядит на раскадровке

storyboard image

Как это работает на 4S

4S running

+0

Я думал, что-то похожее на решение, упомянутое в 1. Но я не мог понять, как я могу это сделать ... Как я могу установить различное количество для разных устройств или экраны? Для номера 3 я не знаю, как создать xib-файл. Im new для iOS и Apple, похоже, против создания файлов nib, ссылаясь на документацию в целом. Можете ли вы дать мне несколько ссылок о xibs или что-то вроде «go dive» в этой документации узнайте об этом »... В любом случае, спасибо за ваш интерес. – Salihcyilmaz

+0

@Salihcyilmaz проверить мое редактирование для более легкого подхода. Для 1. вы можете попробовать использовать UIScreen или просто попытаться получить ширину навигации bar, посмотрите, что это за номер, и назначьте разную ширину на основе различной ширины навигации. –

+0

@Salihcyilmaz Для 3 я не нашел что-то удобное прямо сейчас. Существует немало о том, как создать xib-файл или как повторно использовать xib-файл, я просто не знал, есть ли на самом деле работа на данный момент :) Просто выполните поиск вокруг многократного xib-файла, если вам нужно в будущем. –

0

подход:

  • titleView всегда в центре
  • Так установить ширину вашего пользовательского вида, совпадающее из navigationBar (ширина -40)

Код

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