天天看点

在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中的所有维度值。