參考 snapKitDocs孵稽、snapKit詳解
相信大家若看完上面兩個鏈接之后,一定會對snapKit有更進(jìn)一步的了解翁涤。啰嗦的話就不多說了形庭,這篇文章主要對平時開發(fā)中少用的一些關(guān)于snapKit的東西做了下test。用過snapKit或Masonry的同學(xué)可忽略上面鏈接埋酬,有興趣的話簡單看下哨啃。
Demo涉及知識點(diǎn):
****priority 優(yōu)先級****
****在約束改變的時候帶有動畫****
****修正:位移修正(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() { // 官方推薦写妥,更新視圖的約束拳球,在這里進(jìn)行操作
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() // 若想達(dá)到動畫效果,這兩個方法一定要這樣配合使用珍特,不然你試試.
UIView.animate(withDuration: 0.3) { [weak self] in
self?.view.layoutIfNeeded()
}
}
/*
priority注意: makeConstraints與updateViewConstraints時祝峻,需同時設(shè)置優(yōu)先級,
且優(yōu)先級小于1000扎筒,若等于1000 無效莱找,大于1000 crash。
snapKit3.0,棄用 priorityLow嗜桌、priorityMedium奥溺、priorityHigh、priorityRequired骨宠。
*/
/*
關(guān)于Constraint這里不做太多介紹浮定,常用的就是我們可以保存約束,然后可以進(jìn)行层亿,
更新壶唤,
update(offset: ConstraintOffsetTarget)
update(inset: ConstraintInsetTarget)
update(priority: ConstraintPriorityTarget)
刪除
deactivate()
*/
/*
updateConstraints更新約束,只更新棕所,改變的約束.
*/
}
最終實(shí)現(xiàn)效果圖
equal
equalToSuperview() 等于父視圖
equalTo(<#T##other: ConstraintRelatableTarget##ConstraintRelatableTarget#>) 等于目標(biāo)關(guān)聯(lián)闸盔,這個用的最多是不是,??
lessThanOrEqualTo(<#T##other: ConstraintRelatableTarget##ConstraintRelatableTarget#>)小于等于目標(biāo)關(guān)聯(lián)
greaterThanOrEqualTo(<#T##other: ConstraintRelatableTarget##ConstraintRelatableTarget#>) 大于等于目標(biāo)關(guān)聯(lián)
lessThanOrEqualToSuperview()小于等于父視圖
greaterThanOrEqualToSuperview()大于等于父視圖
priority
priorityLow():設(shè)置低優(yōu)先級,優(yōu)先級為250
priorityMedium():設(shè)置中優(yōu)先級琳省,優(yōu)先級為500(這個也就是默認(rèn)的優(yōu)先級)
priorityHigh():設(shè)置高優(yōu)先級迎吵,優(yōu)先級為750
priority():可以設(shè)置任意的優(yōu)先級躲撰,接受的參數(shù)是0-1000的數(shù)字。比如:priority(600)
snp_remakeConstraints & snp_updateConstraints
1击费,snp_remakeConstraints相當(dāng)于先snp_removeConstraints拢蛋,再snp_makeConstraints。兩種方式效率沒區(qū)別蔫巩。不過重做約束還是建議用snp_remakeConstraints谆棱,不僅少寫一個方法,代碼邏輯看起來也更清晰圆仔。
2垃瞧,不同于snp_remakeConstraints重做所有的約束。 snp_updateConstraints用于只更新部分約束坪郭。
multipliedBy
// 寬高比16:9
make.height.equalTo(constrintView.snp.width).multipliedBy(9.0 / 16)