SDAutoLayout方法的学习

  学了这么久了,发现只是单纯的看,照抄硬搬,虽然也可以学到不少知识,也可以解决很多的问题,但是当面试的时候遇到面试官问我对于第三方框架内部的认识,我只能无奈的说,我不知道,只是简单的用,而且就用的方法都有什么我都不知道,好多时候都是直接网上一搜,代码拷贝过来,问题OK,用完了就忘了。

  今天才觉得学知识不是简单的会抄就行了,得真的学到自己手里,才不会出现会解决问题,但是不知道怎么解决这样的尴尬情况。SDAutoLayout可以说是一个非常简单的代码适配的第三方,就这样简单易用的我依然是会一点点,被面试官虐了之后,我想我该认真对待每一个我们接触的非常好用的第三方框架,写我们写不出来,但是至少我们要做的是有什么方法,能做什么事,都得烂熟于胸,让未来不再有尴尬。方法的实现不必关心,也只是把.h里面的文件方法的声明再好好研读一番

  看了一下,SD适配就是包含了两个分类,一个是UIView+SDAutoLayout,另一个是UITableView+SDAutoTableViewCellHeight

  

  UIView+SDAutoLayout:

首先方法的调用: 

      view.sd_layout.leftSpaceToView(self.view, 20).topSpaceToView(self.view,80).heightIs(130).widthRatioToView(self.view, _widthRatio);

  view参照父视图self.view进行约束,那么约束前view必须添加到self.view上才能执行上述代码。

  注:

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

     方法名中带有“RatioToView”的需要传递2个参数:(UIView)参照view 和 (CGFloat)倍数

     方法名中带有“EqualToView”的需要传递1个参数:(UIView)参照view

     方法名中带有“Is”的需要传递1个参数:(CGFloat)数值

控制器内部修改约束:

   view.sd_layout.widthRatioToView(self.view, _widthRatio); //在方法内部更新View要修改的约束条件

        [view updateLayout]; // 调用此方法更新约束  

  注:

    如果是父子关系视图,且更新有动画效果的话,更新父视图约束时,子视图也同样得调用updateLayout方法;

label的自适应方法:

     testLabel.sd_layout.leftSpaceToView(self.view1, 10).rightSpaceToView(self.view1, 10).topSpaceToView(self.view1, 10).autoHeightRatio(0);

   // autoHeightRatio 设置文本内容自适应,如果这里的参数为大于0的数值则会以此数值作为view的高宽比设置view的高度

  如果要设置label内部内容的行高

      NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];

        [paragraphStyle setLineSpacing:8];

        NSAttributedString *string = [[NSAttributedString alloc] initWithString:text attributes:@{NSForegroundColorAttributeName : color,       NSParagraphStyleAttributeName: paragraphStyle}];    

        UILabel *label = [UILabel new];

        [self.view addSubview:label];

        label.attributedText = string;

      label.sd_layout.leftSpaceToView(self.view, 10).rightSpaceToView(self.view, 10).topSpaceToView(self.view4, 10).autoHeightRatio(0);

       // 标注lable的text为attributedString

      label.isAttributedContent = YES;

 

view根据内部控件自适应方法:

       view.sd_layout.leftSpaceToView(self.view0, 10).topEqualToView(self.view0).rightSpaceToView(self.view, 30);

   // view使用高度根据子view内容自适应,所以不需要设置高度,而是在后面调用下面方法

  [view setupAutoHeightWithBottomView:testView bottomMargin:10];   //实现高度根据最底部的子View自适应,第二个参数为距离最底部view底边缘的距离

 

控制器内部控件等宽方法:  

  self.view.sd_equalWidthSubviews = @[self.view0, self.view1, self.view2]; //调用这个方法,就将控制器宽度等分给了3个子view;

  当view的宽度或高度确定,且view是正方形时,设置另一个长度可以

  view.heightEqualToWidth();              // 高度等于自身宽度()中可以不填任何参数

 

  UITableView+SDAutoTableViewCellHeight  

cell的高度自适应

  SD中cell的高度自适应分两步 

    1、在cell创建内部控件后,所有子控件布局约束完成后,调用方法

      [self setupAutoHeightWithBottomView:_view4 bottomMargin:10];

    2、在tableView的heightForRow方法中,调用返回方法

       return [self.tableView cellHeightForIndexPath:indexPath model:str keyPath:@"text" cellClass:[TestCell2 class] contentViewWidth:[self cellContentViewWith]];

      //其中model 为模型实例, keyPath 为 model 的属性名  通过 kvc 统一赋值接口

 

posted @ 2016-03-28 21:32  absty_guo  阅读(3355)  评论(0)    收藏  举报