web-dev-qa-db-ja.com

iPhone UIView zインデックスを設定するには?

あるビューを別のビューの上に移動したいのですが、そのビューのzインデックスをどのようにして知ることができますか。

236
Tattat

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]はビューを最上位にしますが、これはビューがすべて階層の兄弟である場合にのみ当てはまります。

272
Nathan Eror

ビューのZインデックスを変更するには、ビューのレイヤーのzPositionプロパティ(CALayerオブジェクト)を使用します。

theView.layer.zPosition = 1;

Viktor Nordling が追加したように、「大きな値が一番上にあります。負の値を含む、好きな値を使用できます。」デフォルト値は0です。

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

#import "QuartzCore/QuartzCore.h"
317

IBとSwift

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

views - red view on top

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

views - green view on top

Interface Builderで

Interface Builderでは、ドキュメントアウトラインの一番上に表示したいビューをリストの一番下にドラッグするだけです。

order of views in Interface Builder

あるいは、ビューを選択して、メニューから[編集]> [配置]> [最前面へ送信]に移動することもできます。

スウィフトで

プログラム的にこれを行うには、2つの異なる方法があります。

方法1

yellowView.bringSubviewToFront(greenView)
  • この方法は、上記のIB回答とプログラム的に同等です。
  • サブビューがお互いの兄弟である場合にのみ機能します。
  • サブビューの配列はyellowView.subviewsに含まれています。ここで、bringSubviewToFrontgreenViewをインデックス0から2に移動します。これはで観察することができます

    print(yellowView.subviews.indexOf(greenView))
    

方法2

greenView.layer.zPosition = 1
  • このメソッドは、レイヤの3D位置をz軸上でより高く(ユーザに近づける)移動させるだけです。他のすべてのビューのデフォルトは0なので、結果はgreenViewが一番上にあるように見えます。ただし、それでも0配列のインデックスyellowView.subviewsに残ります。ただし、タップイベントなどが最も高いインデックス番号を持つビューの先頭に移動するため、これは予期しない結果を引き起こす可能性があります。そのため、上記の方法1を使用することをお勧めします。
  • zPositionCGFloat.greatestFiniteMagnitude(古いバージョンのSwiftではCGFloat(FLT_MAX))に設定して、確実に上になるようにすることができます。
85
Suragch
[parentView bringSubviewToFront:view] ;
72
Kolin Krewinkel

XCodeのInterface Builderを使ってこれを行いたい場合は、Editor-> Arrangementの下のメニューオプションを使うことができます。 "Send to Front"、 "Send to Back"などがあります。

19
larspars

ビュー内で一番上に表示したい...(Swift内)

superview?.bringSubviewToFront(self)
9
Carter Medlin

Cocos2dを使用している場合は、[parentView bringSubviewToFront:view]で問題が発生する可能性があります。少なくとも私にとっては問題はありませんでした。私が望んでいた見解を前面に持っていく代わりに、私は他の見解を送り返してそれがトリックをしました。

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

IosでzPositionを使うことができます

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

私の場合は画像を参照

そして、GMSMapViewのためのUIViewを持っています:@IBOutlet weak var mapViewUI: GMSMapView!

mapViewUIの上にViewsalonDetailViewを表示するには

以下のようにzPositionを使用してください

salonDetailView.layer.zPosition = 1
1
abhijith k