2013-06-12 4 views
2

Можем ли мы добавить NSLayoutConstraint между self.navigationcontroller.navigationbar и видом внутри self.view. Здесь я являюсь UIViewController экземпляром и _textField является подвидом из self.viewNSLayoutConstraint между навигационной панелью и ViewControllers View

Что мне нужно, что пользовательский интерфейс должен выглядеть одинаково, независимо от ли navigationBar является полупрозрачный или нет.

Я пробовал следующее. Но это не работает.

NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:_textField 
                 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual 
                 toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeBottom 
                multiplier:1.0 constant:20]; 
[self.navigationcontroller.view addConstraint:cn]; 
+0

Любое сообщение об ошибке в консоли? –

+0

@Sj., Вы когда-нибудь задумывались над этим? Здесь есть одна и та же проблема - поиск по всему. – Pat

+0

@Pat Проведя некоторое время, я бросил этот подход. Поделитесь своим решением, если найдете его. Благодарю. –

ответ

2

Добавить ограничение между верхней частью текстового поля и верхней частью родительского вида. Константу для ограничения можно установить на высоту строки состояния + высоту панели навигации.

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

Если вы используете построитель интерфейсов, вы также можете создать IBOutlet для существующего ограничения и просто установить его константу, а не создавать новое ограничение.

6

Да, вы можете добавить ограничение между навигационной панелью и видом. Корректор корневого представления, добавленный в контроллер навигации, содержит topLayoutGuide. так настроить свой код так:

NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:_textField 
                 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual 
                 toItem:self.rootViewController.topLayoutGuide attribute:NSLayoutAttributeBottom 
                multiplier:1.0 constant:20]; 
[self.rootViewController.view addConstraint:cn]; 

заметить, что я не ссылающийся на контроллер навигации на всех, кроме RootViewController навигационного контроллера.

Также вы можете использовать bottomLayoutGuide, чтобы пройти выше TabBar таким же образом. (однако, если вам нужно это сделать, вы столкнетесь с ошибкой в ​​инфраструктурах iOS с обходным патчем здесь: UIViews ending up beneath tab bar)

5

Проверьте topLayoutGuide на UIViewController.

Там пример в документ от Apple для `UIViewController», который идет как это ...

topLayoutGuide 
Indicates the highest vertical extent for your onscreen content, for use with Auto Layout constraints. (read-only) 

@property(nonatomic, readonly, retain) id<UILayoutSupport> topLayoutGuide 

А потом ...

В качестве примера того, как программно использовать это свойство с Auto Макет, скажем, вы хотите разместить элемент управления таким образом, чтобы его верхний край был 20 баллов ниже верхнего руководства по расположению. Этот сценарий применим к любому из сценариев, перечисленных выше. Используйте код, подобный следующему:

[button setTranslatesAutoresizingMaskIntoConstraints: NO]; 
id topGuide = myViewController.topLayoutGuide; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (button, topGuide); 
[myViewController.view addConstraints: 
    [NSLayoutConstraint constraintsWithVisualFormat: @"V: [topGuide]-20-[button]" 
               options: 0 
               metrics: nil 
                views: viewsDictionary] 
self.view layoutSubviews; // You must call this method here or the system raises an exception 
]; 
Смежные вопросы