あるビューを別のビューの上に移動したいのですが、そのビューのzインデックスをどのようにして知ることができますか。
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]
はビューを最上位にしますが、これはビューがすべて階層の兄弟である場合にのみ当てはまります。
ビューのZインデックスを変更するには、ビューのレイヤーのzPosition
プロパティ(CALayer
オブジェクト)を使用します。
theView.layer.zPosition = 1;
Viktor Nordling が追加したように、「大きな値が一番上にあります。負の値を含む、好きな値を使用できます。」デフォルト値は0です。
レイヤーにアクセスするにはQuartzCoreフレームワークをインポートする必要があります。このコード行を実装ファイルの先頭に追加するだけです。
#import "QuartzCore/QuartzCore.h"
IBとSwift
黄色がスーパービューで、赤、緑、青が黄色の兄弟サブビューである流れるようなレイアウトを考えると、
目標はサブビュー(緑色としましょう)を一番上に移動することです。
Interface Builderでは、ドキュメントアウトラインの一番上に表示したいビューをリストの一番下にドラッグするだけです。
あるいは、ビューを選択して、メニューから[編集]> [配置]> [最前面へ送信]に移動することもできます。
プログラム的にこれを行うには、2つの異なる方法があります。
方法1
yellowView.bringSubviewToFront(greenView)
サブビューの配列はyellowView.subviews
に含まれています。ここで、bringSubviewToFront
はgreenView
をインデックス0
から2
に移動します。これはで観察することができます
print(yellowView.subviews.indexOf(greenView))
方法2
greenView.layer.zPosition = 1
0
なので、結果はgreenView
が一番上にあるように見えます。ただし、それでも0
配列のインデックスyellowView.subviews
に残ります。ただし、タップイベントなどが最も高いインデックス番号を持つビューの先頭に移動するため、これは予期しない結果を引き起こす可能性があります。そのため、上記の方法1を使用することをお勧めします。zPosition
をCGFloat.greatestFiniteMagnitude
(古いバージョンのSwiftではCGFloat(FLT_MAX)
)に設定して、確実に上になるようにすることができます。[parentView bringSubviewToFront:view] ;
XCodeのInterface Builderを使ってこれを行いたい場合は、Editor-> Arrangementの下のメニューオプションを使うことができます。 "Send to Front"、 "Send to Back"などがあります。
ビュー内で一番上に表示したい...(Swift内)
superview?.bringSubviewToFront(self)
Cocos2dを使用している場合は、[parentView bringSubviewToFront:view]で問題が発生する可能性があります。少なくとも私にとっては問題はありませんでした。私が望んでいた見解を前面に持っていく代わりに、私は他の見解を送り返してそれがトリックをしました。
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
IosでzPositionを使うことができます
salonDetailViewという名前のビューがある場合、例:@IBOutlet weak var salonDetailView: UIView!
そして、GMSMapViewのためのUIViewを持っています:@IBOutlet weak var mapViewUI: GMSMapView!
mapViewUIの上にViewsalonDetailViewを表示するには
以下のようにzPositionを使用してください
salonDetailView.layer.zPosition = 1