由于博客地址无效, 故把之前的博文转来简书
转自2017-02-26

在模仿斗鱼开发首页的时候,我的页面层次是这样的:
1.最底层的是个UIViewController
2.然后自己封装了一个TitleView和ContentView加在self.view上
3.ContentView里面是个UICollectionView,随着TitleView的点击,UICollectionView要滑动到所对应的模块去,当然UICollectionView也可以自己滑动
4.然后创建对应的控制器UIViewController,在UICollectionView的DataSource里加入到cell中
let vc = subVcs[indexPath.item]
vc.view.frame = cell.contentView.bounds
cell.contentView.addSubview(vc.view)
首先,说下我遇到的第一个坑
1.在把UIViewController的view加入到cell.contentView中的时候,我忘记设置frame了
vc.view.frame = cell.contentView.bounds
这导致我在对应的模块的UIController中,添加的View大小一直有问题

如图所示,就是我的推荐的Controller,底部一直不能显示完整,推荐这个页面其实是个CollectionView,我在添加CollectionView的时候,frame = self.view.bounds

通过打印得到self.view.frame = { {0, 0}, {320, 568} },其实ContentView的大小没有这么大,这个时候再去看添加controller.view的时候发现没给设置大小.
把frame添加了运行还是出现问题,这个时候要设置当前UICollectionView的大小随着父视图的大小变化而变化.
collectionView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
第二个坑又来了
当我发现底部能完全显示后,我的两个headerView消失了

头部是两个UIView,分别加在CollectionView上,然后设置的contentInset.

调试的第一步,先看层次结构图,如下




发现两个view都变成了一条线,高度被压缩了.这个时候想起设置了这两个view的父视图,也就是我之前设置的CollectionView的大小会被拉伸或压缩.这样,就导致加在CollectionView上的视图也会跟随着变化.



通过代码或者在xib里都可以设置,让view保持原来的大小!
总结
问题主要出在对AutoResizing和AutoLayout不了解,推荐一个简单的博客,介绍了两者.
子视图要不要跟随父视图的变化而变化,这个就要看具体情况.记得要设置好AutoResizing.
http://www.jianshu.com/p/3c0698c22d85
模仿斗鱼的项目地址:
https://github.com/yangyu2010
网友评论