2013-09-24 17 views
9

Precedentemente in iOS6, il controller della vista del messaggio di chat veniva visualizzato e animato correttamente con vincoli di autolayout accuratamente strutturati in IB. Ecco l'attuale gerarchia della vista con i vincoli rimossi in Xcode 5:Problemi iOS7 con NSIBPrototypingLayoutCalcoli di autolayoutConstraint generati da Interface Builder

IB layout

Dopo l'aggiornamento a XCode 5 e iOS7, ho trovato che mi serviva per cancellare tutti i vecchi vincoli al fine di spiegare la barra di stato traslucido di default , altrimenti la mia barra degli strumenti cadrebbe sotto la barra di stato. Questo è successo nonostante abbia chiamato setEdgesForExtendedLayout: con UIRectEdgeNone.

Ora sto cercando di creare tutti i vincoli di programmazione in viewDidLoad:

// self.view.translatesAutoresizingMaskIntoConstraints = NO; // errors either way 
NSArray *viewHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_toolbar]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_toolbar)]; 
[self.view addConstraints:viewHorizConstraints]; 
viewHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_viewContainer]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_viewContainer)]; 
[self.view addConstraints:viewHorizConstraints]; 

NSArray *viewVertConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(20)-[_toolbar(44)]-[_viewContainer]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_toolbar, _viewContainer)]; 
[self.view addConstraints:viewVertConstraints]; 

NSArray *tableContainerVertConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_tableView(<[email protected])][_viewInputContainer(44)]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tableView, _viewInputContainer)]; 
[_viewTableContainer addConstraints:tableContainerVertConstraints]; 


NSArray *containerVertConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_viewTableContainer][_viewOptions]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_viewTableContainer, _viewOptions)]; 
[_viewContainer addConstraints:containerVertConstraints]; 

// _constraintContainerVertSpace = [NSLayoutConstraint constraintWithItem:_viewTableContainer attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:_viewContainer attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]; // same as below 

containerVertConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[_viewTableContainer]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_viewTableContainer)]; 
_constraintContainerVertSpace = [containerVertConstraints lastObject]; 
[_viewContainer addConstraint:_constraintContainerVertSpace]; 

containerVertConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=0)-[_viewOptions]-(>[email protected])-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_viewOptions)]; 
[_viewContainer addConstraints:containerVertConstraints]; 

Tuttavia, se si tenta di modificare il vincolo spazio verticale tra il mio containerView e tableContainerView, ottengo errori. (. Sto cercando di ridimensionare il tableContainerView a ridursi con l'aspetto della tastiera)

[UIView animateWithDuration:0.25f 
         delay:0 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 
        _constraintContainerVertSpace.constant = -keyboardHeight; 
       } completion:nil]; 

Questi sono i vincoli che non riescono a soddisfare simultaneamente:

(
"<NSIBPrototypingLayoutConstraint:0x140d7bb0 'IB auto generated at build time for view with fixed frame' V:|-(460)-[UIView:0x140ddef0] (Names: '|':UIView:0x140dde60)>", 
"<NSIBPrototypingLayoutConstraint:0x140d7c10 'IB auto generated at build time for view with fixed frame' V:[UIView:0x140ddef0(44)]>", 
"<NSLayoutConstraint:0x14d9db30 V:[UIView:0x140ddef0]-(0)-| (Names: '|':UIView:0x140dde60)>", 
"<NSIBPrototypingLayoutConstraint:0x140e0290 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UIView:0x140dde60] (Names: '|':UIView:0x140dddd0)>", 
"<NSLayoutConstraint:0x14d9df60 V:[UIView:0x140dde60]-(-216)-| (Names: '|':UIView:0x140dddd0)>", 
"<NSIBPrototypingLayoutConstraint:0x140e0830 'IB auto generated at build time for view with fixed frame' V:|-(64)-[UIView:0x140dddd0] (Names: '|':UIView:0x140e0470)>", 
"<NSLayoutConstraint:0x14d9d820 V:[UIView:0x140dddd0]-(0)-| (Names: '|':UIView:0x140e0470)>", 
"<NSAutoresizingMaskLayoutConstraint:0x1403a0b0 h=--& v=--& V:[UIView:0x140e0470(568)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x14d9db30 V:[UIView:0x140ddef0]-(0)-| (Names: '|':UIView:0x140dde60)> 

UIView: 0x140dde60 in questo caso è _viewTableContainer. 0x140ddef0 = _viewInputContainer. 0x140dddd0 = _viewContainer.

Perché questo NSIBPrototypingLayoutConstraint V: | - (460) - [UIView: 0x140ddef0 (_viewInputContainer)] viene creato da IB quando ho impostato translatesAutoresizingMaskIntoConstraints di NO, e quando ho già definito vincoli verticali non ambigui tra il _viewInputContainer e il _tableView sopra di esso?

Ho provato a utilizzare Cocoa Layout in Strumenti, ma c'è troppo rumore per dare un senso a tutto ciò.

+0

Dai un'occhiata a questa domanda molto simile qui: http: // StackOverflow.it/questions/19015215/trouble-with-autolayout-on-uitableviewcell/19020006 # 19020006 – smileyborg

risposta

18

Ho dovuto rimuovere manualmente i vincoli sulle viste oltre a utilizzare translatesAutoresizingMaskIntoConstraints.

[_viewContainer removeConstraints:_viewContainer.constraints]; 
[self.view removeConstraints:self.view.constraints]; 

Dopo aver aggiunto queste modifiche, non c'erano più errori con l'animazione.

10

Per rimuovere NSIBPrototypingLayoutConstraint generato da IB, è possibile risolverlo aggiungendo alcuni vincoli fittizi sull'IB e impostarli su remove at build time. Quindi, IB non genererà lo NSIBPrototypingLayoutConstraint per te.

+2

@smileyborg danno un [buon collegamento] (http://stackoverflow.com/a/19020006/419348). È più chiaro su questa domanda. – AechoLiu

3

obbligatorio Swift:

view.removeConstraints(view.constraints) 

In alternativa, se si desidera rimuovere i vincoli per un particolare elemento di interfaccia nel codice, è possibile rimuoverli per un solo oggetto. Ecco alcuni esempi:

myTableView.removeConstraints(myTableView.constraints) 
myButton.removeConstraints(myButton.constraints) 
myImageView.removeConstraints(myImageView.constraints) 

Questo può essere particolarmente utile se si è, ad esempio, la creazione di una versione a pagamento o gratuitamente un app. È possibile eseguire la maggior parte del layout dell'interfaccia nel generatore di interfacce e apportare modifiche al layout nel codice utilizzando Visual Format Language.

+0

Funziona per me. Grazie! –

Problemi correlati