web-dev-qa-db-ja.com

サブビューはスーパービューlayer.borderの下に表示されますか?

UIViewがあり、次の方法で境界線を定義しています。

self.layer.borderColor = [UIColor blackColor].CGColor;
self.layer.borderWidth = 3;

このUIViewにサブビューを添付し、サブビューを境界線上に移動すると、その下に移動します。これは意図された動作ですか?サブビューをその上に配置する方法はありますか?

34
Ser Pounce

Apple仕様 によると:It is composited above the receiver’s contents and sublayers.

そのため、サブビューを前面に表示した場合でも、境界線は常にすべてのサブビューの上になります。

だから私は境界線を偽造するために背景ビューを作成します。

例えば。:

UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
backgroundView.backgroundColor = [UIColor blackColor];
backgroundView.clipsToBounds = NO;

UIView *bView = [[UIView alloc] initWithFrame:CGRectInset(backgroundView.bounds, 3, 3)];
bView.backgroundColor = [UIColor redColor];

UIView *cView = [[UIView alloc] initWithFrame:CGRectMake(-50, -50, 100, 100)];
cView.backgroundColor = [UIColor yellowColor];
[bView addSubview:cView];

[backgroundView addSubview:bView];

[self.window addSubview:backgroundView];

と効果:

enter image description here

44
Guo Luchuan

ビューの構造によっては、メインビューのにサブビューを追加する方が簡単な場合があります。その後、メインビューとオーバーラップし、要求に応じて境界線をオーバーレイします。

1
northernman

自分に合った特定の位置にレイヤーを挿入します:

self.layer.insertSublayer(sublayer, at: 0)
0
hasan

スーパービューの「clipsToBounds」プロパティを「はい」に設定してみましたか?これはパフォーマンス上の理由からデフォルトでNOに設定されていますが、yesに設定すると、探している効果が得られる場合があります。

0
D.C.