当前位置: 首页 > news >正文

咕果网给企业做网站的深圳品牌产品设计公司

咕果网给企业做网站的,深圳品牌产品设计公司,在线定制英文名,wordpress 如何使用模板AutoLayout非常强大也非常易用#xff0c;可读性也很强#xff0c;加上各种第三方AutoLayout库#xff0c;让你布起局来犹如绷掉链子的狗#xff01;根本停不下来#xff01;以前的 1label.frame.origin.y label.frame.size.height 10如今只用#xff1a; 123button.sn…AutoLayout非常强大也非常易用可读性也很强加上各种第三方AutoLayout库让你布起局来犹如绷掉链子的狗根本停不下来以前的 1 label.frame.origin.y  label.frame.size.height  10 如今只用 1 2 3 button.snp_makeConstraints{     $0.top.equalTo(label.snp_bottom).offset(10) } 真是好用得不要不要。 可是我在使用AutoLayout却遇到不少坑翻阅了不少博客网站才找到了我认为的比较不错的解决方案。我把这些内容贴出来如果其中有误可以在下方留言指出希望大家能够多多交流共同进步。 本文主要分四部分 updateViewConstraints与updateConstraints篇 AutoLayout与Frame篇 AutoLayout动画篇 AutoLayout比例设置 其中‘篇’字体现了本文作者对逼格的追求。 updateViewConstraints与updateConstraints篇 基本用法 updateViewConstraints与updateConstraints是AutoLayout出现后新增的apiupdateConstraints主要功能是更新view的约束,并会调用其所有子视图的该方法去更新约束。 而updateViewConstraints的出现方便了viewController不用专门去重写controller的view当view的updateConstraints被调用时该view若有controller该controller的updateViewConstraints便会被调用。 两个方法都需要在方法实现的最后调用父类的该方法。并且这两个方法不建议直接调用。 在使用过程中我发现这两个方法有时候不会被系统调用。后来我看到public class func requiresConstraintBasedLayout() - Bool方法的描述 constraint-based layout engages lazily when someone tries to use it (e.g., adds a constraint to a view). If you do all of your constraint set up in -updateConstraints, you might never even receive updateConstraints if no one makes a constraint. To fix this chicken and egg problem, override this method to return YES if your view needs the window to use constraint-based layout. 大意是说视图并不是主动采用constraint-based的。在非constraint-based的情况下-updateConstraints,可能一次都不会被调用解决这个问题需要重写该类方法并返回true。 这里要注意如果一个view或controller是由interface builder初始化的那么这个实例的updateViewConstraints或updateConstraints方法便会被系统自动调用起原因应该就是对应的requiresConstraintBasedLayout方法返回true。而纯代码初始化的视图requiresConstraintBasedLayout方法默认返回false。 所以在纯代码自定义一个view时想把约束写在updateConstraints方法中就一定要重写requiresConstraintBasedLayout方法返回true。 至于纯代码写的viewController如何让其updateViewConstraints方法被调用。我自己的解决办法是手动调用其view的setNeedsUpdateConstraints方法。 How to use updateConstraints? 文档中对于这两个方法提的最多的就是重写这两个方法在里面设置约束。所以一开始我认为这两个方法是苹果提供给我们专门写约束的。于是便开始尝试使用。 直到后来在UIView中看到这样一句话 You should only override this method when changing constraints in place is too slow, or when a view is producing a number of redundant changes. “你只因该在添加约束过于慢的时候或者一次要修改大量约束的情况下重写次方法。” 简直是让人觉得又迷茫又坑爹。updateConstraints方法到底应该何时使用 后来看到how to use updateConstraints这篇文章。给出了一个合理的解释 尽量将约束的添加写到类似于viewDidLoad的方法中。 updateConstraints并不应该用来给视图添加约束它更适合用于周期性地更新视图的约束或者在添加约束过于消耗性能的情况下将约束写到该方法中。 当我们在响应事件时例如点击按钮时对约束的修改如果写到updateConstraints中会让代码的可读性非常差。 关于性能我也做了一个简单的测试 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 33 34 35 36 37 38 39 40 41 42 43 44 45 class MMView: UIView {     override init(frame: CGRect) {         super.init(frame: frame)         self.backgroundColor  UIColor.grayColor()         initManyButton()         //初始化时添加约束         test() //每次只有一个test()不被注释就好     }     override func touchesBegan(touches: Set, withEvent event: UIEvent?) {         //响应事件时添加约束         //test()     }     override func updateConstraints() {         //updateConstraints中添加约束         //test()         super.updateConstraints()     }     func test(){         let then  CFAbsoluteTimeGetCurrent()         addConstraintsToButton()         let now  CFAbsoluteTimeGetCurrent()         print(now - then)     }     required init?(coder aDecoder: NSCoder) {         fatalError(init(coder:) has not been implemented)     }     let buttonTag  200     func initManyButton(){         for index in 0...1000{             let button  UIButton(type: .System)             button.tag  buttonTag  index             self.addSubview(button)         }     }     func addConstraintsToButton(){         for index in 0...1000{             if let button  self.viewWithTag(indexbuttonTag){                 button.snp_makeConstraints{ make in                     make.center.equalTo(self)                     make.size.equalTo(self)                 }             }         }     } } 分别将设置约束写在init中、写在updateConstraints中、写在事件响应方法中 的时间消耗进行测试对1000个button添加约束每个添加4个约束。 init中,时间消耗约为0.37秒 写在updateconstraints中时间消耗约为0.52秒 写在事件响应方法中时间消耗约为0.77秒 所以结论还是将约束的设置写在viewDidLoad中或者init中。没事儿尽量不去碰updateConstraints。除非对性能有要求。 关于UIView的translatesAutoresizingMaskIntoConstraints属性 最近在对AutoLayout的学习中发现很多人似乎对translatesAutoresizingMaskIntoConstraints的误解非常大很多时候遇到问题总有人会在下面回答到把translatesAutoresizingMaskIntoConstraints设置成false就可以解决问题。。。实际上并没有什么用。 那么这个属性到底是做什么的呢 其实这个属性的命名已经把这个属性的功能解释的非常清楚了。 除了AutoLayoutAutoresizingMask也是一种布局方式。这个想必大家都有了解。默认情况下translatesAutoresizingMaskIntoConstraints true , 此时视图的AutoresizingMask会被转换成对应效果的约束。这样很可能就会和我们手动添加的其它约束有冲突。此属性设置成false时AutoresizingMask就不会变成约束。也就是说 当前 视图的 AutoresizingMask失效了。 那我们什么时候需要设置这个属性呢 当我们用代码添加视图时,视图的translatesAutoresizingMaskIntoConstraints属性默认为true可是AutoresizingMask属性默认会被设置成.None。也就是说如果我们不去动AutoresizingMask那么AutoresizingMask就不会对约束产生影响。 当我们使用interface builder添加视图时AutoresizingMask虽然会被设置成非.None但是translatesAutoresizingMaskIntoConstraints默认被设置成了false。所以也不会有冲突。 反而有的视图是靠AutoresizingMask布局的当我们修改了translatesAutoresizingMaskIntoConstraints后会让视图失去约束走投无路。例如我自定义转场时就遇到了这样的问题转场后的视图并不在视图的正中间。 所以这个属性基本上我们也不用设置它。 AutoLayout与Frame篇 在使用AutoLayout的时候你可能也会同时也会用到frame,比如需要用到layer的时候。 那么你可能会遇到这种情况想让layer的尺寸是由其它视图尺寸设定的而这个视图又是由约束控制布局的。如果将layer的初始化与view的初始化放在一个方法中,类似于viewDidLoad的方法中 1 layer.bounds  CGRectMake(0,0,view.bounds.size.widith * 0.5,50) 那么很可能最终layer的宽度是0。 这是因为约束被设置之后它并不会立即对view作出改变而是要等到layout时才会对视图的尺寸进行修改。而layout通常是在视图已经加载到父视上时。 所以我们如果在viewDidLoad中设置了约束要等到viewDidAppear时view的尺寸才会真正改变。 那么如果需要既用约束布局又用frame布局如果能让它们很好的协作呢 一个很好的解决办法是吧frame设置写到layoutSubviews中或者写到viewDidLayoutSubviews中即可。因为约束生效时view的center或者bounds就会被修改center或者bounds被修改时layoutSubview,就会被调用随后viewDidLayoutSubviews就回被调用。这个时候设置约束的视图frame就不再是(0,0,0,0)了 如果我们必须要将约束和frame写在同一方法中写完约束就设置frame而不是想把frame的设置写到layoutSubview中比如我们设置好约束后马上就想根据约束的结果计算高度那么我们还可以在设置完约束之后手动调用layoutIfNeeded方法让视图立即layout更新frame。在这之后就可以拿到设置约束的视图的尺寸了。 AutoLayout动画篇 这篇的内容非常简单就是介绍约束布局的视图如何进行位移动画。 如果我们的一个视图是通过设置frame来布局的那么我们在位移动画时直接改变frame就可以了。很简单。 可是在约束布局的视图中设置frame这个办法就无效了。那我们怎么办 网上有很多人的办法就是拿到想要做动画的约束在动画之前对约束进行修改在动画的block中调用setNeedsLayout方法。 这个方法我觉得非常的麻烦为了方便地拿到约束我们通常还需要把约束设置成属性动画一多那岂不就是完蛋了 一种更好的方法就是设置视图的transform属性。 比如我想要让视图做一个x轴50的位移, 1 self.view.transform  CGAffineTransformMakeTranslation(50, 0) 这样设置即可。CGAffineTransformMakeTranslation这个方法就是设置位置。 AutoLayout比例设置 如果我们用autoLayout想把一个视图的中心设置到屏幕横向和纵向的1/4处 1 2 3 4 button.snp_makeConstraints{ make in     make.centerX.equalTo(self.view).multipliedBy(0.25)     make.centerY.equalTo(self.view).multipliedBy(0.25) } 这就相当于 1 button.center  CGPointMake(self.view.bounds.size.width * 0.25 ,self.view.bounds.size.height * 0.25) 那么AutoLayout中的倍数具体表示什么呢 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 let view  UIView() self.view.addSubview(view) var bottomConstraint : Constraint! view.snp_makeConstraints { (make) in     make.height.equalTo(50)     make.width.equalTo(50)     make.centerX.equalTo(self.view.snp_centerX)     bottomConstraint  make.bottom.equalTo(self.view.snp_centerY).constraint } self.view.layoutIfNeeded() print(view.frame) //打印结果 y318 height50 和为368 bottomConstraint.uninstall() view.snp_makeConstraints { (make) in     make.bottom.equalTo(self.view.snp_centerY).multipliedBy(1.5) } self.view.layoutIfNeeded() print(view.frame) //打印结果 y318 height50 和为552刚好是368的1.5倍 //所以我们可以得出结论某条边的约束的倍数代表着这条边到相对边的距离的倍数 //上面代码中的1.5倍让bottom边到y  0边的距离变成了1.5倍 转载于:https://www.cnblogs.com/guiyangxueyuan/p/5567176.html
http://www.sadfv.cn/news/210072/

