天天看點

在storyboard中view的frame值為0

在XCode4.5中,我使用storyboard建立一個UIScrollView對象,在viewDidLoad:方法中得到它的frame的值都是0,但是我在storyboard中都設定了UIScrollView對象的frame的屬性值的。

我的目的是使用UIScrollView和UIPageController實作翻頁,在viewDidLoad:方法中建立新增的頁面,而頁面的體積是根據scrollview的frame的size來擷取。現在size為0了,建立的頁面對象也就跟着為0了。在運作時不顯示出來,也就沒辦法翻頁。

一開始我并不知道這是scrollview的frame的問題,debug後發現問題。

是以,我做了一個簡單的測試。

我再建立一個基于storyboard的簡單視圖項目,然後拖一個UIView對象進來,設定它的背景色為綠色,frame也設定一個合适的大小,反正不是(0,0,0,0)。(注意,我沒有使用UIScrollView,而是使用UIView,測試性質是一樣的)然後,在storyboard中按住control鍵,點選UIView對象,拖到ViewController.h中,設定outlet,命名為firstViewFirstSubView。

我在ViewController.m中重寫 viewDidLoad:方法,原來就是在此方法中建立的翻頁頁面視圖對象。

- (void),viewDidLoad:(BOOL)animated

{

    [super ,viewDidLoad:animated];

    NSLog(@"View Controller Did Load. firstViewFirstSubView: %@ ", firstViewFirstSubView);

    NSLog(@"subView's dimmensions: %f by %f at %f, %f", firstViewFirstSubView.frame.size.width,

      firstViewFirstSubView.frame.size.height,

      firstViewFirstSubView.frame.origin.x,

      firstViewFirstSubView.frame.origin.y);

}

測試結果不出所料,該uiview.frame的所有的值都是0.

2012-11-15 15:21:00.743 StoryboardViewBounds[11132:c07] View Controller Did Load. firstViewFirstSubView: <UIView: 0x9379730; frame = (0 0; 0 0); autoresize = TM+BM; layer = <CALayer: 0x9378e40>>

2012-11-15 15:21:00.744 StoryboardViewBounds[11132:c07] subView's dimmensions: 0.000000 by 0.000000 at 0.000000, 0.000000

視圖控制器類一共有四個方法可以重寫來實作視圖加載和展現,分别是ViewWillAppear:,viewDidAppear:,viewDidLoad:,viewDidLayoutSubviews。其中viewDidLayoutSubviews方法是在iOS5.0系統中才開始提供的。

在ViewWillAppear:方法,該uiview.frame的所有的值還是0.

但在viewDidAppear:和viewDidLayoutSubviews中,得到的frame的值就是storyboard中設定的值了。

這是為什麼呢?需要了解一下視圖控制器的工作原理了。

視圖在視圖控制器的生命周期中加載和展現流程如下圖所示:

在storyboard中view的frame值為0

在viewDidLoad之前,視圖控制器的作為view的outlet不和storyboard連接配接,直到viewWillAppear時,view的體積才被設定。

這個view的所有次元在layoutSubviews時會被計算和設定,但layoutSubviews是發生在viewWillAppear。

是以,在layoutSubviews之後,才能得到這個view設定在storyboard中的所有次元值。