iPhone UIView zインデックスを設定する方法?


252

あるビューを別のビューの上に移動したいのですが、ビューのzインデックスを確認するにはどうすればよいですか。

回答:


279

UIView兄弟は、スーパービューに追加された順にスタックされます。UIView階層のメソッドとプロパティが表示順序を管理することがあります。UIView.hで:

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

- (void)removeFromSuperview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;

兄弟ビューは、subviews配列内で後ろから前に並べられます。したがって、最上位のビューは次のようになります。

[parentView.subviews lastObject];

底面は次のようになります。

[parentView.subviews objectAtIndex:0];

Kolin Krewinkelが言った[parentView bringSubviewToFront:view]ように、ビューが最上位に表示されますが、これはビューが階層内のすべての兄弟である場合にのみ当てはまります。


329

zPositionビューのレイヤ(CALayerオブジェクト)のプロパティを使用して、ビューのZ-indexを変更できます。

theView.layer.zPosition = 1;

以下のようヴィクトルNordlingが追加、「大きな値が一番上にある。あなたが負の値を含む、あなたが望む任意の値を、使用することができます。」デフォルト値は0です。

レイヤーにアクセスするには、QuartzCoreフレームワークをインポートする必要があります。このコード行を実装ファイルの先頭に追加するだけです。

#import "QuartzCore/QuartzCore.h"

7
ヘルパーと同じように、大きな価値は「最優先」です。負の値を含め、任意の値を使用できます。
Viktor Nordling

12
このソリューションは、常にビューを最優先にしたい場合に適しています。zPositionをMAXFLOATに設定するだけ
Muhammad Hassan Nasr

27
レイヤーのzPositionとUIViewの入力ハンドラが2つの異なるZオーダーにあることを学びました。クリックが「通過」するのは本当に奇妙です
スティーブンJ

zPosition作品を作成するために、ビューのスーパービューは同じである必要がありますか?
Hlung

3
ビューは上にありますが、クリックするとその下のオブジェクトに移動します。これはバグと考えるべきです。その下にあるビューのユーザー操作を明示的に無効にする必要なしに、その問題を回避する一般的な方法を見つけようとしています。
Bruce Patin、2015

103

IBとSwift

黄色がスーパービューで、赤、緑、青が黄色の兄弟サブビューであるフローレイアウトを考えると、

ビュー-上部に赤いビュー

目標は、サブビュー(緑色としましょう)を一番上に移動することです。

ビュー-上部にグリーンビュー

インターフェイスビルダーで

インターフェイスビルダーでは、ドキュメントアウトラインのリストの上部に表示するビューを下部にドラッグするだけです。

Interface Builderでのビューの順序

または、ビューを選択してから、メニューで[エディター ] > [配置 ] > [最前面に移動]を選択します。

スウィフトで

これをプログラムで行うには、いくつかの方法があります。

方法1

yellowView.bringSubviewToFront(greenView)
  • この方法は、上記のIBの回答とプログラム的に同等です。

  • サブビューが互いに兄弟である場合にのみ機能します。

  • サブビューの配列はに含まれていyellowView.subviewsます。ここでbringSubviewToFrontは、greenViewインデックス0をからに移動し2ます。これは、

      print(yellowView.subviews.indexOf(greenView))

方法2

greenView.layer.zPosition = 1
  • このメソッドは、レイヤーの3D位置をz軸上で(ユーザーに近い方に)移動するだけです。デフォルトは0他のすべてのビューに対するものであるため、結果は上にあるgreenViewように見えます。ただし、配列のインデックス0には残りyellowView.subviewsます。ただし、これは予期しない結果を引き起こす可能性があります。これは、タップイベントなどが引き続き、インデックス番号が最も大きいビューに最初に移動するためです。そのため、上記の方法1を使用することをお勧めします。
  • zPosition設定することができCGFloat.greatestFiniteMagnitudeCGFloat(FLT_MAX)それが上にあることを保証するために、スウィフトの古いバージョンでは)。

このおかげで...私はこれを理解するために8時間を費やしました。yellowView.bringSubviewToFront(greenView)は完全に機能しました。
MizAkita 2016

興味深いことに、コンテナビューはこれを尊重しません。手動でコード内で移動する必要があるようです。
Fattie


19

XCodeのInterface Builderでこれを行う場合は、[エディター]-> [配置]のメニューオプションを使用できます。「Send to Front」、「Send to Back」などがあります。


アレンジのオプションが無効になっている場合はどうなりますか?
mr5


4

cocos2dを使用している場合、[parentView bringSubviewToFront:view]で問題が発生する可能性がありますが、少なくとも私にとっては機能しませんでした。必要なビューを前面に表示する代わりに、他のビューを送り返しました。

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

2

iOSでzPositionを使用できます

salonDetailViewという名前のビューがある場合、 例:@IBOutlet weak var salonDetailView: UIView!

私の場合、画像を参照してください

GMSMapViewの UIViewがあります。 例:@IBOutlet weak var mapViewUI: GMSMapView!

mapViewUIの上部にあるsalonDetailViewを表示するには

以下のようにzPositionを使用します

salonDetailView.layer.zPosition = 1

OPが簡単に取得できるように、写真とコードを回答の直接ここに投稿してください。
skratchi.at

初心者として、StackOverflowでは申し訳ありませんができません。問題の画像を確認できますi.stack.imgur.com/d9Cx3.png
abhijith k

0

またはこれを使う

- (void)insertSubview:(UIView *)view belowSubview:(UIView*)siblingSubview;

ここに従って

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