python snap7 简书_SnapKit真好用

阿里云2.1.0版本的UI都是基于Storyboard完成的,第一次用Storyboard,感觉很新鲜很好用,到后面真的是深陷泥潭。我把所有的Storyboard都写在Main.Storyboard文件中,现在我已经不想打开这个文件了,因为会很卡,并且位置稍微移动,就会产生变化,对于多人协作是一个问题。另外一个就是没法定义标准视觉库,字体大小和颜色什么的,都没法使用自定义的值。2.2.0版本新来了一个小伙伴一起开发,所以得解决这个问题。调研了一下,发现SnapKit很不错,于是乎在新版本便完全基于这个库写Autolayout约束。

iOS9之前官方支持三种设置约束的方式,分别是Storyboard、constraintWithItem、constraintsWithVisualFormat。Storyboard的优点是所见即所得,出了问题立马会有警告和错误提示。constraintWithItem这种方式代码实在繁杂。VFL代码简洁,效率高,但是可读性和可维护性太差。这三种方式的缺点都非常致命。iOS9开始支持的NSLayoutAnchor是一种比较完美的方式,但是一时半会儿还没法用。

之前听说过Masonry,这是Objective-C写的一个开源库。而SnapKit是一个类似的DSL,它封装了苹果的AutoLayout,所以功能和性能都不会有问题,并且是用Swift写的,所以在Swift项目中用起来更加方便。

SnapKit提供了一些小的便利,比如不用自己手动关闭AutoResizing。

view.translatesAutoresizingMaskIntoConstraints = false

SnapKit提供的inset在某些情况下非常之好用。比如有些视觉会是在cell的上下左右加一定的margin,内容显示在中间,那么一行代码就可以轻松搞定了。

self.snp_makeConstraints { (make) -> Void in

make.edges.equalTo(self.contentView).inset(UIEdgeInsetsMake(10, 10, 10, 10));

}

这样链式设置也是可以的。

self.snp_makeConstraints { (make) -> Void in

make.top.trailing.bottom.equalTo(0)

make.width.equalTo(100))

}

AutoLayout做动画也是蛮方便的,先修改constraint,设置上setNeedsLayout,然后在动画里面调用layoutIfNeeded。

self.snp_makeConstraints(closure: { (make) -> Void in

self.heightConstraint = make.height.equalTo(60).constraint

make.width.equalTo(view)

make.centerX.equalTo(view)

self.topConstraint = make.top.equalTo(view.snp_bottom).constraint

if defaultShowed == true {

self.topConstraint.updateOffset(-60)

}

})

final func show(callback : YWSAnimationCallBack? = nil)

{

self.topConstraint.updateOffset(-self.heightConstraint)

self.setNeedsLayout()

UIView.animateWithDuration(0.25, animations: { () -> Void in

self.layoutIfNeeded()

if callback != nil {

callback!()

}

}, completion: nil)

}

用Storyboard的时候有一个问题是UITableviewCell上子view的left margin,在iPhone6及以下手机是15,iPhone6 Plus是20,但是在Storyboard里面设置这个值就会固定是8,如果再加上7,在Plus上也是15了,这样就会导致文字跟分割线不对齐。

Snip20160127_15

Snip20160127_16

这个问题只能通过手动设置UITableview.separatorInset固定等于15。但是如果是手动添加约束,或者使用SnapKit就不会有这个问题,所以用SnapKit记得leading设置等于superview的leadingMargin。

self.contentView.addConstraint(NSLayoutConstraint(item: view,

attribute: NSLayoutAttribute.Leading,

relatedBy: NSLayoutRelation.Equal,

toItem: self.contentView,

attribute: NSLayoutAttribute.LeadingMargin,

multiplier: 1.0,

constant: 0))

self.userNameLabel.snp_makeConstraints { (make) -> Void in

make.top.equalTo(14)

make.leading.equalTo(self.contentView.snp_leadingMargin)

make.trailing.equalTo(self.contentView).offset(-8)

}

有了SnapKit,再加上Self Sizing Cell,再复杂的布局,我都不曾害怕过O(∩_∩)O~ 不过AutoLayout无法解决hidden(AutoLayout的方式是设置constraint=0)的问题,遇到一些复杂的cell,其中某几个字段可以没有,然后就要隐藏相应的控件,这种就比较蛋疼了。所以还是期待iOS9的普及让我们早日用上NSLayoutAnchor+UIStackview,到那个时候用官方的方法写UI也会是一件非常轻松惬意的事情。

奉上一篇非常赞的文章:有趣的Autolayout示例-Masonry实现,文章中有一个demo,里面所有示例都用Masonry完成,玩法跟SnapKit类似。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值