相关文章:

  • 做网站什么主题好网页制作基础教程第二版教材
  • 局机关网站建设太原php网站开发
  • 建设网站平台哪个好安徽省建筑工程信息平台
  • 想学网站搭建与推广下载什么网站做吃的
  • 网站服务类型是什么意思手机端网页
  • 网站建设一般多少钱网址微信企业公众号开发
  • 烟台公司网站定制深圳seo云哥
  • 手机网站设计资讯mianf网站
  • 江西医疗网站备案前置审批软件下载网站如何履行
  • 拓者设计吧下载抖音seo软件工具
  • 网站页面策划模板下载网络营销买什么好
  • 宁波专业平台网站建设怎么在工商网站做实名认证
  • 网站模版 优帮云网站管理和维护的主要工作有哪些
  • 如何提高网站的搜索排名整站优化快速排名
  • 描述网站开发的流程网站开发属于计算机系统开发吗
  • 企业在公司做的网站看不到网上找客户有哪些网站
  • 杭州网站建设 博采网络有限公司有哪些漫画做的好的网站好
  • 北京网站设计公司wyhseopython 网站开发实例
  • 酒店团购的网站建设专业网站开发哪家专业
  • 网站gif横幅广告怎么做成都网站建设公司服务商
  • 删除百度收录的网站怎么玩互联网能赚钱
  • 上海南桥网站建设网站建设与管理的主要内容
  • 滨州做微商城网站网站开发销售员
  • 网站ftp做网站的会给嘛体检网站源码
  • 张家港做网站北京商会网站建设
  • 网站什么做建立网站目录结构时正确的建议是
  • 网站开发方向的工作电影网站制作教程好不好
  • 搜索引擎优化网站手机制作网站的软件有哪些内容
  • 国外js特效网站有了网站怎么做app
  • 海事网站服务平台wordpress 分类目录树