縦向きの場合は上から300ピクセル下に、横向きの場合は上から約175ピクセルのテーブルビューを表示する必要があります。
必要なVFLロジックを理解できないようです。
縦向きの場合は上から300ピクセル下に、横向きの場合は上から約175ピクセルのテーブルビューを表示する必要があります。
必要なVFLロジックを理解できないようです。
多くの自動レイアウトの問題と同様に、はい、あなたが求めていることを行うことができますが、それは明らかではありません. 正確に 300pt または 175pt が本当に必要な場合は、回転時に上部の制約を調整したくなるかもしれません。
ただし、回転イベントを処理せずにこれを行う方法を知りたい場合は、次のことができます。
必要な最小上部余白を 175 に設定します。
優先度の低い優先トップ マージンを 300 に設定します (これはランドスケープでは満たされません)。と
あまり明白ではありませんが、必要な最小の高さも必要です (ランドスケープでは、上部のマージンを 300 にするための優先度の低い要求を満たさないことがわかります)。
たとえば、次のように使用できます (明らかに、下のマージン 5 を意味のあるものに置き換えますが、それに応じてテーブルビューの最小の高さを調整します)。
@"V:|-(>=175)-[tableView(>=120)]-5-|"
と組み合わせ:
@"V:|-(300@500)-[tableView]"
(明らかに、横軸にも制約がありますが、簡潔にするために省略します。)
確かに、テーブルの高さの最小値を正確に指定しなければならないことは、漠然と魅力的ではありませんが、300pt のオプションの上部スペースを適切に満たす必要がない状況で autolayout を伝える方法は他にありませんでした。
のy = mx + b式を使用してこれを行うこともできますconstraintWithItem
。はい、Visual Format Language でこれを行う方法を尋ねられたことは知っていますが、を使用する場合はconstraintWithItem
、テーブルの最小の高さを指定する必要はなく、次のように上余白を設定するだけで済みます。
constraint = [NSLayoutConstraint constraintWithItem:self.tableView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.tableView.superview
attribute:NSLayoutAttributeBottom
multiplier:multiplier
constant:constant];
明らかに、秘訣は、縦向きで 300 pt、横向きで 175 pt になるようにmultiplier
andを決定する方法です。constant
少し代数を行うと、これらの値を次のように計算できることがわかります。
CGFloat multiplier = (300.0 - 175.0) / (superviewPortraitHeight - superviewLandscapeHeight);
CGFloat constant = 175.0 - superviewLandscapeHeight * multiplier;
(また、テーブルビューがあいまいに定義されないように、他の制約を指定すると仮定します。たとえば、Visual Format Language で実行できる左、右、および下の制約を設定します。)
とにかく、回転コールバック メソッドのコードで変更せずに特定の距離を実行するように設定する方法はないと思います。IB の制約に対して IBOutlet を作成し (con1 と呼びましょう)、その制約を初期値 300 にすると、回転コールバック メソッドでその定数を変更できます。
self.con1.constant = 175;
編集後:
これは機能します:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
con1.constant = 175;
}else{
con1.constant = 300;
}
}