天天看點

UIView(UIViewHierarchy)視圖層級

在app上看得見的摸得着的都是

UIView

以及它的子類對象。

UIWindow

UILabel

UIPickerView

UIProgressView

UIActivityIndicatorView

UIImageView

UITabBar

UIToolbar

UINavigationBar

UITableViewCell

UIActionSheet

UIAlertView

UIScrollView

UISearchBar

UIWebView

UIControl

這些類的父類都是

UIView

UIView

的方法和屬性這些子類都可以使用,是以

UIView

在iOS開發中非常重要。

  1. view

    的父視圖
    @property(nonatomic,readonly) UIView *superview;
               
  2. view

    的所有子視圖。這是個數組,當需要

    view

    上的某個子視圖時根據數組下标取或周遊出來
    @property(nonatomic,readonly,copy) NSArray *subviews;
               
  3. view

    的視窗
    @property(nonatomic,readonly) UIWindow *window;
               
  4. 從父視圖上移除
    - (void)removeFromSuperview;
               
  5. 插入一個子視圖,并指定索引位置
    - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
               
  6. 交換兩個位置的子視圖
    - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;
               
  7. 添加一個子視圖
    - (void)addSubview:(UIView *)view;
               
  8. 插入一個子視圖在某個子視圖的下面
    - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
               
  9. 插入一個子視圖在某個子視圖的上面
    - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
               
  10. 将一個子視圖移到前面
    - (void)bringSubviewToFront:(UIView *)view;
               
  11. 将一個子視圖移到後面
    - (void)sendSubviewToBack:(UIView *)view;
               
    回調的方法
  12. view

    已經添加子視圖
    - (void)didAddSubview:(UIView *)subview;
               
  13. view

    将要移除子視圖
    - (void)willRemoveSubview:(UIView *)subview;
               
  14. view

    将要移動到新的父視圖
    - (void)willMoveToSuperview:(UIView *)newSuperview;
               
  15. view

    已經移動到父視圖
    - (void)didMoveToSuperview;
               
  16. view

    将要移動到新的

    window

    - (void)willMoveToWindow:(UIWindow *)newWindow;
               
  17. view

    已經移動到

    window

    - (void)didMoveToWindow;
               
  18. 是否是指定

    view

    的子視圖。傳回

    YES

    NO

    - (BOOL)isDescendantOfView:(UIView *)view;
               
  19. 根據

    tag

    值取出這個

    view

    - (UIView *)viewWithTag:(NSInteger)tag;
               
  20. 下面三個方法和布局相關,感興趣的朋友可以深入研究。

    UIView

    setNeedsDisplay

    setNeedsLayout

    方法。首先兩個方法都是異步執行的。而

    setNeedsDisplay

    會自動調用

    drawRect

    方法,這樣可以拿到

    UIGraphicsGetCurrentContext

    ,就可以畫畫了。而

    setNeedsLayout

    會預設調用

    layoutSubViews

    ,就可以處理子視圖中的一些資料。

    綜上所訴,

    setNeedsDisplay

    友善繪圖,而

    layoutSubViews

    友善出來資料。
    - (void)setNeedsLayout;
               
  21. 如果需要進行布局
    - (void)layoutIfNeeded;
               
  22. 可以在自己定制的視圖中重載這個方法,用來調整子視圖的尺寸和位置。自動調用

    layoutIfNeeded

    方法。

    layoutSubviews

    在以下情況下會被調用:

    1.

    init

    初始化不會觸發

    layoutSubviews

    ,但是是用

    initWithFrame

    進行初始化時,當

    rect

    的值不為

    CGRectZero

    時,也會觸發

    2.

    addSubview

    會觸發

    layoutSubviews

    3.設定

    view

    frame

    會觸發

    layoutSubviews

    ,當然前提是

    frame

    的值設定前後發生了變化

    4.滾動一個

    UIScrollView

    會觸發

    layoutSubviews

    5.旋轉

    screen

    會觸發父

    UIView

    上的

    layoutSubviews

    事件

    6.改變一個

    UIView

    大小的時候也會觸發父

    UIView

    上的layoutSubviews事件
    - (void)layoutSubviews;