今天一整天感觉都郁闷了,接手的项目里面有很多没有考虑清楚的问题,让现在的工程一会报错一会出现新的问题。总结了两个需求的几个优化方案,记录下来。
1.实现类似表格的控件
第一个版本 在xib里面拖控件
我接手的时候,在项目的竞猜模块,前一位直接在xib里面画的控件。实现如下:
其实对于xib拖控件这个想法,我觉得对于一些静态页面或者变动不是很大的动态页面的时候我会考虑,因为会在很短的时间内实现整个界面的布局,代码量少、适配简单而且整个流程一目了然。
但是对于本身的项目需求而言:
1.小模块过多,需要十分小心布局适配。要是需求一边,又得重画
2.表格中里面所有的字都是动态获取的,这拖label就得花一定的时间而且易乱
所以我是不赞同使用这个方法画表格的,所以在新的需求到来的时候进行了改版
第二个版本 自定义collectionView的layout
看过collectionView的官方文档应该知道,layout里面有一些方法十分方便的可以重新布局。实现如下(表格内动态数据):
其实这个布局相当于把每一行当做一个section,每一列当做一个item。
因为我是将这个collectionView当做tableView的cell,所以设置collectionView的可滚动性为NO。数据也是直接从cell方面传过来的。
所以我的自定义的layout代码如下:
当然,这里我是将"参赛人成绩"放在外面tableView的headerView上,你也可以通过
-(UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
布局到collectionView上。一定要注意一点:如果layout自定义布局里面包括headerView,那么设置cell的y值时一定要将headerView的大小位置考虑进行。就像一块白板,所有控件之间的相对位置、关系都需要考虑好。
第三个版本 设置基类
因为项目里面有很多个不同的界面有类似的表格,千万不要傻到每一个界面都去关联一个layout。如果对于collectionView里面的cell布局、颜色、之类的都一样的话,直接就用一个collectionView就可以了。但是如果cell有大的变动,可以设置一个collectionView的基类,这样就可以使用一个layout了。
2.多TextField的页面
第一个版本
项目里面的页面基本都是包括很多TextField的,所以在处理的过程中出现了一些莫名其妙的问题。
nav导航栏的上面出现了一大块的留白,问题如下:
而且向上向下都无法滚动
第二个版本 修复问题
前面说了项目里面的页面基本上很多TextField,这个页面的下一个页面也有TextField,而之前的开发者:
居然选择了监听键盘弹出事件?!!!
所以,如果所有有多个有TextField的页面在同一个NavigationController中,尽量不要用键盘的监听,即使你处理了resignFirstResponder,但是请注意:是拥有多个TextField的页面!!
反正我目前只能修复,后期再重新理一遍逻辑重写。
不再监听,改成使用TextField 的方法:
这个爆炸的问题稍稍解决之后,又出现问题了:项目之前写的是:
self.view.transform = CGAffineTransformMakeTranslation(0, -height);
二个:
1.不记得从哪里看过的,尽量不要移动viewController本身的view。这货移动的可欢了,基本上每一个界面都是?!既然上面铺了一层scrollView,为啥不用?
self.scrollView.transform = CGAffineTransformMakeTranslation(0, -height);
2.CGAffineTransformMakeTranslation这个是控制移动的,之前就是大概的用了一下,现在有个问题就是多个移动的时候,出现不移动的效果。网上讲的也听不懂,什么中心相对位置之类的,还是过几天去看官方的问题。所以我直接就不用了,有scrollView,为啥不用呢?
self.scrollView.contentOffset = CGPointMake(0, _keyboardHeight);
第二个版本 优化问题
其实项目的前任基本上都是拖拽控件,其实很简易而且清晰,但就是逻辑没有考虑很清楚,导致很多地方即使一样的布局还是画了不少的view。所以就我个人而言:拖拽可以,但是还是以小布局为主,不是整体页面为主。
其次,真的要学好英语,不要用中文拼音命名,要直接了当。一定要注释!不需要太多,像我个人的习惯,会在.h文件上方写上这是哪一个模块的使用类:
最后,测试吧,希望我在所有问题解决完之前不要有白头发。哈哈哈哈