6

インターフェイスビルダーでは、「ピン留め」によって「標準」の間隔に一致する「垂直方向のスペース」を取得できます。

ここに画像の説明を入力してくださいここに画像の説明を入力してください

視覚的制約言語では、次の方法で同じことを実行できます。

V:[top]-[bottom]

コード内の2つのビューの間に標準の間隔を追加するにはどうすればよいですか?

UIViewControllerに表示される可能性のある次のようなものを探しています。

NSLayoutConstraint *spacing = ???
[self.view addConstraint spacing];
4

3 に答える 3

6

iOS 11.0(2017年にリリース)の時点で、システム間隔を使用する方法があります。

@interface NSLayoutXAxisAnchor (UIViewDynamicSystemSpacingSupport)
/* Constraints of the form,
 receiver [= | ≥ | ≤] 'anchor' + 'multiplier' * system space, 
 where the value of the system space is determined from information available from the anchors.
 The constraint affects how far the receiver will be positioned trailing 'anchor', per the effective user interface layout direction.
 */
- (NSLayoutConstraint *)constraintEqualToSystemSpacingAfterAnchor:(NSLayoutXAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(macos(11.0),ios(11.0),tvos(11.0));
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToSystemSpacingAfterAnchor:(NSLayoutXAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(macos(11.0),ios(11.0),tvos(11.0));
- (NSLayoutConstraint *)constraintLessThanOrEqualToSystemSpacingAfterAnchor:(NSLayoutXAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(macos(11.0),ios(11.0),tvos(11.0));

@end

@interface NSLayoutYAxisAnchor (UIViewDynamicSystemSpacingSupport)
/* Constraints of the form,
 receiver [= | ≥ | ≤] 'anchor' + 'multiplier' * system space, 
 where the value of the system space is determined from information available from the anchors.
 The constraint affects how far the receiver will be positioned below 'anchor'. 
 If either the receiver or 'anchor' is the firstBaselineAnchor or lastBaselineAnchor of a view with text content
 then the spacing will depend on the fonts involved and will change when those do.
 */
- (NSLayoutConstraint *)constraintEqualToSystemSpacingBelowAnchor:(NSLayoutYAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(macos(11.0),ios(11.0),tvos(11.0));
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToSystemSpacingBelowAnchor:(NSLayoutYAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(macos(11.0),ios(11.0),tvos(11.0));
- (NSLayoutConstraint *)constraintLessThanOrEqualToSystemSpacingBelowAnchor:(NSLayoutYAxisAnchor *)anchor multiplier:(CGFloat)multiplier __attribute__((warn_unused_result)) API_AVAILABLE(macos(11.0),ios(11.0),tvos(11.0));
@end

Swiftでは、次のように使用できます。

let topView: UIView = ...
let bottomView: UIView = ...

bottomView.topAnchor
    .constraint(equalToSystemSpacingBelow: topView.bottomAnchor, multiplier: 1)
    .isActive = true

let leadingView: UIView = ...
let trailingView: UIView = ...

trailingView.leadingAnchor
    .constraint(equalToSystemSpacingAfter: leadingView.trailingAnchor, multiplier: 1)
    .isActive = true
于 2012-10-19T18:38:28.050 に答える
2

ビジュアルフォーマット制約とより冗長な単一制約作成スタイル(「コード内」と言うときに参照しているもの)を組み合わせて一致させることは問題ありません。実際、WWDCでは自動レイアウトについて、「優先」順序について説明しています。制約を作成することは次のように述べられています。

  • インターフェイスビルダー
  • ビジュアルフォーマット
  • 単一制約スタイル

単一の制約スタイルが提供する追加のパワーと柔軟性が必要でない限り(そして、これまでの私の経験では、視覚的な形式が機能しない場所がたくさんあります)、視覚的な形式を使用する必要があります。上からではなく、下から上にリストに近づいているようです。

標準の間隔でビューをレイアウトする必要があり、IBを使用していない場合は、視覚的な形式を使用するのが理にかなっています。ロブが言うように、利用可能な「標準」間隔の定数はありません。すべてに対して単一の制約を主張することで、自分自身のためにはるかに多くの作業を行っています。

于 2012-10-19T19:28:43.303 に答える
0

この質問が投稿されたときから、標準のシステム間隔のデフォルトを使用するための制約APIがリリースされました。

Appleには、これを使用するサンプルコード「セルフサイジングテーブルビューセルの作成」があります。

于 2021-08-17T22:37:35.517 に答える