zoukankan      html  css  js  c++  java
  • Autolayout 第三方开源库

    转载自:http://blog.csdn.net/hmt20130412/article/details/46638625

    今天才发现CSDN支持markdown了…还是给出新博客地址:Autolayout优秀的第三方开源库

    最近项目开始用纯代码布局整个UI框架, 对于前一段很长时间都是xib+storyboard狂拖控件约束的我来说,每天写的代码量剧增…对于sb好还是纯代码好的争论,可以参考下巧大大的分析
    说到UI适配布局,一般有两种方法: 
    * frame,利用[UIScreen mainScreen].bounds.size.width/height,一个一个的算出对应frame,结果肯定是OK的,只是过程异常的痛苦,尤其像我这种语文老师教的数学的小学生.囧. 
    * autolayout,相信肯定是主流布局,而且对于UI设计师给我的效果图,也是很方便我们直接拿来进行约束设值,无须其他任何计算.

    这里主要介绍手写autolayout约束,由于系统提供的api写起来又臭又长,推荐一个不错的第三方. 
    OC版本对应的是Masonry,Swift版本对应的是SnapKit.当然还有其他优秀的autolayout相关第三方,会在结尾给出,感兴趣的朋友可以去研究下,LZ主要用Masonry(大爱这种链式语法)^_^!

    Masonry

    Github地址是:Masonry 
    具体用法github上已经讲的很清楚了,可以下载Demo看看栗子的实现,总结一下我在使用过程中了解. 
    mas_makeConstraints使用最多,做初始约束,只负责新增约束 
    mas_updateConstraints针对make中的约束做更新,一般不添加新约束,只是对于原约束数值的修改. 
    mas_remakeConstraints清除之前所有的约束,采用里面设置的最新约束,常用于动画之后新位置的约束设定 
    * 优先级高.priorityHigh,优先级低.priorityLow,通常用于根据条件判断来设定优先响应哪种约束 
    multipliedBy(x)= *x,dividedBy(x) = /x 
    * “` 
    make.edges.mas_equalTo(UIEdgeInsetsMake(10, 10, 10, 10)); 
    // edges就是相当于top-left-bottom-right 
    // top和left里的offset为正数 
    // 那么为什么bottom和right里的offset是负数呢? 因为这里计算的是绝对的数值 计算的bottom需要小于sv的底部高度 所以要-10 同理用于right 
    // 有意思的地方是and和with 其实这两个函数什么事情都没做,可以省略的

        /* 等价于
         make.top.equalTo(weakSelf.sv).with.offset(10);
         make.left.equalTo(weakSelf.sv).with.offset(10);
         make.bottom.equalTo(weakSelf.sv).with.offset(-10);
         make.right.equalTo(weakSelf.sv).with.offset(-10);
         */
    

    “`

    • UIScrollView是一个有点特殊的view,对于在里面放其他view,最好的做法是先放一个containerView设置edges相等,然后在此view上添加subview.
    • 模仿系统的UITabBarController的底部View,可以设定个数和间隔:

      - (void)simulateSystemTabBarWithButtonCount:(NSInteger)count withSpace:(CGFloat)space {
      [self.view showPlaceHolder];
      self.view.backgroundColor = [UIColor grayColor];
      NSMutableArray *viewArray = [NSMutableArray arrayWithCapacity:10];
      
      for (int i = 0; i < count; i++) {
          UIView *view = [UIView new];
          view.backgroundColor = [UIColor colorWithHue:( arc4random() % 256 / 256.0 )
                                            saturation:( arc4random() % 128 / 256.0 ) + 0.5
                                            brightness:( arc4random() % 128 / 256.0 ) + 0.5
                                                 alpha:1];;
          [view showPlaceHolder];
          [self.view addSubview:view];
          [viewArray addObject:view];
      }
      UIView *lastView = viewArray.lastObject;
      for (int i = 0; i < count; i++) {
          UIView *view = (UIView *)viewArray[i];
          [view mas_makeConstraints:^(MASConstraintMaker *make) {
              make.bottom.equalTo(view.superview);
              make.height.equalTo(@49);
              make.width.equalTo(lastView);
              if (i == 0) {
                  make.left.mas_equalTo(view.superview).offset(space);
              } else {
                  UIView *frontView = (UIView *)viewArray[i-1];
                  make.left.equalTo(frontView.mas_right).offset(space);
                  (i == viewArray.count - 1) ? make.right.mas_equalTo(view.superview).offset(-space) : nil;
              }
          }];
      }
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32

      以count = 4 和 space =0 为例子 

    • 实现动画时,更新约束后调用layoutIfNeeded
    • 最后,再次强调真的非常好用!!!

    SnapKit

    Github地址:SnapKit 
    PS:目前只支持swift1.2版本,在最新的xcode7-swift2.0中会报错,我在推特上问了作者,他说最近略忙,暂时没空…囧…有兴趣的朋友可以自己改下让它支持2.0然后pull…我?还在研究中. 
    这个就不过多举例了,基本就是跟Masonry一样,而且我在后面的Demo基本都是用了Snapkit来写(xcode7上我是拖控件…没办法,谁让还不支持2.0) 
    举个栗子->最常见的上下两个button: 

    其他资料

  • 相关阅读:
    考研机试 5.反序输出
    考研机试 4.代理服务器
    考研机试 3.约数的个数
    考研机试 8.整数拆分
    考研机试 6.手机键盘
    考研机试 2.成绩排序
    监督学习与非监督学习的区别
    关于调整input里面的输入光标大小
    JS读取cookie(记住账号密码)
    html嵌套规则
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5031149.html
Copyright © 2011-2022 走看看