轉自:http://bj007.blog.51cto.com/1701577/541572
在界面設計中,最終使用者看到的呈現通常是由不同層的視圖組成的,通過控制視圖的層次就可以實作不同的效果和功能。而視圖的層次也通常被稱為Z-Order或者Z-Index(如下圖)。在很多UI庫中,一個視圖的Z-Order通常都是通過自身相關的一些接口實作,但iPhone為了細分視圖中父控件和子控件之間的責任,将這部分功能劃分到了父控件實作。這樣如果要将一個視圖置于最上面,原來可能隻需要view.bringToFront(),在iPhone中就需要 view.superView.bringToFront(view)。這樣的間接讓一部分人(包括我自己)感覺到不習慣,為此我們可以給UIView添加一個Z-Order相關的Category以避免了這種間接,這樣我們就可以用我們習慣的方式來控制視圖的Z-Order了。

UIView的Z-Order Category的代碼如下:
聲明:
@interface UIView (Z-Order)
-(int)getSubviewIndex;
-(void)bringToFront;
-(void)sendToBack;
-(void)bringOneLevelUp;
-(void)sendOneLevelDown;
-(BOOL)isInFront;
-(BOOL)isAtBack;
-(void)swapDepthsWithView:(UIView*)swapView;
@end
實作:
@implementation UIView(Z-Order)
-(int)getSubviewIndex
{
return [self.superview.subviews indexOfObject:self];
}
-(void)bringToFront
[self.superview bringSubviewToFront:self];
-(void)sendToBack
[self.superview sendSubviewToBack:self];
-(void)bringOneLevelUp
int currentIndex = [self getSubviewIndex];
[self.superview exchangeSubviewAtIndex:currentIndex withSubviewAtIndex:currentIndex+1];
-(void)sendOneLevelDown
[self.superview exchangeSubviewAtIndex:currentIndex withSubviewAtIndex:currentIndex-1];
-(BOOL)isInFront
return ([self.superview.subviews lastObject]==self);
-(BOOL)isAtBack
return ([self.superview.subviews objectAtIndex:0]==self);
-(void)swapDepthsWithView:(UIView*)swapView
[self.superview exchangeSubviewAtIndex:[self getSubviewIndex] withSubviewAtIndex:[swapView getSubviewIndex]];