2013-03-30 1 views
3

Я создал простое приложение iOS, которое создает UIViewController с представлением в нем. Вот приложение делегат:UIWindow создание NSAutoresizingMaskLayoutConstraints вместо NSLayoutConstraint

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
self.viewController = [[ViewController alloc] init]; 
self.window.rootViewController = self.viewController; 
[self.window makeKeyAndVisible]; 

Вот код в UIViewController:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.translatesAutoresizingMaskIntoConstraints = NO; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    NSLog(@"breakpoint here"); 
} 

я поставил точку останова на «точку останова здесь» линии. Побежал приложение и напечатал это после того, как он пошел в отладчике:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace] 
$0 = 0x0a056d30 
*<UIWindow:0x8078de0> 
| *<UIView:0xa053fe0> 

А вот горизонтальные ограничения на этой UIView:

(lldb) po [0xa053fe0 constraintsAffectingLayoutForAxis:0] 
$1 = 0x0a05ba60 <__NSArrayM 0xa05ba60>(
<NSLayoutConstraint:0xa059560 H:|-(0)-[UIView:0xa053fe0](LTR) (Names: '|':UIWindow:0x8078de0)>, 
<NSLayoutConstraint:0xa0595e0 UIView:0xa053fe0.right == UIWindow:0x8078de0.right>, 
<NSAutoresizingMaskLayoutConstraint:0x8571520 h=--- v=--- H:[UIWindow:0x8078de0(768)]> 
) 

Так вот простой вопрос, поэтому я лучше понимаю. Если предполагается, что автоматическое отключение должно быть новым, а не авторезистированием масок, почему UIWindow заставляет NSAutoresizingMaskLayoutConstraint? Есть ли другой инициализатор, который я должен использовать, чтобы заставить UIWindow использовать регулярные ограничения? Возможно, виноват initWithFrame в моем UIWindow?

Спасибо!

+0

Вы используете раскадровки или код, чтобы сделать интерфейс? – JoePasq

+0

все в коде – Larry

ответ

0

Мое понимание заключается в том, что без достаточных ограничений виды и UIWindow будут возвращаться к автоматическим маскам.

Ограничения должны определять размер и происхождение. Без достаточных ограничений Auto Layout не сможет их определить.

Auto Layout by Example на WWDC 2012 должен помочь.

(У вас возникли проблемы с автоматическим изменением маски UIWindow в? В моем коде я транслирует, и только отключить его, где я использую Автокомпоновку, я только начиная с Auto Layout, хотя.)

+0

проблема с моим кодом, я уже отключил все авторезистирующие маски. (если я не пропустил что-то?). мой вопрос в основном, с помощью кода, как я могу сделать так, чтобы не создавались маски nsautoresize для любых просмотров или даже nswindows? – Larry

+0

Я понимаю, что вам нужно больше ограничений. Достаточно однозначно определить размер (ширина и высота) и положение (x и y). Помогает ли это? – JoePasq

2

По умолчанию, UIWindow и вид сверху контроллера создаются с помощью translatesAutoresizingMaskIntoConstraints=YES, чтобы помочь в переходе. От cocoa-dev:

По умолчанию Xcode установит значение translatesAutoresizingMaskIntoConstraints в YES для представлений верхнего уровня, включая те, которые загружаются для контроллера вида. Причина этого также является переходной: прямо сейчас подклассы AppKit видят, что subviews с translatesAutoresizingMaskIntoConstraints установлены в YES, и большинство приложений переходит. Возможно, когда-нибудь в будущем значение по умолчанию будет изменено на NO.

Вы можете отключить использование кода, но вы не можете изменить это поведение в предоставленном Apple. Вы можете использовать swizzling, чтобы выполнить это, но больше гражданских писать дополнительные строки:

self.window.translatesAutoresizingMaskIntoConstraints = NO; // application:didFinishLaunchingWithOptions: 
self.view.translatesAutoresizingMaskIntoConstraints = NO; // viewWillAppear: