关于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