对于项目中的适配, 我使用的三方库是SDAutoLayout. 但是存在一定缺陷(关于模拟器与真机显示效果是有差异的, 适配出来效果是在真机上会变形).
那么会有人问:你为什么不直接设置rect?
我设置了, 有时候无效.
关于SDAutoLayout最新版:
1、增加设置偏移量offset功能
2、修复之前button作为父视图时内部控件不能自动布局问题
3.1 设置一排固定间距自动宽度子view
3.2 设置一排固定宽度自动间距子view
4、增加DemoVC10scroll任意布局内容自适应
实际结合了3.1和UIScrollView自适应
5、增加DemoVC14xib的cell高度自适应
但是缺陷是:
设置宽度与高度时不起作用(属性设置为:object.sd_layout.heightIs(height).widthIs(width))
针对这个缺陷,
我将xib中对控件所添加的宽或者高的约束拖拽至.h中, 作为一个变量, 设置这个变量的constant属性, 可以实现宽高约束更改. 效果很理想.
对于SDAutoLayout的优点,
不多说, 用过的即可体会, 对于图文混排, 可以有所尝试. 我在项目中的图文混排, cell中label高度自适应, 就是借此实现. 部分代码参考如下:
-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
return[self cellHeightForIndexPath:indexPath cellContentViewWidth:[UIScreen mainScreen].bounds.size.width tableView:_myTableView];
} //设置每个cell的高度(自适应)
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
SentimentCell*cell = [tableView dequeueReusableCellWithIdentifier:CellId];
SentimentCellModel*model = [_dataArr objectAtIndex:indexPath.row];
cell.model= model;//cell重写setModel方法, 设置控件参数, 根据量度自定义布局
[cell useCellFrameCacheWithIndexPath:indexPath tableView:tableView];
}
在cell中的重写方法实现是:
-(void)setModel:(SentimentCellModel*)model
{
CGFloatmargin =10;
_model= model;
..//其他属性传参
[self setupAutoHeightWithBottomView:_timeStr bottomMargin:5];//SDAutoLayout中cell高度自适应中关键句, 根据参照视图实现高度自适应.
}
关于宽度自适应,
就是针对label为主, 大多还是使用"[text sizeWithFont:_titleName.font constrainedToSize:sizeTitle lineBreakMode:NSLineBreakByWordWrapping]"为主,
虽然文档强调iOS7.0之后更改成"[textStr2 boundingRectWithSize:size options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:attribute context:nil].size;", 但旧的方法调出来一样可以用, 还略简便.
另外, 对拿到的字符串数据, 去掉空格与回车符是不可忽视的事情.
目前参照以下代码方式, 效果可佳:
_model.text= [_model.text stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];//去掉空格
_model.text= [_model.text stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];//去掉两端空格与回车
目前, 针对cell行数过多, 最多显示两到三行, 其余要显示省略号:
我是先设置label的lineBreakMode为NSLineBreakByTruncatingTail, 另外我通过计算字符串长度与label的高度来判断最多显示的行数所需要的frame, 目前算误差小一些. (希望有大神看到优化的方案告知我, 我做优化处理).
恩, 我的""第一篇, 先这样, 后续会再进行补充.
后续补充:
现阶段项目中已经摒弃xib,手写控件,都是以iPhone6的分辨率为基础做比例运算,乘以UI给的尺寸参数进行适配。