クリッピングとグループ化を行うためにレイアウト内に UIView がありますが、縮小すると自動レイアウトによってサイズが変更されます。高さを固定したいのですが、唯一のオプションは上下のスペースを設定することです。
明示的な高さの制約を設定する方法はありますか?
クリッピングとグループ化を行うためにレイアウト内に UIView がありますが、縮小すると自動レイアウトによってサイズが変更されます。高さを固定したいのですが、唯一のオプションは上下のスペースを設定することです。
明示的な高さの制約を設定する方法はありますか?
この回答を見つけました (自動レイアウト制約: サイズ変更時にビューの幅と高さの比率を維持する方法は? )。これは私の実装がどのように見えるかです:
- (void)awakeFromNib
{
[super awakeFromNib];
NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:self.frame.size.height];
[self addConstraint:con1];
}
はい、いいえ。AutoLayout では、UIView のサイズに制約を設定することはできませんが、UIView が固有のサイズを超えて「圧縮」されるのを防ぐことはできます。
これにより、ビューが効果的に制約されますが、親ビューによって子ビューが強制的に特定のサイズになる危険性が回避されます (したがって、AutoLayout の「自動」部分が削除されます)。
これらの優先順位を設定するには、次を使用します。setContentCompressionResistancePriority:forAxis:
カスタム ビューでは、コンテンツに基づいて、作成時に両方の向きのデフォルト値を設定する必要があります。通常は、NSLayoutPriorityDefaultLow または NSLayoutPriorityDefaultHigh に設定します。ユーザー インターフェイスを作成するとき、レイアウト設計者は、インターフェイスで使用されているビューの自然な優先順位とは異なるトレードオフが全体的なレイアウト設計で必要な場合に、特定のビューのこれらの優先順位を変更できます。
サブクラスはこのメソッドをオーバーライドすべきではありません。
さて、ビューが固有のサイズよりも小さくなるのを避けるために優先度を割り当てる方法はわかりましたが、固有のサイズをどのように設定すればよいのでしょうか?
標準の UI 要素を使用している場合は、すでに設定されています。- (CGSize)intrinsicContentSize
ただし、UIView がカスタムの場合は、正しいサイズを返すようにオーバーライドする必要があります。ここでは、ビューが正しい寸法を計算する必要があるサブビューを測定できます。または、アートワーク/一定サイズの要素を使用している場合は、ハードコーディングされた値を返すことができます。
繰り返しますが、AppleUIView
ドキュメントから:
通常、カスタム ビューには、レイアウト システムが認識しないコンテンツが表示されます。このメソッドをオーバーライドすると、カスタム ビューは、そのコンテンツに基づいて必要なサイズをレイアウト システムに伝えることができます。たとえば、変更された高さに基づいて変更された幅をレイアウト システムに動的に伝達する方法がないため、この固有のサイズはコンテンツ フレームから独立している必要があります。
Appleは、UIView の外側にあるもの (スーパー ビューのサイズを取得して微調整するなど) を検査しないことを強くお勧めします。これは、AutoLayout の目的ではないためです (そして、後で頭痛の種になる可能性があります)。
=> 明示的な高さと幅の制約を設定できるポップオーバーが表示されます。
はい、高さを固定できます。
各次元で少なくとも 2 つの制約を指定する必要があるため、固定の高さの制約を追加するまで、上部または下部のスペースを削除できません。IB でビューを選択すると、ビュー エディターの右下に 3 つのアイコンがあるボタンが表示されます。中央のアイコンを押して [高さ] を選択します。これにより、高さの制約が追加されます。これで、下部または上部のスペースを削除して、必要に応じてサイズ インスペクタでクリックして高さの制約を編集できます。
上部のスペースと下部のスペースを与える必要はありません。スーパービューの下部から 8 ピクセルの下部制約がある場合、常に子ビューのサイズを変更してスーパー ビュー内に収まるようにします (優先度を設定するかどうかによって異なります)。
高さの制約に下部スペースの制約よりも高い優先順位を与えることができるため、それらが競合している場合、高さの制約を強制し、下部の制約を無視することを選択します。
制約の場合、4 つの制約 (上、下、左、右) は必要ありません。必要なのは、垂直と水平の 2 つだけです。残りは autolay out によって計算されます。
下部の制約を削除するだけで、子ビューが切り取られます。
これを試して
view.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;