python snap7 简书_完美适配,您需要知道的 SnapKit

前言

众所周知,iPhone 的屏幕是越来越多样化了,多样化的屏幕满足了用户差异化的需求,同时也增加了开发者的工作 ----- 适配,面对多样化、不同屏幕尺寸的设备,之前在 iOS 中的 frame 布局以显得不合时宜,于是 Apple 推出了 AutoLayout ,AutoLayout 在可是化编程中的优势是不容置喙的,然而对于习惯于 code 界面的朋友来说就不那么友好了,面对这样的问题,众多第三方框架横空出世,目前为止支持率比较高的当属 SnapKit 了。

正文

当然,如果你之前对 Masonry 非常熟悉,那么恭喜你,你可以平滑的过度到 SnapKit, 如果你对 SnapKit 比较陌生,那么也没关系,请继续往下看☺。

安装

如果你的项目是用 CocoaPods 来管理组件的,那么你只需要在 Podfile 里加入 :

pod 'SnapKit', '~> 3.0'

然后在 terminal 里执行

pod install

等待安装成功就可以 import SnapKit 使用了。

用法

SnapKit 框架的设计,简单易用,可读性好。当你想要构建一个 tableView , tableView 在父视图中的 padding 为 20, 那么用 SnapKit 怎么做呢?

tableView.snp.makeConstraints { (make) in

make

.edges

.equalTo(self.view)

.inset(UIEdgeInsets(

top: 20,

left: 20,

bottom: 20,

right: 20

)

)

}

or

tableView.snp.makeConstraints { (make) in

make.left.top.equalTo(self.view).offset(20)

make.right.bottom.equalTo(self.view).offset(-20)

}

这是最常用的写法了,当然我们的实际项目中的布局是非常复杂的,并不是所有的视图都能用 equalTo 来进行布局的,有了 SnapKit ,你可以用:

.equalTo 等价于 NSLayoutRelation.Equal

.lessThanOrEqualTo 等价于 NSLayoutRelation.GreaterThanOrEqual

.greaterThanOrEqualTo 等价于 NSLayoutRelation.GreaterThanOrEqual

我们用一张表来罗列出 SnapKit 的属性与 NSLayout 中的属性对应关系:

ViewAttribute

NSLayoutAttribute

view.snp.left

NSLayoutAttribute.left

view.snp.right

NSLayoutAttribute.right

view.snp.top

NSLayoutAttribute.top

view.snp.bottom

NSLayoutAttribute.bottom

view.snp.leading

NSLayoutAttribute.leading

view.snp.trailing

NSLayoutAttribute.trailing

view.snp.width

NSLayoutAttribute.width

view.snp.height

NSLayoutAttribute.height

view.snp.centerX

NSLayoutAttribute.centerX

view.snp.centerY

NSLayoutAttribute.centerY

view.snp.lastBaseline

NSLayoutAttribute.lastBaseline

通过这张表,我们可以根据自己的需要对相应的动画进行布局,但这还不能完全满足我们的需求,我们的应用是非常复杂的,如果产品要求我们的 APP 需要根据用户的交互反馈来更新视图的 frame 或者 需要做动画呢?别担心,SnapKit 为我们提供了 Constraint 属性关联。也就是说我们可以将要更改的约束进行关联,然后改变它,如:

声明关联属性

var topConstraint: Constraint? = nil

初始化

button.snp.makeConstraints { (make) in

self.topConstraint = make.top.equalTo(self.view).offset(100).constraint

make.centerX.equalTo(self.view.snp.centerX)

make.width.equalTo(60)

make.height.equalTo(30)

}

更改

UIView.animate(withDuration: 5) {

self.topConstraint?.update(offset: 200)

self.view.layoutIfNeeded()

}

这样一个简单的动画就完成了。当然,如果你想更新约束,你还可以用 .snp.updateConstraints

self.button.snp.updateConstraints({ (make) in

make.top.equalTo(200)

})

self.view.layoutIfNeeded()

还有一个问题是,如果我们引用了一个三方视图库,我们想改变他的约束,担忧不知道原来的约束怎么办呢?其实我们可以用 snp.remakeConstraints

button.snp.remakeConstraints { (make) in

make.top.equalTo(self.view).offset(100)

make.centerX.equalTo(self.view.snp.centerX)

make.width.equalTo(60)

make.height.equalTo(30)

}

这样首先会移除原有的控件的约束,然后重新设置约束。

看到这里相信大家对 SnapKit 的使用并不陌生了吧!

这里有一个常见的问题, 如果我们需要通过数组动态创建一组控件,要求长宽高都相等,并列排放在父视图中:

for (idx, item) in items.enumerated() {

if items.count < 2 { return }

if idx == 0 {

item.snp.makeConstraints({ (make) in

make.left.top.bottom.equalTo(self)

make.width.equalTo(items[idx + 1])

make.right.equalTo(items[idx + 1].snp.left)

})

} else if idx == items.count - 1 {

item.snp.makeConstraints({ (make) in

make.right.top.bottom.equalTo(self)

make.width.equalTo(items[idx - 1])

})

} else {

item.snp.makeConstraints({ (make) in

make.top.bottom.equalTo(self)

make.left.equalTo(items[idx - 1].snp.right)

make.width.equalTo(items[idx - 1].snp.width)

})

}

}

这样,一组动态的创建好了!

请看 AutoLayoutDemo

水平有限,如有疏漏,望指正

欢迎交流,欢迎 star CNKCQ

遗人🌹,手有余香 blog

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python递归函数是指一个函数在其函数体内调用自己的一种方法。它是一种简洁而有力的编程技巧,适用于解决需要重复进行相同或者相似操作的问题。 在Python中,使用递归函数的语法很简单,只需要在函数体内调用自身并提供适当的终止条件即可。递归函数通常包括两个部分:基本情况和递归情况。 基本情况是指函数可以直接得到结果而不需要调用自身的情况。在遇到基本情况时,递归函数就可以停止递归并返回结果,从而避免无限循环。 递归情况是指函数需要调用自身来解决更小规模的问题的情况。在递归情况下,函数将输入参数缩小到更小的规模,然后再次调用自身,直到达到基本情况。 递归函数可以解决很多问题,比如计算斐波那契数列、计算阶乘、二叉树的遍历等。递归函数的运行过程可以形象地表示为一个函数的调用栈。 需要注意的是,递归函数可能存在性能问题。因为每次递归调用都会创建一个新的函数帧,所以递归函数的内存消耗较大。此外,如果递归调用的深度过大,可能会导致堆栈溢出错误。 为了解决这些问题,可以优化递归函数的实现,比如使用尾递归优化、剪枝等技巧。另外,在使用递归函数时,一定要确定递归结束条件,并尽量避免无限递归的情况。 总之,Python递归函数是一种非常有用的编程技巧,可以简化问题的解决过程。但是在使用时需要注意性能和终止条件,避免出现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值