关于SnapKit

作者: HunterDude | 来源:发表于2016-12-30 17:07 被阅读1922次

    参考 snapKitDocssnapKit详解

    相信大家若看完上面两个链接之后,一定会对snapKit有更进一步的了解。啰嗦的话就不多说了,这篇文章主要对平时开发中少用的一些关于snapKit的东西做了下test。用过snapKit或Masonry的同学可忽略上面链接,有兴趣的话简单看下。

    • Demo涉及知识点:

    • ****priority 优先级****

    • ****在约束改变的时候带有动画****

    • ****修正:位移修正(inset、offset)****

    • ****lessThanOrEqualTo(小于或等于)****

    • 啰嗦几句

    • ****equal****

    • ****priority****

    • ****snp_remakeConstraints & snp_updateConstraints****

    • ****multipliedBy倍率修正 ****

    configure: Xcode 8.0+, Swift 3.0+, snapKit 3.0+ .

    //
    //  ViewController.swift
    //  snapKitDemo
    //
    //  Created by Hunter on 30/12/2016.
    //  Copyright © 2016 Hunter. All rights reserved.
    //
    
    import UIKit
    import SnapKit
    
    class ViewController: UIViewController {
    
    
        // MARK - property
        
        private var scacle = 1.0
        private var sizeConstraint: Constraint?
        private lazy var redV: UIView = {
           let temp = UIView()
            temp.backgroundColor = UIColor.red
            let tapSingle=UITapGestureRecognizer(target:self,action:#selector(tap))
            self.view.addGestureRecognizer(tapSingle)
            return temp
        }()
        private lazy var redSubCyanV: UIView = {
            let temp = UIView()
            temp.backgroundColor = UIColor.cyan
            return temp
        }()
        
    
        // MARK - override
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            // add
            view.addSubview(redV)
            redV.addSubview(redSubCyanV)
            
            // layout
            redV.snp.makeConstraints { (make) in // size最大为300
                sizeConstraint = make.width.height.equalTo(100).priority(1).constraint
                make.size.lessThanOrEqualTo(CGSize.init(width: 300, height: 300))
            }
            redSubCyanV.snp.makeConstraints { (make) in
                make.edges.equalToSuperview().inset(UIEdgeInsetsMake(10, 10, 10, 10))
            }
        }
        
        // updateViewConstraints
        
        override func updateViewConstraints() { // 官方推荐,更新视图的约束,在这里进行操作
            redV.snp.updateConstraints { (make) in
                sizeConstraint?.update(offset: 100 * scacle) // 更新保存的约束
            }
            super.updateViewConstraints()
        }
        
        
        // MARK - tap
        
        @objc private func tap(sender: UITapGestureRecognizer) {
            scacle += 1
            self.view.setNeedsUpdateConstraints() // 若想达到动画效果,这两个方法一定要这样配合使用,不然你试试.
            UIView.animate(withDuration: 0.3) { [weak self] in
                self?.view.layoutIfNeeded()
            }
        }
        
        /*
         priority注意: makeConstraints与updateViewConstraints时,需同时设置优先级,
         且优先级小于1000,若等于1000 无效,大于1000 crash。
         snapKit3.0,弃用 priorityLow、priorityMedium、priorityHigh、priorityRequired。
         */
        
        /*
         关于Constraint这里不做太多介绍,常用的就是我们可以保存约束,然后可以进行,
         更新,
         update(offset: ConstraintOffsetTarget)
         update(inset: ConstraintInsetTarget)
         update(priority: ConstraintPriorityTarget)
         删除 
         deactivate()
         */
         /*
          updateConstraints更新约束,只更新,改变的约束.
         */
    }
    
    最终实现效果图

    equal

    equalToSuperview() 等于父视图
    equalTo(<#T##other: ConstraintRelatableTarget##ConstraintRelatableTarget#>) 等于目标关联,这个用的最多是不是,😆
    lessThanOrEqualTo(<#T##other: ConstraintRelatableTarget##ConstraintRelatableTarget#>)小于等于目标关联
    greaterThanOrEqualTo(<#T##other: ConstraintRelatableTarget##ConstraintRelatableTarget#>) 大于等于目标关联
    lessThanOrEqualToSuperview()小于等于父视图
    greaterThanOrEqualToSuperview()大于等于父视图
    

    priority

    priorityLow():设置低优先级,优先级为250
    priorityMedium():设置中优先级,优先级为500(这个也就是默认的优先级)
    priorityHigh():设置高优先级,优先级为750
    priority():可以设置任意的优先级,接受的参数是0-1000的数字。比如:priority(600)
    

    snp_remakeConstraints & snp_updateConstraints

    1,snp_remakeConstraints相当于先snp_removeConstraints,再snp_makeConstraints。两种方式效率没区别。不过重做约束还是建议用snp_remakeConstraints,不仅少写一个方法,代码逻辑看起来也更清晰。
    2,不同于snp_remakeConstraints重做所有的约束。 snp_updateConstraints用于只更新部分约束。
    

    multipliedBy

    // 宽高比16:9
    make.height.equalTo(constrintView.snp.width).multipliedBy(9.0 / 16)
    

    相关文章

      网友评论

        本文标题:关于SnapKit

        本文链接:https://www.haomeiwen.com/subject/geimvttx.html