2013-09-24 14 views
6

Ho appena creato un progetto iOS vuoto per un 'Single View Application' che si rivolge iOS7, ma quando ho eseguito il progetto vuoto e controllato il mio viewtree digitando:iOS7 layout di layout automatico vuoto già ambiguo

po [[UIWindow keyWindow] _autolayoutTrace] 

ho ottenuto il risultato che le due guide di layout sono già ambigui

*<UIWindow:0x108f537f0> - AMBIGUOUS LAYOUT 
| *<UIView:0x109409850> 
| | *<_UILayoutGuide:0x109409c10> - AMBIGUOUS LAYOUT 
| | *<_UILayoutGuide:0x10940a540> - AMBIGUOUS LAYOUT 

c'è una ragione per liberarsi di quegli avvertimenti - o posso semplicemente ignorarli?

risposta

5

È possibile ignorarli se non volete usare Autolayout o andare in Interface Builder e aggiungere i layout da soli (si può anche lasciare XCode aggiungere i layout che ritiene siano necessarie)

enter image description here

+1

Desidero utilizzare l'autolayout, ma perché le viste "autoadded" sono già ambigue? –

+0

Basta andare al generatore di interfacce e lasciare che XCode aggiunga i layout suggeriti, permettimi di aggiungere un'acquisizione –

+1

grazie - penso sia ancora strano che le loro opinioni siano ambigue, ma è bello sapere che posso ignorarlo. –

5

E ' era la stessa cosa con iOS 6.

Suppongo che a volte ci voglia del tempo perché i vincoli si "calmino" e non sia ambiguo. Secondo il video del WWDC 2012 "Best practice per la gestione del layout automatico", l'ambiguità può essere temporaneamente tollerata (diversamente dall'insatisfabilità, che solleva immediatamente un'eccezione).

Se si vuole dimostrare a se stessi che i vincoli non sono rimasti ambiguo, quindi creare un wrapper per [[UIWindow keyWindow] _autolayoutTrace] e chiamare dopo un breve ritardo:

- (void)viewDidAppear:animated 
{ 
    [super viewDidAppear:animated]; 

    [self performSelector:@selector(wrapperForLoggingConstraints) withObject:nil afterDelay:.3]; 
} 

- (void)wrapperForLoggingConstraints 
{ 
    [[UIWindow keyWindow] _autolayoutTrace]; 
} 

È necessario creare una categoria a UIWindow al fine di arrivare a questo lavoro:

@interface UIWindow() 

+ (UIWindow *)keyWindow; 
- (NSString *)_autolayoutTrace; 

@end 

ho messo questa categoria nel proprio file di intestazione, UIWindow_AutoLayoutDebug.h

Dove mai io chiamo [[UIWindow keyWindow] _autolayoutTrace] nella mia app, ho importare UIWindow_AutoLayoutDebug.h

ho imparato di chiamare [[UIWindow keyWindow] _autolayoutTrace] nel codice dal libro "iOS 6 tutorial", Volume 1, da il team di raywenderlich.com. L'idea di ritardare la chiamata è mia.

+0

Qualcuno può verificare che questo trucco sia legittimo? Ho avuto diversi avvisi di LAYOUT AMBIGUOUS in una vista dopo aver chiamato _autolayoutTrace in viewDidAppear. Dopo aver chiamato _autolayoutTrace dopo un .3 secondo ritardo sono tutti spariti. Voglio solo sapere se questo può essere considerato affidabile, sto ancora imparando il layout automatico e voglio essere sicuro che tutto vada bene. – jmurphy

+0

Questo non funzionerà per me perché non verrà compilato. Puoi solo chiamare _autolayoutTrace all'interno di una sessione lldb. Non verrà compilato come scritto sopra. Puoi chiamare il metodo UIView 'hasAmbiguousLayout', ma questo ti dice di una singola vista, non dei suoi decedenti. Per fare ciò, si dovrebbe scrivere un metodo per ricevere tutte le sottoview e chiamare hasAmbiguousLayout su ognuna di esse. Ricorda, solo per il tempo di sviluppo, non per il codice di spedizione. – idStar

+1

@idStar devi creare una categoria su UIWindow (vedi risposta aggiornata) – bilobatum

Problemi correlati