<欢迎大家加入iOS开发学习交流群:529560119>啊

看到一个新的界面,要细细划分区域,应该怎么设计合理。

1.如果是在一个cell 中有好几行,每行都是两个label,规则排版一样,这样很好做,但是接口返回的数据可能是动态的,有时是5行有时是7行,这样怎么办,让这一个cell中几行拆分成多个cell,每一行都是一个cell,单独新建一个cell,在cellForRow里面,不是加载当初的一个cell,而是加载不同的cell,传入不同的数据源即可。

2.需求是这样,两个并排挨着的label,在aotolayout中label是不固定的宽度,左边label需要动态填入数据,右边的label又要总是距离左边label20宽度,这样怎么做呢?首先左边label不能设置固定宽度,这样做先设置为固定的,再edit宽度>=一个小数值(20),这样就可以通过编译,在动态填入数据之后,label可以自动拉伸宽度,右边的label设置距离左边20即可了。

3.枚举在cell展示中的便利

开发经验总结-点滴积累_数据

开发经验总结-点滴积累_数据

4.continue,

return,

break,

5.UI中autolayout,最精准的像素距离做法

开发经验总结-点滴积累_代理方法_03

6..h中声明文件,不在.m实现@implementation,没有set,get方法,.h的模型字段没法赋值

7.在手机原来就存在灰度包的情况,再次打包是覆盖,又是会有bug出现。在更新软件的时候会首先删除原APP,再下载全新的APP。

8.[[UIScreen mainScreen] applicationFrame].size.width这样取值,不论在任何情况拿到的都是运行当前APP设备的宽度

  self.view.bounds.size.width ,在view未被展现到屏幕上之前都是xib中展示的那个宽度(例如在viewDidLoad,viewWillAppear或者是单独新建的cell方法内部awakeFromNib方法里面拿到的都是xib中显示的那个,还有在代理方法内部也测试了,也是在xib中的宽度),只有在view真正显示出来之后,例如viewDidAppear或者点击事件中取到的都是显示屏幕之后的宽度,即和当前设备取到的宽度一样

9.关于heightForRow方法,动态展现高度问题,

开发经验总结-点滴积累_网络请求_04

答:此问题经过一天现在可以解决了,这个方法block是国外某大神写的,目的在于解决拎出来的一个cell,要显示多次并且内容有可能还是动态,需要动态适配高度的,需求如下图

开发经验总结-点滴积累_数据_05

左边为title,左右为detail,目的地和交通暂且为空值,如果是很多数据,这种方法就可以完美解决了。

这个方法在heightForRow内部,上图中的三个cell,在每次展现之前需要算出填进内容之后的高度,使用这个方法,每次执行一cell到heightForRow中,都会及时的把这一行对应的内容传进cell的静态方法contentWithData中,去计算当前将要显示这个cell的高度,然后返回来return即可,这三个cell会执行三次,返回每个对应cell的高度。

这个方法要解决的目的,很简洁在每次展示cell之前,计算当前要显示cell的高度。那么如果不用这种方法还可以怎么解决呢?

我们可以在heightForRow之前的任何方法中,使用方法将每个cell的内容穿进去,然后计算之后返回来,但是这样问题来了,怎么在每一个cell执行heightForRow之前当前要展示cell的内容传进去cell呢?显然是不可以的,因为你不通过tableView的代理方法拿不到indexPath.row,不能及时的在每次执行heightForRow之前放进去这个将要显示cell的内容,这样就不能及时计算当前要显示cell的高度,所以最好的办法也是唯一的办法就是通过这种方法,每次执行穿进去内容,返回来高度。

那么既然讲到这里,又会想到这样一个方法

