clipsToBoundsはどのように機能しますか?


110

UIView物件の使い方を知りたいclipsToBounds

公式ドキュメントには次のように書かれています:

clipsToBounds 財産

サブビューがビューの境界に限定されるかどうかを決定するブール値。

議論は、
この値を設定するYES受信機の境界にクリップさせるのサブビュー。に設定するとNO、フレームがレシーバーの可視境界を超えて伸びるサブビューはクリップされません。デフォルト値はNOです。

しかし、これが正確に何を意味するのかは不明です。どのように使用すべきclipsToBoundsですか?このプロパティをYES正確に設定するとどうなりますか?それともNO

回答:


283

私のスーパービューが両側で10単位のボックスであり、私のサブビューが20単位の幅で、にclipsToBounds設定されているYES場合、スーパービューの境界内に収まるサブビューの部分のみが表示されます。それ以外の場合、clipsToBoundsがに設定されているとNO、サブビュー全体が表示されます。スーパービューの外側の部分も表示されます(まだ画面上にあると想定しています)。

視覚的な例として、ストーリーボードに設定された次のビューを検討してください。

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

これは白でUIView、単純な「1」または「2」ので、私はこれらを議論することができることのいずれかでコーナーを左上にあるラベル、view1またはview2ます。また、黒のビューは白のビューと同じサイズですが、原点は白のビューの中央にあります。

ビューコントローラーのviewDidLoadメソッドには、次のコードがあります。

Objective-C:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

迅速:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

コードを実行してシミュレーターまたはデバイスを確認すると、次の結果が得られます。

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

したがって、これらのビューは同じように設定されているにもかかわらず(を除くclipsToBounds)、見た目が異なります。これが何をするかclipsToBoundsです。に設定YESすると上位の結果が提供され、に設定するとNO下位の結果が提供されます。

ビュー階層をデバッグすると、両方のブラックボックスが実際に白いビューの境界を越えて拡張されていることがより明確にわかりますが、ビュー2のみがアプリが実際に実行されているときにこれを示しています。

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


3
素晴らしい答え!よくやった。でも質問があります。プロパティがに等しいUITextView場合、シャドウが表示されないのはなぜですか。?であれば、問題なく動作しますclipsToBoundstruefalse
Mannopson 2017

1
注:clipsToBoundsを変更するのは親ビューです。したがって、viewBがviewAのサブビューである場合。clipsToBoundsをtrueにする必要があるのはviewAです。
aestusLabs

そのビューの元のビューフレームからどのビューが表示されるかは、タップジェスチャが機能していることを確認します。
Pravin Tate、

2

これは、受け入れられた回答と比べて、簡潔な迅速な回答であることを意味します

Appleがこのプロパティの名前を変更する場合は、次のように名前を付けますclipSubviewsToBounds

コードのバグに遭遇しました。親ビューの高さがに設定された場所0。私たちは、その要素がどれも表示されないと予想していました。しかし、親ビューのコンテンツが表示されていました。

clipToBounds設定されていなかったためtrueです。いったん設定するtrueと、サブビューの高さはを超えて拡張できない0ため、まったく表示されません。


この答えは
かなり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.