web-dev-qa-db-ja.com

プログラムによるマスクの自動サイズ変更とInterface Builder / xib / nib

Xibで右マージンインジケータを有効にすることは、コード内でUIViewAutoresizingFlexibleLeftMarginなどを使用することと同等であると(おそらく間違って)仮定していました。

だから、私はこのスナップショットに従って考えていました: enter image description here

今日、私はクロスチェックをしなければならず、つまずいたこのスレッド

また、このリンクのタイトル「-自動サイズ変更ルールを使用してレイアウトの変更を自動的に処理する」というタイトルのセクションが付いたAppleドキュメント: https://developer.Apple.com/library/content/ documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html

だから、プログラムで自動サイズ変更マスクを設定することはxib設定と同等であるということについて、私の心の中に新しい概念があります:

シナリオ1(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)のみを設定することは次と同等です:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

XIBで?

シナリオ2:コードで(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)を設定することは次と同等です:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

XIBで?

更新された2つのシナリオは正しいですか?私は今、理解していますか?

217

はい、Interface Builderでは、ある意味で「逆」になっています(または、見方によってはUIView)。引用された「シナリオ」は正しいです。

35
DarkDust

はい、あなたは物事を正しく引用しました。また、私はそれが少し後方に感じることに同意するので、そのため、私はあなたの投稿に感謝します。

UIViewのマージンをあらゆる方向に柔軟にするときに、プリプロセッサマクロUIViewAutoresizingFlexibleMarginsを使用することができます。これをプリコンパイル済みヘッダーファイルに配置して、どこにでも含まれるようにします。

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

UIViewAutoresizingFlexibleMarginsを使用すると、UI要素はいずれかの側面をハグしないため、中央に配置されたままになります。要素を親と一緒に拡大/縮小するには、それぞれUIViewAutoresizingFlexibleWidthUIViewAutoresizingFlexibleHeightを設定します。

UIViewAutoresizingFlexibleMarginsを使用したいのは、後で参照できるためです。

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

の代わりに

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

上記の例のように、これらのマージンが1行でORで結合されていることがよくあります。読みにくい。

47
Sam

Swift 4これを使用

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Objective-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
0
Muhammad Nayab

enter image description here

ボックス内で垂直/水平矢印(スプリングと呼ばれる)を有効にすると、高さ/幅が柔軟になります。ただし、外側の行(ストラットと呼ばれる)を有効にすると、その側は柔軟性がなくなり、柔軟性がなくなります。

左外側の行(左ストラット)を有効にすることは、UIViewAutoresizingFlexibleRightMarginを有効にすることと同じではありません。代わりに、右ストラットが無効の場合、UIViewAutoresizingFlexibleRightMargin =onoff右ストラットが有効な場合。

最初は非常に混乱しますが、よく見ると、スプリングとストラットに違いがあります。 Appleがこれを行った理由はわかりませんが、私にとっては、使いやすい場合がありました。また、コードで反対のプロパティを使用すると、さらに混乱します。