亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

開源 Swift AutoLayout 框架 SnapKit 介紹

2019-11-09 15:07:19
字體:
來源:轉載
供稿:網友

轉自:http://www.cnblogs.com/missingcat92/p/4686248.html?utm_source=tuicool&utm_medium=referral

自從水果發布了5代,蘋果為了適配多種屏幕尺寸,搞出了一個所謂的AutoLayout來解決問題,iOS程序員們從此走上了苦逼的適配路。

“適配”本身其實并不是一個頭疼的事情,對于4-6寸的手機來說,只要制定一套規則,就不會有太大的問題。但是令我痛苦的部分在于——iOS的 Constraints 和 VFL。

痛苦的NSLayoutConstraints

這里借用iOS開源項目 Masonry 的描述,假如我們要讓一個view在superview里居中,然后每條邊留出10像素的空白,代碼是這樣寫的:

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);[superview addConstraints:@[ //view1 constraints [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeTop multiplier:1.0 constant:padding.top], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:padding.left], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-padding.bottom], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeRight multiplier:1 constant:-padding.right], ]];

如果你剛剛接觸iOS開發,你可能認為這并不是什么問題。但是讓我們做個對比,在web開發中,應該怎么寫呢?

#view{margin:10px;}

一行代碼搞定問題,CSS是世界上最偉大的排版引擎,沒有之一。明明很簡單的事情,為什么放到iOS上,竟然變得這么這么這么復雜了?

仍然痛苦的VFL

然后蘋果又搞出了VFL,網上對此描述最多的是“象形文字”,雖然它真的真的改善了我們創建constraints的方式,讓這一切變得更快更方便,但是對于下面這段代碼,我仍然是不滿的。

constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[trackBtn]-15-[filterBtn(40)]-15-|", options: NSLayoutFormatOptions.AlignAllRight, metrics: nil, views: views)constraints += NSLayoutConstraint.constraintsWithVisualFormat("[trackBtn]-15-|", options: NSLayoutFormatOptions.AlignmentMask, metrics: nil, views: views)constraints += NSLayoutConstraint.constraintsWithVisualFormat("|-15-[filterBtn]-15-|", options: NSLayoutFormatOptions.AlignmentMask, metrics: nil, views: views)

莫名其妙的options,metrics和views參數的組合,長成狗一樣的函數名。而且即使是有了VFL,我們還是離不開 constraints ,VFL并沒有真的滿足我們的所有需求,比如你看看 這個需求。

那么,我們是不是只能一聲嘆氣,說,iOS的世界就這樣了呢?

NO!!!我們有Masonry和SnapKit!!!

SnapKit能搞定什么

SnapKit是Masonry的Swift版,項目發布至今大約1年的時間,已經在github上有兩千多個star,當然了,這其中也少不了”他爹”Masonry給他打的那些廣告。

如果你還記得你在 StoryBoard 里面拉的那些線條,那你也一定記得其中 constriants 的表示方法:

這里寫圖片描述

SnapKit所做的就是這樣一件事——讓你這樣寫 constraints。

我們看看文章最頂部的那個需求用 SnapKit 如何實現:

view1.snp_makeConstraints { (make) -> Void in make.top.equalTo(superview).offset(10) make.left.equalTo(superview).offset(10) make.bottom.equalTo(superview).offset(-10) make.right.equalTo(superview).offset(-10)}

對!就是這么簡單!還可以更簡單?。?/p>view1.snp_makeConstraints { (make) -> Void in make.edges.equalTo(superview).insets(UIEdgeInsetsMake(10, 10, 10, 10))}

這里寫圖片描述

(注:作者只發了一張表情

這里寫圖片描述

來,請跟我一起大叫三聲爽!

爽!

爽!

叫完之后我們繼續看還能怎么爽:

// 不只是相等哦,大于等于也是有的make.centerX.lessThanOrEqualTo(view2.snp_left)make.left.greaterThanOrEqualTo(label.snp_left)// 不止是邊緣哦,寬度高度也是有的// width >= 200 && width <= 400make.width.greaterThanOrEqualTo(200)make.width.lessThanOrEqualTo(400)// 其實可以簡單點,一行搞定一個sizemake.size.equalTo(CGSizeMake(50, 100))// 鏈式操作,優先級想怎么搞就怎么搞make.left.greaterThanOrEqualTo(label.snp_left).PRiorityLow()// 媽媽再也不擔心我不會排版了,什么向左5像素向下10像素我一行代碼就搞定啦make.center.equalTo(superview).offset(CGPointMake(-5, 10))

做起動畫來也是一把好手!

view1.snp_makeConstraints { (make) -> Void in self.topConstraint = make.top.equalTo(superview).offset(padding.top).constraint make.left.equalTo(superview).offset(padding.left)}// then later you can callself.topConstraint.uninstall()// or if you want to update the constraintself.topConstraint.updateOffset(5)// 也可以用 snp_updateConstraints 實現上述需求

這么好的東西,我去哪里搞!

如果你用CocoaPods,那么Podfile你懂的:

pod 'SnapKit', :git => 'https://github.com/SnapKit/SnapKit.git', :branch => 'swift-2.0'

如果你用Carthege……這個我沒用過我就不瞎說了……

總之呢,不用CocoaPods的朋友可以去 這里 下載,至于怎么弄進項目我就不管了(好好滴干嘛不用CocoaPods..)

成果

我用SnapKit做了下面這個界面:

這里寫圖片描述

體驗之后發現,其實用SnapKit和原生constraints的代碼行數差不多,但是每一行從原來的極為冗長的一坨東西,變成了很容易閱讀和維護的短小精干的代碼,代碼像下面這樣優雅,這便是SnapKit最大的作用。

mapView.snp_makeConstraints { (make) -> Void in make.edges.equalTo(view)}locateImage.snp_makeConstraints { (make) -> Void in let topHeight = navigationController!.navigationBar.frame.height + UIapplication.sharedApplication().statusBarFrame.height make.centerX.equalTo(mapView) make.bottom.equalTo(mapView.snp_centerY).offset(topHeight/2)}filterBtn.snp_makeConstraints { (make) -> Void in make.left.equalTo(mapView).offset(15) make.right.equalTo(mapView).offset(-15) make.height.equalTo(40) make.bottom.equalTo(mapView).offset(-15)}trackBtn.snp_makeConstraints { (make) -> Void in make.bottom.equalTo(filterBtn.snp_top).offset(-15) make.right.equalTo(mapView).offset(-15)}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲国产成av人片传媒| 视频直播国产精品| 日韩精品中文字幕在线播放| 亚洲人成77777在线观看网| 国产91精品在线播放| 日本久久久久久| 欧美日韩一区二区三区在线免费观看| 日韩美女主播视频| 国产在线精品播放| 久久久久久久999精品视频| 日韩高清不卡av| 精品久久久久久国产91| 亚洲福利在线视频| 亚洲日韩第一页| 91丝袜美腿美女视频网站| 国产精品久久久久9999| 久久成人在线视频| 亚洲奶大毛多的老太婆| 国产精品高精视频免费| 国产精品高潮呻吟久久av黑人| 亚洲自拍av在线| 在线视频欧美性高潮| 国产精品中文字幕在线| 欧美在线xxx| 精品国产一区二区三区久久| 久热精品在线视频| 亚洲性夜色噜噜噜7777| 亚洲精品视频免费在线观看| 国产日韩欧美91| 亚洲精品电影在线观看| 亚洲激情成人网| 亚洲精品视频中文字幕| 97在线日本国产| 一区二区亚洲欧洲国产日韩| 最近2019中文字幕第三页视频| 在线电影欧美日韩一区二区私密| 91精品国产综合久久香蕉最新版| 久久露脸国产精品| 萌白酱国产一区二区| 高清欧美电影在线| 色777狠狠综合秋免鲁丝| 亚洲免费人成在线视频观看| 国产精品久久久久aaaa九色| 国产精品爽爽爽爽爽爽在线观看| 一区二区三区国产视频| 欧美性做爰毛片| 久久福利网址导航| 欧美日韩另类在线| 日韩av毛片网| 欧美电影第一页| 久久久999成人| 另类专区欧美制服同性| 欧美激情视频一区二区| 国产91免费看片| 日韩精品视频在线观看网址| 日韩精品黄色网| 成人妇女免费播放久久久| 国产精品日韩欧美综合| 国产精品中文字幕在线| 国产精品99蜜臀久久不卡二区| 美日韩丰满少妇在线观看| 国产精品人成电影在线观看| 欧美国产日韩一区二区三区| 欧美床上激情在线观看| 国产亚洲欧美另类中文| 国产精品美腿一区在线看| 热门国产精品亚洲第一区在线| 成人乱色短篇合集| 亚洲欧美日韩另类| 亚洲字幕在线观看| 57pao成人永久免费视频| 欧美国产日韩一区二区三区| 亚洲福利视频在线| 奇米成人av国产一区二区三区| 国产mv免费观看入口亚洲| 日本道色综合久久影院| 日韩一区二区精品视频| 欧美性高跟鞋xxxxhd| 国产精品丝袜白浆摸在线| 亚洲久久久久久久久久久| 在线播放日韩av| 久久影视电视剧免费网站清宫辞电视| 亚洲美女精品成人在线视频| 26uuu亚洲国产精品| 国产v综合ⅴ日韩v欧美大片| 欧美成年人视频网站欧美| 日韩久久午夜影院| 亚洲国产中文字幕久久网| 亚洲免费精彩视频| 在线电影av不卡网址| 日韩av在线播放资源| 国产成人精品网站| 亚洲精品美女网站| 欧美激情久久久久久| 久久成人这里只有精品| 国产色综合天天综合网| 91精品国产91久久久久久| 九九九热精品免费视频观看网站| 亚洲成av人片在线观看香蕉| 国色天香2019中文字幕在线观看| 亚洲自拍小视频免费观看| 中文字幕日韩欧美| 亚洲日韩中文字幕在线播放| 中文字幕欧美日韩在线| 欧美日韩中文字幕日韩欧美| 久久人人97超碰精品888| 欧美激情欧美激情| 上原亚衣av一区二区三区| 欧美日韩美女在线| 欧美专区在线观看| 九九久久综合网站| 亚洲精品国产欧美| 欧美日韩中国免费专区在线看| 日韩欧美在线观看| www国产精品com| 欧美性视频精品| 日韩国产精品亚洲а∨天堂免| 国产精品老女人视频| 国产中文字幕亚洲| 精品国产91乱高清在线观看| 激情成人中文字幕| 日韩av在线最新| 精品国产精品自拍| 韩曰欧美视频免费观看| 亚洲综合在线播放| 日韩av在线免播放器| 成人福利视频在线观看| 欧亚精品在线观看| 国产精品中文字幕在线观看| 久久精品欧美视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩美女视频在线观看| 久久久久久久久久婷婷| 久久这里只有精品视频首页| 久久99精品久久久久久青青91| 黑人巨大精品欧美一区二区一视频| 亚洲在线免费观看| 亚洲天堂av电影| 国产精品一区二区三区免费视频| 性色av一区二区三区红粉影视| 在线电影av不卡网址| 日韩美女主播视频| 国产精品欧美风情| 亚洲欧美日韩直播| 久久久久久久久久久av| 国产午夜精品麻豆| www.日韩不卡电影av| 美女视频久久黄| 96国产粉嫩美女| 中文字幕精品久久| 日韩在线播放av| 亚洲第一视频网站| 中文字幕精品在线视频| 久久综合久久88| 国产福利视频一区二区| 亚洲性视频网址| 欧美性猛交xxxx乱大交蜜桃| 欧美日韩成人在线视频| 欧美性生交大片免费| 亚洲第一视频网站| 91精品啪在线观看麻豆免费| 久久视频国产精品免费视频在线| 精品亚洲精品福利线在观看| 91精品国产网站|