在storyboard中view的frame值为0

阅读更多

XCode4.5中,使用storyboard创建一个UIScrollView对象,在viewDidLoad:方法中得到它的frame的值都是0,但是我在storyboard都设置了UIScrollView对象的frame属性值的。

我的目的是使用UIScrollViewUIPageController实现翻页,在viewDidLoad:方法中创建新增的页面,而页面的体积是根据scrollviewframesize来获取。现在size0了,新建的页面对象也就跟着为0了。在运行时不显示出来,也就没办法翻页。

一开始我并不知道这是scrollviewframe的问题,debug后发现问题。

因此,我做了一个简单的测试。

我再创建一个基于storyboard的简单视图项目,然后拖一个UIView对象进来,设置它的背景色为绿色,frame也设置一个合适的大小,反正不是(0000)。(注意,我没有使用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: >

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_第1张图片

 

 

viewDidLoad之前,视图控制器的作为viewoutlet不和storyboard连接,直到viewWillAppear时,view的体积才被设置。

这个view的所有维度在layoutSubviews时会被计算和设置,但layoutSubviews是发生在viewWillAppear

因此,在layoutSubviews之后,才能得到这个view设置在storyboard中的所有维度值。

 

  • 在storyboard中view的frame值为0_第2张图片
  • 大小: 46.1 KB
  • 查看图片附件

你可能感兴趣的:(ios,storyboard,uiscrolllview,frame)