2013-09-24 9 views
9

Zuvor in iOS6, meine Chat-Nachrichtenansicht Controller korrekt angezeigt und animiert mit sorgfältig konstruierten Autolayout-Einschränkungen in IB. Hier ist die aktuelle Ansicht Hierarchie mit den entfernt Einschränkungen in Xcode 5:iOS7 Probleme mit NSIBPrototypingLayoutConstraint Autolayout-Einschränkungen von Interface Builder generiert

IB layout

Nach dem Upgrade auf XCode 5 und iOS7, fand ich brauchte ich alle zu löschen, die alten Einschränkungen, um für die Standarddurchscheinend Statusleiste zu berücksichtigen Andernfalls würde meine Symbolleiste unter die Statusleiste fallen. Dies geschah trotz Aufruf von setEdgesForExtendedLayout: mit UIRectEdgeNone.

ich jetzt in viewDidLoad alle Einschränkungen bin versucht, programmatisch zu erstellen:

// 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]; 

Wenn ich jedoch die vertikale Raumbegrenzung zwischen meinem containerView und tableContainerView, erhalte ich Fehler zu ändern versuchen. (. Ich versuche, die tableContainerView, um die Größe mit dem Aussehen der Tastatur schrumpfen)

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

Dies sind die Einschränkungen, die gleichzeitig nicht erfüllen:

(
"<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 ist in diesem Fall _viewTableContainer. 0x140ddef0 = _viewInputContainer. 0x140dddd0 = _viewContainer.

Warum ist das NSIBPrototypingLayoutConstraint V: | - (460) - [UIView: 0x140ddef0 (_viewInputContainer)] von IB erstellt wird, wenn ich translatesAutoresizingMaskIntoConstraints auf NO gesetzt habe, und wenn ich schon eindeutige vertikale Beschränkungen zwischen _viewInputContainer definiert und die _tableView darüber?

Ich habe versucht, Cocoa Layout in Instrumenten zu verwenden, aber es gibt zu viel Lärm, um einen Sinn davon zu machen.

+0

Überprüfen Sie diese sehr ähnliche Frage hier: http: // stackoverflow.com/questions/19015215/probleme mit autolayout-on-uitableviewcell/19020006 # 19020006 – smileyborg

Antwort

18

Ich musste Einschränkungen für die Ansichten zusätzlich zur Verwendung von translatedAutoresizingMaskIntoConstraints manuell entfernen.

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

Nach dem Hinzufügen dieser Änderungen gab es keine weiteren Fehler beim Animieren.

10

Um die von IB generierte NSIBPrototypingLayoutConstraint zu entfernen, kann sie durch Hinzufügen einiger Dummy-Einschränkungen auf der IB gelöst werden, und setzen Sie sie remove at build time. Dann wird IB das NSIBPrototypingLayoutConstraint für Sie nicht generieren.

+2

@smileyborg geben einen [guten Link] (http://stackoverflow.com/a/19020006/419348). Es ist klarer über diese Frage. – AechoLiu

3

Obligatorische Swift:

view.removeConstraints(view.constraints) 

Alternativ, wenn Sie Einschränkungen für eine bestimmte Schnittstelle Element in Code entfernen möchten, können Sie sie für nur ein Objekt entfernen. Hier sind ein paar Beispiele:

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

Dies kann besonders nützlich sein, wenn Sie zum Beispiel eine bezahlte oder kostenlose Version einer App zu schaffen. Sie können den Großteil des Schnittstellenlayouts in Interface Builder verwenden und dann mithilfe von Visual Format Language Änderungen am Layout im Code vornehmen.

+0

Es funktioniert für mich. Vielen Dank! –

Verwandte Themen