23

XCode 4.5 の Interface Builder は、一部のビュー (NSButton など) のintrinsicContentSize を尊重しますが、独自のカスタム サブビューでそれを尊重するように説得することはできません。これにより、IB で描画されたレイアウトを強制しようとする追加の制約が IB に追加され、プログラムの実行時に固有のサイズが使用されなくなります。

たとえば、ウィンドウの中央に配置されたボタンと、ウィンドウの中央に配置されたカスタム ビューを考えてみましょう…</p>

中央に配置された NSButton の IB 制約

中央揃えの NSView の IB 制約

カスタム ビューが 4 つの制約を取得していることがわかります。これは、おそらく IB がビューの本質的なコンテンツ サイズを認識していないためです。追加する追加の制約は変更できます。たとえば、代わりに幅と高さを強制することはできますが、それらを削除することはできません。

私はawakeFromNibで余分な制約を検索して削除することでこれに対処していますが、これを行うためのより良い方法があるはずです.

4

3 に答える 3

34

Interface Builder で、プレースホルダー固有のコンテンツ サイズを設定します。

  1. カスタム ビューを選択します。
  2. サイズ インスペクターを表示します (⌘</kbd>Shift5).
  3. [固有サイズ] ドロップダウンを [デフォルト (システム定義)] から [プレースホルダー] に変更します。
  4. ビューの実行時の幅と高さについて妥当な推測を入力してください。

これらの制約はコンパイル時に削除されます。つまり、実行中のアプリには影響しません。レイアウト エンジンは、ビューの を尊重するために実行時に適切な制約を追加しますintrinsicContentSize

于 2014-08-29T19:03:47.940 に答える
12

実際にこれを行う方法、2019

import UIKit

@IBDesignable class TagPerson: ShadowRoundedImageView {

    override var intrinsicContentSize: CGSize {
        var s = super.intrinsicContentSize
        s.height = 40
        s.width = 40
        return s
    }

    override func prepareForInterfaceBuilder() {
        invalidateIntrinsicContentSize()
    }

}

ただし、問題があります。Xcode にはバグがあります。次の方法でリセットできる場合があります。

もちろん、上記は実行時に問題なく動作します。ただし、インターフェースビルダーではランダムに機能しません(11+でも)。

循環させるには、試してください

  1. 通常の「すべてのビューを更新」

  2. 固有のサイズ ビューの 1 つに無意味な制約を付けて削除します。(複数ある場合は、これを 1 つに実行するだけで Xcode を循環させるのに十分であり、すべてが機能することに気付きました。)

  3. そして最後に:

Xcode には「固有のサイズのプレースホルダー」機能があります。

ここに画像の説明を入力

固有サイズの要素を 1 つ以上選択します。奇妙なプレースホルダーを前後に数回切り替えます。多くの場合、それは循環し、ビューは正しく機能します。

最悪の場合、通常の clean-everything で Xcode を再起動すると、動作することがあります。

于 2019-09-03T17:58:05.033 に答える
2

わかりました、ここでのポイントは、Xcodeが IB のカスタム ビューの本質的なContentSize を使用するようにすることです。

これは、IB のカスタム ビュー内に幅と高さが固定されたプレースホルダー ビューを追加することで実現できます(水平方向と垂直方向にも中央揃えにすることができます)。

ここに画像の説明を入力

次に、カスタム ビューを選択し、IB の [編集] メニューから [コンテンツに合わせてサイズ変更] をタップします。この時点で、余分なサイズ定義の制約はすべて削除可能になり、配置のみが残ります。

ここに画像の説明を入力

そうすれば、IB はカスタム ビューのサイズをプレースホルダー ビューに合わせて調整し、Autolayout は- (CGSize)intrinsicContentSize実行時のビューのオーバーライドに依存してカスタム ビューのサイズを決定します。

最後の手順は、プレースホルダー ビューを削除して、ビューがコンテンツとサイズを正しく表示できるようにすることです。

   - (void)viewDidLoad
    {
        [super viewDidLoad];
        [_placeholderView removeFromSuperview];
    }

私はこれがハックであることを知っていますが、うまくいけばあなたを助けます.

于 2013-04-17T09:33:38.367 に答える