在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: <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中设置的值了。

 

这是为什么呢?需要了解一下视图控制器的工作原理了。

 

视图在视图控制器的生命周期中加载和展现流程如下图所示:

 

 

 

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

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过使用UICollectionView来实现swift storyboard的九宫格布局。首先,您需要在storyboard创建一个UICollectionView,并将其与view controller关联。然后,您需要设置集合视图的数据源和委托以填充单元格,并设置单元格的大小和间距以创建九宫格布局。您还可以在单元格添加图像、文本或其他控件以显示内容。 以下是一个简单的示例代码,展示如何在swift storyboard实现九宫格布局: ```swift import UIKit class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { @IBOutlet weak var collectionView: UICollectionView! let itemsPerRow: CGFloat = 3 let sectionInsets = UIEdgeInsets(top: 20.0, left: 10.0, bottom: 20.0, right: 10.0) let images = [UIImage(named: "image1"), UIImage(named: "image2"), UIImage(named: "image3"), UIImage(named: "image4"), UIImage(named: "image5"), UIImage(named: "image6"), UIImage(named: "image7"), UIImage(named: "image8"), UIImage(named: "image9")] override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return images.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ImageCollectionViewCell cell.imageView.image = images[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let paddingSpace = sectionInsets.left * (itemsPerRow + 1) let availableWidth = view.frame.width - paddingSpace let widthPerItem = availableWidth / itemsPerRow return CGSize(width: widthPerItem, height: widthPerItem) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return sectionInsets } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return sectionInsets.left } } class ImageCollectionViewCell: UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! } ``` 在这个例子,我们使用UICollectionView来展示一个九宫格图像布局。我们设置了`itemsPerRow`为3,这意味着每行有3个图像。我们还使用`sectionInsets`来设置单元格之间的间距。最后,我们将`UICollectionViewDataSource`和`UICollectionViewDelegateFlowLayout`协议添加到我们的视图控制器,并实现了必要的方法来填充单元格并设置布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值