3

Auto Layout を学習してレイアウト テクニックを改善しようとしてきましたが、解決できなかった問題に出くわしました。

何が起こるかは次のとおりです。とりわけ、 aUITableViewと aを含むビューコントローラーがありUIViewます。このビューはテーブル ビューのすぐ下に配置され、その高さは画面全体の高さには達しません (上半分を占めるとしましょう)。

グループ化されたスタイルを使用し、前述のビューのすぐ上に配置されたテーブル ビューには、半透明の背景があるため、そのすぐ下のビューの内容を実際に見ることができます。ただし、ビューは画面の半分を占めるため、最初にビュー コントローラーを読み込むときに背景のコンテンツ全体がはっきりと見えるようにするには、このテーブル ビューに tableHeaderView (これも半透明) を追加する必要があります。

これの最終的な効果は、テーブル ビューを上にスクロールすると背景に表示されなくなる固定の tableHeaderView のようなものです。

これは、スプリングとストラットを使用した簡単な方法で行われますが、テーブル ビューにヘッダーを追加しようとするたびに (どのように行っても)、Auto Layout によってアプリがクラッシュします。

バックグラウンド (otherView) のビューの高さと tableHeaderView の高さを常に一致させる方法を探しているので、次を使用しています。

[self.view addConstraint:[NSLayoutConstraints constraintWithItem:headerView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:otherView attribute:NSLayoutAttributeHeight multiplier: 1 constant:0]];

( otherView はその子ではないため、制約をテーブルビューに直接追加できないことは私の理解です)

また:

[headerView setTranslatesAutoResizingMaskIntoConstraints:NO]

これらの呼び出しは常にこのクラッシュを引き起こします:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'

これを行う方法はありますか?自動レイアウトを使用して、実際に tableHeaderView の高さをビューの別の要素に結び付けることは可能ですか?

また、私は長い間 IB から離れていたことにも注意する必要があります。そのため、これはすべて純粋にコードで、特にloadView.

4

1 に答える 1

0

NSLayoutConstraint のインスタンス変数を作成し、次のように設定した場合:

headerViewHeightConstraint = [NSLayoutConstraint constraintWithItem:headerView
                                                          attribute:NSLayoutAttributeHeight
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:nil
                                                          attribute:NSLayoutAttributeNotAnAttribute
                                                         multiplier:1.0f
                                                           constant:otherView.frame.size.height];

次の方法でサイズを変更できます。

headerViewHeightConstraint.constant = 1000.0f;
[headerView updateConstraintsIfNeeded];

PS:addConstraints:は と同じではないことに注意してaddConstraint:ください。

addConstraints制約の配列と組み合わせて使用​​されるか、[NSLayoutConstraints constraintsWithVisualFormat:...]

addConstraint:上記の例である単一の制約と組み合わせて使用​​されます。

最初の行でlayoutSubviews:callをオーバーライドしている場合。[super layoutSubviews]これにより、ビューとそのサブビューが強制的にレイアウトされるため、フレームの詳細などにアクセスできます。

于 2013-08-18T12:41:03.717 に答える