相信大家若看完上面两个链接之后,一定会对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)
网友评论