[self.selftripProdIntroCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

这种方法计算的是单单一个cell,在执行heightForRow之前填入数据,设置好动态适配显示的步骤,然后再heightForRow内写上这个就可以了。

第二步 设置label最大的换行宽度

开发经验总结-点滴积累_代理方法_06

第三步 给label填入数据

开发经验总结-点滴积累_网络请求_07

第四步 运行方法

开发经验总结-点滴积累_网络请求_08

还有一步就是需要设置label的行数0.这个也是第一步

前面这四步按照顺序设置即可。

上面的两块内容可以解决cell在动态适配中的很多问题了,再学习到关于cell动态的东西再做笔记。


还有一种情况 是单个领出来一个cell并且是智慧显示一行,这种也可以用上面第一种做法外国大牛写的,其实这种方法是存在缓存机制,更有效率,也可以单独写出来cell,然后写一个方法,把数据传过去cell,然后再给cell的lbl,这样returen [cell  方法:传递数据];就是高度了,只不过这样不存在缓存,上啦下拉的时候cell快速创建,浪费内存。




10.在320宽度的两个按钮,怎么在375或更大宽度上按比例显示呢?左边按钮距离左边顶部为0 固定宽度,高度,右边按钮距离右边顶部为0 固定宽高,这样在375上,两个按钮都是黏住左上角和右边角 宽度仍为110 210 总监为空。这是不对的,应该这样按系数

开发经验总结-点滴积累_数据_09

开发经验总结-点滴积累_代理方法_10

11.网络请求的方法和tableview的代理方法执行先后顺序的问题。

今天遇到问题,在numberOfRows方法内部发现从数据源拿到的判断多少行的数据源数据是空的,因此想要以数据源展示的cell不能展示才胡来,这是为什么呢?问了CW才知道,网络请求方法是异步执行的,执行速度肯定没有本地绘制的快(抛弃网络请求,viewDidLoad相关的方法比代理方法执行的话),因此网络请求方法和numberOfRows方法的执行没有固定先后顺序,准确说几乎都是比numberOfRows后执行,因此当numberOfRows先执行的话就是错误的,这样怎么做呢?要在网络求情成功之后reloadData一次,即使numberOfRows先执行了,但是界面还来不及显示出来,就被网络请求方法执行成功后的reloadData再次刷新了界面,所以你最终看到的界面还是正确的。

开发经验总结-点滴积累_数据_11

最严谨的做法是在numberOfRows中加入判断 ,这不是严谨,是必须要加,因为可能测试的时候不会错,但是线上会经常因为这个闪退,火车的不是没加判断,是每在numberOfRows加,而是在heightForRow中做了判断。

开发经验总结-点滴积累_代理方法_12

最好的例子就是在跟团详情页的请求以及点评请求嵌套使用,以及两次刷新,因为都是代理方法执行后采取请求,再次刷新

12.在数据源中取数据的方式问题

开发经验总结-点滴积累_数据_13

这样取是最正确的方式,一:是因为不用dpImgUrl对象来接受的话,直接用点方法.imgUrl是点不出来的,因为编译器没那么智能,不知道取出来的是什么类型对象,怎么知道里面有imgUrl属性呢?

二:是如果不用[dpList.dpImgUrlobjectAtIndex:i],而是直接用dpList.dpImgUrl[i]来取,虽然编译是通过的,但是万一有人把你的里面属性改了,开发编译get会通过,但是真正运行的时候就会出错了,切记

13.viewWithTag取值,tag要用1000以上的,1000以下的系统占用,可能会出错

14.webView实现手势功能须知

开发经验总结-点滴积累_代理方法_14

15.使用场景:

在xib中拖出来控件到一个IBOutlet中,还可以遍历出来哦

开发经验总结-点滴积累_数据_15

开发经验总结-点滴积累_网络请求_16

将5个具体日期view都拖到上面这行代码中,当在for循环中遍历arrBtnTimes时,遍历出来的顺序是当时你拖到这个@property的那个顺序,如下

开发经验总结-点滴积累_数据_17

这个写法第一次见  很爽的地方在下面

当你想同时操纵一个view中的几个控件时候。尤其当在遍历接口返回的一个数组时候,要在for循环遍历后把数据绑定到几个控件中,这时候非常需要这种方法,当然不用也可以,但是需要多很多行代码而已。例如,当上面4个label07/10。。。4个 label星期五需要被赋值时,给每一个日期的小view中的日期day的Tag为10000,星期五weekday的Tag为20000,四个小view中的day和weekday的tag是一样的,具体看代码理解

开发经验总结-点滴积累_数据_18

这个方法还是很爽的哈~

16.for循环 固定死的数值 上下两种区别 下面的写法太low了

开发经验总结-点滴积累_网络请求_19

17.xib中拉出来的cell只是一个对象,如果在tableview的cellForRow方法里面多次返回 同一个cell,则会出现最后一个cell会显示,其他的那么只是占了位置,页面显示空,原因就是拖出来的那个cell只是一个对象,一片内存

18.代码想在iPad上面运行,看IPad效果,不仅仅是切换左上角的模拟器,还要设置部署环境为iPad,这样运行还是会报错,因为没有iPad的启动图片,要在这里设置为默认图片即可

开发经验总结-点滴积累_代理方法_20

18.在这里还要记录一个点就是,在xib中设置更改cell的contentView背景颜色为透明的时候,是没效果的,必须要在带代码中更改。设置其他颜色是可以的

 这个问题是高斯模糊背景下在iPad上出现白色背景需要设置contentView背景颜色为白色透明

19.在将一个字符串类型的数字 [nsstring stringWithFormat:@"10.01"]转化成CGFloat类型的变量变为10.009后面跟一大推数,但是如果转化成double类型的变量会是10.01,转化成double更精准

20./* 将提交价格四舍五入取两位小数  如果fTotalPrice是整数 则四舍五入后还是整数 如果是浮点数带小数点的则保留到小数点2位 */

round(fTotalPrice*100)/100;

21.

NSString *vcName=arrayData[indexPath.row];

    UIViewController *tempVC=[[NSClassFromString(vcName)alloc]initWithNibName:vcNamebundle:nil];

    [self.navigationControllerpushViewController:tempVCanimated:YES];

    NSClassFromString()会返回一个class,根据从数据获取的不同name,创建不同的ce控制器,不同于

NSStringFromClass(Class aClass);这个返回的是某个类class的名字,正好返回来了。

22.

 [tableView deselectRowAtIndexPath:indexPathanimated:YES];

之前选中的cell的选中颜色即刻消失

23.如果遇到lldb或控制台打印的数据不是你想象的结果,也可以说有时候根本没有值 是nil,你调啊调啊调,最后才发现,原来是release环境,大爷的

24.好多种情况,按钮需要自定义一下,比如加个边框,设置下高亮状态下的文字颜色等等,一运行发现没效果,其实就一个属性忘了设置,custom。按钮的Type

25.#define RGBA(r,g,b,a)   [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:a] 给button设置边框,妹的 ,单独用

[UIColor colorWithRed:<#(CGFloat)#> green:<#(CGFloat)#> blue:<#(CGFloat)#> alpha:<#(CGFloat)#>];是不行的,必须加上/255的操作,另外 ,PM要求Button的文字和边框距离是自定义的,这时候我们要先算出文字的宽度,再加上PM要求的两个宽度就是button最终显示的宽度。

NSDictionary * dictionary = [NSDictionarydictionaryWithObject:[UIFontsystemFontOfSize:9]forKey:NSFontAttributeName];
CGSize size = [visaProposer.proposerCareerStylesizeWithAttributes:dictionary];
self.btnOrderProposerDetailWith.constant = size.width + 10;