天天看點

iPhone How-to:如何調整UIView的Z-Order

轉自: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了。

​​

iPhone How-to:如何調整UIView的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]];