SDAutoLayout 使用简介

都说 SDAutoLout 比 Masonry 好用.到底是哪方便优于它呢?下面我们来看看网上的一个例子,来分析用法.
请看下面这个图:

图上所示 现在我要讲的就是这种形式的cell的布局

UIImageView *view0 = [UIImageView new];//创建头像
UILabel *view1 = [UILabel new];//用户名
UILabel *view2 = [UILabel new];//内容
UILabel *view3 = [UILabel new];//创建时间
UIImageView *view4 = [UIImageView new];//创建图片
_view0 = view0;
_view1 = view1;
_view2 = view2;
_view3 = view3;
//把控件添加到contentView上
[self.contentView addSubview:view0];
[self.contentView addSubview:view1];
[self.contentView addSubview:view2];
[self.contentView addSubview:view3];
[self.contentView addSubview:view4];

在contentView进行布局

//头像
_view0.sd_layout
.widthIs(60)  //设置它的宽度
.heightIs(60)  //设置它的高度
.topSpaceToView(self.contentView, 10)  //距上10
.leftSpaceToView(self.contentView, 10);  //距左边10
//用户名
_view1.sd_layout
.topEqualToView(_view0)  //和头像平行
.leftSpaceToView(_view0, 10)  //与头像相距10
.rightSpaceToView(self.contentView, 10)  //距离右边10
.heightRatioToView(_view0, 0.4);  // 与view0的高度之比为0.4

//内容
_view2.sd_layout
.topSpaceToView(_view1, 10)  //距离view1的距离为10
.rightSpaceToView(self.contentView, 10)  //距离右边边距10
.leftEqualToView(_view1)  //与view1左对齐
.autoHeightRatio(0);  // 0 表示自适应高度

//创建时间
 _view3.sd_layout
 .topSpaceToView(_view4, 10)  //距view4 上10
 .rightSpaceToView(self.contentView, 10)  //距右边距10
 .widthIs(300)  //宽度300
 .autoHeightRatio(0);  //自适应高度

 //创建图片
 _view4.sd_layout
 .widthIs(100)  //宽度为100

看完上面布局代码后,是不是觉得很简单啊!

下面介绍下更具体的用法:

tableview和cell高度自适应:

普通(简化)版【推荐使用】:tableview 高度自适应设置只需要2步
1. >> 设置cell高度自适应:
// cell布局设置好之后调用此方法就可以实现高度自适应(注意:如果用高度自适应则不要再以cell的底边为参照去布局其子view)
[cell setupAutoHeightWithBottomView:_view4 bottomMargin:10];

2. >> 获取自动计算出的cell高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id model = self.modelsArray[indexPath.row];
    // 获取cell高度
    return [self.tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:[DemoVC9Cell class]  contentViewWidth:cellContentViewWith];
}
升级版(适应于cell条数少于100的tableview):tableview 高度自适应设置只需要2步
1. >> 设置cell高度自适应:
// cell布局设置好之后调用此方法就可以实现高度自适应(注意:如果用高度自适应则不要再以cell的底边为参照去布局其子view)
[cell setupAutoHeightWithBottomView:_view4 bottomMargin:10];

2. >> 获取自动计算出的cell高度 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 获取cell高度
return [self cellHeightForIndexPath:indexPath cellContentViewWidth:[UIScreen mainScreen].bounds.size.width];
}

普通view的自动布局:

用法示例

/* 用法一 */
    _view.sd_layout
    .leftSpaceToView(self.view, 10)
    .topSpaceToView(self.view, 80)
    .heightIs(130)
    .widthRatioToView(self.view, 0.4);

/* 用法二 (一行代码搞定,其实用法一也是一行代码) */
_view.sd_layout.leftSpaceToView(self.view, 10).topSpaceToView(self.view,80).heightIs(130).widthRatioToView(self.view, 0.4);


>> UILabel文字自适应:
// autoHeightRatio() 传0则根据文字自动计算高度(传大于0的值则根据此数值设置高度和宽度的比值)
_label.sd_layout.autoHeightRatio(0);

*******************************************************************************

    注意:先把需要自动布局的view加入父view然后在进行自动布局,例: 

    UIView *view0 = [UIView new];
    UIView *view1 = [UIView new];
    [self.view addSubview:view0];
    [self.view addSubview:view1];

    view0.sd_layout
    .leftSpaceToView(self.view, 10)
    .topSpaceToView(self.view, 80)
    .heightIs(100)
    .widthRatioToView(self.view, 0.4);

    view1.sd_layout
    .leftSpaceToView(view0, 10)
    .topEqualToView(view0)
    .heightRatioToView(view0, 1)
    .rightSpaceToView(self.view, 10);
*******************************************************************************
自动布局用法简析

1.1 > leftSpaceToView(self.view, 10)

方法名中带有“SpaceToView”的方法表示到某个参照view的间距,需要传递2个参数:(UIView)参照view 和 (CGFloat)间距数值

1.2 > widthRatioToView(self.view, 1)

方法名中带有“RatioToView”的方法表示view的宽度或者高度等属性相对于参照view的对应属性值的比例,需要传递2个参数:(UIView)参照view 和 (CGFloat)倍数

1.3 > topEqualToView(view)

方法名中带有“EqualToView”的方法表示view的某一属性等于参照view的对应的属性值,需要传递1个参数:(UIView)参照view

1.4 > widthIs(100)

方法名中带有“Is”的方法表示view的某一属性值等于参数数值,需要传递1个参数:(CGFloat)数值

注意事项:

  • 如果需要用“断言”调试程序请打开此宏(位于UIView+SDAutoLayout.h)
    //#define SDDebugWithAssert

  • 设置高度时不起作用或闪退

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    return [self.tableView cellHeightForIndexPath:indexPath model:self.modelsArray[indexPath.row] keyPath:@"model" cellClass:[DemoVC5CellTableViewCell class] contentViewWidth:[self cellContentViewWith]];
    }
    

    按照上述方法设置后,cell未按照正确方式排版或自适应,可能原因:使用KVC模式,keyPath中的key值必须跟cell中model的属性名称一致,包括大小写,否则会闪退。

  • 一个cell在多出用到,但又有些区别
    此种方式可参考SDAutoLayout的demo中模仿微信的功能,其中的显示更多按钮可供参考,本人尝试后发现其中的button是否显示貌似必须有个数据在model中进行判断,且判断完成后要重新设置其相关的视图约束,否则显示混乱。

github地址:

https://github.com/gsdios/SDAutoLayout

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值