9

以前の iOS6 では、チャット メッセージ ビュー コントローラーは、IB で慎重に構築された自動レイアウト制約を使用して正しく表示およびアニメーション化されていました。Xcode 5 で制約が削除された現在のビュー階層を次に示します。

IB レイアウト

XCode 5 と iOS7 にアップグレードした後、デフォルトの半透明のステータス バーを考慮するために、古い制約をすべてクリアする必要があることがわかりました。そうしないと、ツールバーがステータス バーの下に落ちてしまいます。これは、setEdgesForExtendedLayout: を UIRectEdgeNone で呼び出したにもかかわらず発生しました。

現在、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(<=460@999)][_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]-(>=-216@999)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_viewOptions)];
[_viewContainer addConstraints:containerVertConstraints];

ただし、containerView と tableContainerView の間の垂直スペースの制約を変更しようとすると、エラーが発生します。(tableContainerView のサイズを変更して、キーボードの外観に合わせて縮小しようとしています。)

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

同時に満たすことができない制約は次のとおりです。

(
"<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 は _viewTableContainer です。0x140ddef0 = _viewInputContainer. 0x140dddd0 = _viewContainer.

この NSIBPrototypingLayoutConstraint V:|-(460)-[UIView:0x140ddef0(_viewInputContainer)] が IB によって作成されるのはなぜですか?

Instruments で Cocoa Layout を使用してみましたが、ノイズが多すぎて意味がわかりません。

4

3 に答える 3

18

translatesAutoresizingMaskIntoConstraints を使用するだけでなく、ビューの制約を手動で削除する必要がありました。

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

これらの変更を加えた後、アニメーションに関するエラーはなくなりました。

于 2013-09-25T03:07:18.860 に答える
10

IB によって生成された を削除するにNSIBPrototypingLayoutConstraintは、IB にダミーの制約を追加して設定することで解決できますremove at build time。次に、IBを生成しNSIBPrototypingLayoutConstraintません。

于 2015-06-10T07:13:14.773 に答える
3

必須のスイフト:

view.removeConstraints(view.constraints)

または、コード内の特定のインターフェイス項目の制約を削除する場合は、1 つのオブジェクトのみを削除できます。以下にいくつかの例を示します。

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

これは、たとえばアプリの有料または無料バージョンを作成している場合に特に役立ちます。インターフェイス ビルダーでほとんどのインターフェイス レイアウトを作成してから、Visual Format Language を使用してコードでレイアウトを微調整できます。

于 2016-01-25T02:53:00.407 に答える