UIViewのレイヤー処理

2010/12/24

drawRectでUIViewを再描画していて、UIViewのレイヤが入れ替わってしまった(当然だが)。 UIViewの入れ替えはどのGUIアプリでもよく問題となるので、ちょっと調べてみた。

UIView.h

@interface UIView(UIViewHierarchy)に定義されている。

- (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;

- (void)didAddSubview:(UIView *)subview;
- (void)willRemoveSubview:(UIView *)subview;

- (void)willMoveToSuperview:(UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(UIWindow *)newWindow;
- (void)didMoveToWindow;

メソッド名からしてだいたい想像がつくでしょう。 一般的にはViewの単純な追加は addSubview を利用するが、予め設計ができていればむしろinsertSubview系で追加する方が良いかも知れないですね。

レイヤーの入れ替え

view1をview2より前面に表示させるには、

[view1 bringSubviewToFront:view2];

また、UIScrolViewのマウスイベントでページングやスクロールしてしまう場合は、レイヤを変えずにプロパティを無効にする方法もあるか?

scrollView.pagingEnabled = NO;
scrollView.scrollEnabled = NO;