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了,这样就会导致文字跟分割线不对齐。

SnapKit真好用_第1张图片
Snip20160127_15
SnapKit真好用_第2张图片
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类似。

你可能感兴趣的:(SnapKit真好用)