花絮:基于上一篇文章又有幾個(gè)月沒有寫文章了絮短,剛好最近項(xiàng)目基本完成填抬,開啟了16年制定的目標(biāo)每?jī)扇齻€(gè)月讀一本書籍翻默,并做好記錄
臼婆,希望自己可以堅(jiān)持下去抒痒,這次讀的是核心動(dòng)畫高級(jí)技巧,已經(jīng)把電子檔和最后推薦的軟件上傳之碼云上面,喜歡的朋友可以去下載颁褂。
在此聲明:本文章為七秒一個(gè)字一個(gè)字敲起來(lái)的故响,在敲打的過(guò)程中難免有錯(cuò)別字,如果錯(cuò)別字對(duì)于您由理解的影響颁独,那么請(qǐng)你在下留言彩届,七秒會(huì)立即改正。
傳送門
- iOS11和iPhone X的適配
- 2017年iOS面試題總結(jié)
- iOS開發(fā)個(gè)人開發(fā)賬號(hào)的證書詳細(xì)使用及介紹
- 自定義XIB View里面添加其他自定義Xib View
1. contentsGravity
表示設(shè)置layer
上面設(shè)置圖片的的拉伸方式誓酒。和UIImage
上面的contentModel
一致樟蠕,只是它設(shè)置的類型是NSString
類型
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill
2.contentsScale
表示當(dāng)前layer
設(shè)置的圖片像素尺寸和試圖大小的比例,可以當(dāng)前圖片在當(dāng)下屏幕上面一個(gè)點(diǎn)顯示的像素值靠柑。
注意:如果設(shè)置了contentsGravity
的值為改變寄宿圖片拉伸效果會(huì)導(dǎo)致設(shè)置的contentsScale
設(shè)置的效果無(wú)效
3.contentsRect
表示要在layer
區(qū)域顯示的寄宿圖片的區(qū)域寨辩。contentRect
設(shè)置的單位坐標(biāo),默認(rèn)為(0歼冰,0靡狞,1,1)隔嫡,如果我們?cè)O(shè)置為(0,0,0.5,0.5)時(shí)甸怕,layer
上面顯示的圖片就是寄宿圖片左上角四分之一。
4.contentsCenter
定義一個(gè)固定的邊框和一個(gè)在圖層上面可以拉伸的區(qū)域腮恩。設(shè)置的也是單位坐標(biāo)梢杭。注意:此屬性我們也是可以在XIB里面設(shè)置。stretching
對(duì)應(yīng)的
5.shadowOpacity
設(shè)置layer
的陰影
1.需要設(shè)置陰影的時(shí)候秸滴,必須設(shè)置shadowOpacity
的值是在0.0到1.0
之間式曲,0.0
表示完全透明,1.0
表示完全不透明
2.設(shè)置陰影的另外三個(gè)必不可少的方法shadowColor、shadowOffest吝羞、shadowRadius
shadowColor
表示設(shè)置的陰影的顏色,一個(gè)CGColorRef
對(duì)象
shadowOffest
表示設(shè)置陰影的方向和距離。是一個(gè)CGSize
的值内颗,寬度控制陰影的位移钧排,高度控制著縱向的位移。默認(rèn)是{0,-3}
為何為負(fù)數(shù)均澳,因?yàn)樵贛AC OS 上面原點(diǎn)在左下角恨溜。所以在MAC OS
上面是在下面顯示的陰影。
shadowRadius
控制著陰影的模糊度找前,當(dāng)為0的時(shí)候糟袁,陰影和layer
就會(huì)有一個(gè)明顯的分界線,當(dāng)值越來(lái)越大的時(shí)候躺盛,就會(huì)越來(lái)越自然和模糊项戴。
注意:當(dāng)設(shè)置陰影和裁剪的時(shí)候,會(huì)把陰影的裁剪掉槽惫,因?yàn)殛幱笆窃趌ayer以外的周叮,而裁剪就是沿著layer邊框裁剪,一般就需要在l試圖層上面在添加一個(gè)試圖界斜,使用低試圖的陰影仿耽,使用上試圖的裁剪即可
注意:陰影不是根據(jù)邊界和圓角路徑來(lái)確認(rèn)陰影形狀的,而是將寄宿圖(包括子試圖等)考慮在內(nèi)各薇,然后通過(guò)這些來(lái)完美搭配圖層形狀從而創(chuàng)建一個(gè)陰影(也就是根據(jù)寄宿圖形狀來(lái)顯示陰影项贺,而不是邊界),這也是有多個(gè)子圖層時(shí)峭判,計(jì)算陰影就會(huì)很耗資源的原因
6.layer
上面的觸摸判斷hitTest
來(lái)判斷
我們可以根據(jù)觸摸點(diǎn)來(lái)轉(zhuǎn)換坐標(biāo)(convertPoint:fromLayer)和包含當(dāng)下坐標(biāo)點(diǎn)(containsPoint:)
判斷是否在當(dāng)前的layer
來(lái)響應(yīng)當(dāng)下的事件
同樣我們可以使用hitTest :
來(lái)返回觸摸點(diǎn)的layer
來(lái)判斷开缎,從而響應(yīng)事件
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = touches.anyObject;
CGPoint point = [touch locationInView:self.contentView];
/**使用hitTest 來(lái)判斷是否觸摸點(diǎn)在那個(gè)layer圖層上面 如果超過(guò)點(diǎn)超過(guò)了最外層layer上面,則會(huì)返回nil 測(cè)試下即使更改底部layer的zPosition讓底部layer顯示上面后朝抖,也是可以觸摸到的啥箭,和書上面顯示的有沖突,不知治宣。急侥。。侮邀。*/
CALayer *layer = [self.contentView.layer hitTest:point];
if (layer == self.redLayer) {
NSLog(@"觸摸紅色的layer");
}else if (layer == self.blueLayer){
NSLog(@"觸摸藍(lán)色layer");
}
}
7.shadowPath
設(shè)置陰影的圖形
如果設(shè)置知道圖層的陰影形狀切圖層層級(jí)比較多的時(shí)候坏怪,我們可以使用shadowPath
來(lái)設(shè)置圖層的陰影;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:contentLayer.bounds cornerRadius:50];
contentLayer.shadowPath = path.CGPath;
8.mask
遮蓋來(lái)設(shè)置圖層顯示的形狀
`mask`可以理解為遮蓋绊茧,蒙版铝宵,父試圖(就是設(shè)置`mask`的圖層)顯示的區(qū)域就是`mask`的區(qū)域與父圖層區(qū)域相較的部分,超過(guò)的部分就會(huì)被`mask`剪切掉。
'' CALayer *layer = [CALayer layer];
'' UIImage *sex36m = [UIImage imageNamed:@"sex36m"];
'' layer.frame = contentLayer.bounds;
'' layer.contentsGravity = kCAGravityCenter;
'' layer.contents = (__bridge id _Nullable)sex36m.CGImage;
'' contentLayer.mask = layer;
9.minificationFilter
(縮小圖片)和magnificationFilter
(放大圖片)壓縮和拉伸過(guò)濾
layer
三種拉伸過(guò)濾模式
kCAFilterLinear
采用雙線性濾波算法鹏秋,通過(guò)對(duì)多個(gè)像素取樣最終生成新的值尊蚁,得到一個(gè)平滑的表現(xiàn)拉伸。當(dāng)放大的倍數(shù)比較大的時(shí)候圖片就會(huì)模糊不清侣夷。
kCAFilterTrilinear
和kCAFilterLinear
非常相似横朋,采用的是三線性濾波算法存儲(chǔ)多個(gè)大小情況下的圖片,并三維取樣百拓,同時(shí)結(jié)合大圖和小圖的存儲(chǔ)進(jìn)而得到最后的結(jié)果琴锭。
kCAFilterNearest
取樣最近的單像素點(diǎn)而不管其他顏色,這樣做非逞么快决帖,也不會(huì)是圖片模糊,但卻是圖片馬賽克更嚴(yán)重蓖捶。如果圖片顏色分界線比較明顯地回,那么使用此模式比較好。
10.layerClass
1.返回一個(gè)當(dāng)前試圖寄宿的圖層類型腺阳,當(dāng)我們想更換試圖的寄宿的圖層類型的時(shí)候落君,我們就需要重寫這個(gè)方法返回試圖類型。注意當(dāng)我們創(chuàng)建試圖后亭引,就無(wú)法更改它的主寄宿圖層绎速,可以通過(guò)layerClass
來(lái)返回一個(gè)試圖的主寄宿圖當(dāng)然我們也是可以通過(guò)添加圖層到試圖上面,那樣我們就浪費(fèi)了試圖創(chuàng)建的主試圖焙蚓,同樣子圖層也是無(wú)法跟蹤試圖邊界的大小纹冤,所以就需要我們手動(dòng)更新子圖層邊界,所以我們不建議添加子圖層的方法來(lái)改變?cè)噲D的顯示圖層购公。
11.2D變換
1.`view`上面的`transform`是一個(gè)`CGAffineTransform`類型,且`layer`上面與之對(duì)應(yīng)的屬性為`affineTransform`萌京,而`layer`上面的`transform`屬性是一個(gè)`CGTransform3D `類型。`CGAffineTransform`類型是一個(gè)2D平面的操作的宏浩,也是`CGTransform3D `類型里面沿著Z軸操作知残。
2.`CGAffineTransformMakeScale(<#CGFloat sx#>, <#CGFloat sy#>)`更改大小的
`CGAffineTransformMakeTranslation(<#CGFloat tx#>, <#CGFloat ty#>)`更改位置
`CGAffineTransformMakeRotation(<#CGFloat angle#>)` 旋轉(zhuǎn)角度
3.組合操作
`CGAffineTransformIdentity `創(chuàng)建一個(gè)空的`transform`
`CGAffineTransformScale(<#CGAffineTransform t#>, <#CGFloat sx#>, <#CGFloat sy#>)` 基于上一個(gè)`transform`在添加改變大小操作
`CGAffineTransformTranslate(<#CGAffineTransform t#>, <#CGFloat tx#>, <#CGFloat ty#>)`基于上一個(gè)`transform` 在添加位移操作
`CGAffineTransformRotate(<#CGAffineTransform t#>, <#CGFloat angle#>)` 基于上一個(gè)`transform`在添加旋轉(zhuǎn)操作
`CGAffineTransformConcat(<#CGAffineTransform t1#>, <#CGAffineTransform t2#>)`混合兩個(gè)已經(jīng)存在的操作,**放在前面的先執(zhí)行**
**注意:當(dāng)使用混合`transfoem`操作動(dòng)畫的時(shí)候,上一個(gè)添加的操作會(huì)直接影響到下一個(gè)`transform`的比庄,特別是縮放和位移直接按的影響求妹,如:一個(gè)view 寬高都是100 ,先執(zhí)行x,y各縮小50%佳窑,再X軸位移100制恍,相對(duì)于開始位置實(shí)際位移多少?(75)**
12.3D變換
1.3D變換比2D變換多了3d立體感的效果神凑。其實(shí)也是使用`透視投影`來(lái)實(shí)現(xiàn)的
設(shè)置`透視投影`的值净神,就是設(shè)置m34的值。一般設(shè)置為`-1.0/(500~1000)`看著更想3D的時(shí)候,就是你想要的值
2.其實(shí)3D和2D的用法基本是一致的鹃唯,再次我就不啰嗦了爱榕。但是還是要介紹兩個(gè)屬性`sublayerTransform`和`isDoubleSided`
3.`sublayerTransform`當(dāng)我們想讓父試圖上面多個(gè)子試圖都進(jìn)行單獨(dú)的3D變換的時(shí)候,那么我就需要設(shè)置各個(gè)子試圖的`透視投影`,那樣看起來(lái)很麻煩俯渤,簡(jiǎn)單一點(diǎn)呆细,我就可以設(shè)置父試圖的`sublayerTransform`屬性來(lái)設(shè)置統(tǒng)一的`透視投影`,為什么要設(shè)置統(tǒng)一的`透視投影`,是為了讓3D效果更逼真八匠,是讓`滅點(diǎn)`統(tǒng)一。
4.`isDoubleSided`來(lái)描述圖層的背面是否會(huì)被繪制趴酣,當(dāng)不需要繪制背面的圖像的時(shí)候梨树,我們就可以設(shè)置為`false`來(lái)節(jié)約GPU的開銷,默認(rèn)是`true`**注意:其實(shí)背面繪制的圖和正面剛好產(chǎn)生的鏡子效應(yīng)**
**注意岖寞,說(shuō)的是3d變化抡四,其實(shí)并不是一個(gè)真正的3D,僅僅是平面繪制的仗谆,而是改變了大小加上`透視投影`來(lái)產(chǎn)生的一個(gè)假的3D效果 想看3DDemo的可以看下[]**
13指巡,CAGradientLayer 顏色漸變的layer
1.colors
用來(lái)顯示變化顏色的數(shù)組,數(shù)組的順序就是顏色漸變的吮吸
2.locations
:表示每個(gè)顏色開始變化的數(shù)組隶垮。注意:值只能遞增從0-1,切數(shù)組的count必須和colors
count一致
3.startPoint
:表示開始顏色開始的位置藻雪,和endPoint
一起來(lái)表示顏色漸變的方向。注意:開始的位置和locations
設(shè)置的值是相對(duì)應(yīng)的
14.CAReplicatorLayer 高效生成多個(gè)相似的layer
1.我可能可以使用CAReplicatorLayer
來(lái)高效生成多個(gè)多個(gè)相似的圖層狸吞。
2.instanceCount
:表示圖層重復(fù)多少次
3.instanceTransform
:來(lái)制定圖層是怎么樣的變換勉耀,注意:圖層的變換是基于上一個(gè)圖層變換后的位置為基點(diǎn)做變換,而不是第一個(gè)圖層
4.instanceGreenOffset
蹋偏、instanceBlueOffset
便斥、instanceRedOffset
、instanceAlphaOffset
四個(gè)屬性威始,來(lái)表示顏色和透明度的變化枢纠。
15,隱式動(dòng)畫
1.隱式動(dòng)畫:改變圖層(不是試圖上面寄宿的圖層)上面動(dòng)畫屬性所執(zhí)行的動(dòng)畫(個(gè)人總結(jié))
2,calyer
上面更改屬性(可以做動(dòng)畫的屬性)的值,默認(rèn)都是可以做動(dòng)畫(隱式)改變的黎棠,動(dòng)畫的時(shí)間默認(rèn)0.25s
3.這些動(dòng)畫的類型和時(shí)間都是根據(jù)當(dāng)前的事務(wù)
來(lái)決定的晋渺。事務(wù)實(shí)際上是Core Animation
用來(lái)包含一系列屬性動(dòng)畫的集合的機(jī)制,注意:任何由事務(wù)來(lái)指定的做動(dòng)畫的屬性都不會(huì)立馬改變葫掉,而是只有當(dāng)事務(wù)提交的時(shí)候些举,才可以改變。
4.在每一個(gè)runloop
周期里面都自動(dòng)開啟一次新的事務(wù)俭厚,這也就是你不需要手動(dòng)開啟事務(wù)的原因户魏。任何一次runloop
循環(huán)中屬性的改變都被集中起來(lái),然后做一個(gè)事務(wù)時(shí)間動(dòng)畫
5.事務(wù)由CATransaction
類來(lái)便是,begin
表示開啟一個(gè)事務(wù)叼丑,commit
提交事務(wù)关翎。setAnimationDuration
設(shè)置事務(wù)的時(shí)間(也就是動(dòng)畫的時(shí)間)setCompletionBlock
表示執(zhí)行完畢動(dòng)畫之后,再執(zhí)行的事件(block
里面的事件的事務(wù)和外面你設(shè)置的事務(wù)是不一致的鸠信,當(dāng)執(zhí)行完畢之后纵寝,設(shè)置的事務(wù)以及移除棧,所以block
執(zhí)行的就是你當(dāng)前runloop
里面的事務(wù))注意:如果你直接設(shè)置當(dāng)前runloop
里面事務(wù)的時(shí)間星立,那么就會(huì)更改這個(gè)runloop
里面所有動(dòng)畫的時(shí)間
16.隱式動(dòng)畫實(shí)現(xiàn)原理
1.當(dāng)CALyer
的屬性被修改的時(shí)后爽茴,它會(huì)調(diào)用-actionForKey:
傳遞是屬性名稱
2.圖層首先檢測(cè)它是否有委托,并且是否是實(shí)現(xiàn)CALayerDelegate
協(xié)議制定的-actionForlayer:forkey
方法绰垂,如果有直接調(diào)用返回結(jié)果室奏。
3.如果沒有委托,或者委托沒有實(shí)現(xiàn)-actionForLayer:forkey
方法劲装,圖層接著檢查包含屬性名稱對(duì)應(yīng)行為映射的actions
字典
4.如果actions
字典沒有包含對(duì)應(yīng)的屬性胧沫,那么圖層接著在它的style
字典接著搜索屬性名稱
5.最后如果在style里面也沒找到對(duì)應(yīng)的行為,那么圖層將會(huì)直接調(diào)用自定義了每個(gè)是屬性的標(biāo)準(zhǔn)行為的-defaultActionForKey:
方法
補(bǔ)充:大家都知道占业,直接改變視圖上layer的屬性是不會(huì)做隱式動(dòng)畫的绒怨,那是為何?
每一個(gè)視圖UIView
對(duì)它關(guān)聯(lián)的圖層都扮演了一個(gè)委托谦疾,并且 提供了-actionLayer:forKey
的實(shí)現(xiàn)方法南蹂。當(dāng)不在一個(gè)動(dòng)畫塊的實(shí)現(xiàn)中,UIView
對(duì)所有的圖層行為返回nil餐蔬,但是在動(dòng)畫block
(動(dòng)畫block)范圍之內(nèi)碎紊,它就會(huì)返回一個(gè)非空值,這就是為何我們直接作用在試圖上面的layer不會(huì)由隱式動(dòng)畫
17.呈現(xiàn)圖層:
1.當(dāng)我們操作layer
上面動(dòng)畫時(shí)樊诺,我們更改的屬性值是立馬改變的仗考,但是給我們顯示出來(lái)的卻是動(dòng)畫改變。其實(shí)我們看到的動(dòng)畫改變就是一個(gè)呈現(xiàn)圖層
2.呈現(xiàn)圖層:其實(shí)就是圖層的賦值词爬,并且記錄著圖層在屏幕上當(dāng)下時(shí)刻的屬性值秃嗜,我們可以使用'-presentationLayer
'來(lái)訪問(wèn)。
3.眾所周知顿膨,iOS屏幕刷新的頻率是一秒60次锅锨,當(dāng)我們執(zhí)行動(dòng)畫的之間大于60分之一秒的時(shí)候,Core Animation
就會(huì)在一次舊值和新值之間恋沃,對(duì)屏幕上的圖層進(jìn)行重新組織必搞,更改呈現(xiàn)圖層屬性的值。
補(bǔ)充呈現(xiàn)圖層用處:
4.1囊咏,一般我們是不會(huì)操作或者訪問(wèn)圖層的呈現(xiàn)圖層的恕洲。
4.2如果創(chuàng)建一個(gè)定時(shí)動(dòng)畫塔橡,這個(gè)時(shí)候就需要準(zhǔn)確知道某一時(shí)刻圖層顯示的位置,這個(gè)時(shí)候我們可以需要獲取呈現(xiàn)圖層上面屬性的位置霜第,來(lái)操作動(dòng)畫了
4.3葛家,當(dāng)我們使用-hitTest
來(lái)響應(yīng)圖層上面的觸摸的時(shí)候,我們可以使用呈現(xiàn)圖層來(lái)判斷泌类,例如:如果圖層在移動(dòng)中癞谒,來(lái)點(diǎn)擊移動(dòng)的圖層,那么這個(gè)時(shí)候呈現(xiàn)試圖就會(huì)非常有用
fileprivate func wj_testPresentationLayer(_ touches:Set<UITouch>)
let touch = (touches as NSSet).anyObject() as! UITouch;
let point = touch.location(in: self.view);
if((self.animationLayer.presentation()?.hitTest(point)) != nil){
self.animationLayer.backgroundColor = UIColor.gray.cgColor;
}else{
CATransaction.begin();`
CATransaction.setAnimationDuration(4.0);`
CATransaction.setCompletionBlock({`
self.animationLayer.backgroundColor = UIColor.red.cgColor;
})
self.animationLayer.position = point;`
CATransaction.commit();`
}
}
18視圖上面由多個(gè)動(dòng)畫的時(shí)候刃榨,如何區(qū)分
1.使用-addAnimation:forKey:
根據(jù)key
我們可以區(qū)分不同的動(dòng)畫弹砚。如果是相同的動(dòng)畫操作不同的圖層呢?
2,我們可以給顯示動(dòng)畫通過(guò)**KVC**
的方法設(shè)置對(duì)應(yīng)的圖層或者專屬值枢希。
3.在代理里面我們就可以直接可以區(qū)分圖層或者動(dòng)畫了
animation.setValue("七秒", forKey: "name")
let anme = anim.value(forKey: "name");
print(anme);
19 關(guān)鍵幀動(dòng)畫(CAKeyframeAnimation
)的rotationMode
1.rotationMode
設(shè)置為kCAAnimationRotateAuto
的時(shí)候迅栅,我們可以讓圖層自動(dòng)調(diào)整沿著path設(shè)置的曲線的切線方向
20設(shè)置圖層旋轉(zhuǎn)360°
`animation.keyPath = "transform.rotation";`
animation.byValue = (M_PI*2); `
`transform.rotation` 稱之為虛擬屬性。
21動(dòng)畫組晴玖,也比較簡(jiǎn)單
`CAAnimationGroup`動(dòng)畫組有個(gè)`animations`數(shù)組屬性,來(lái)添加多個(gè)作用在圖層上面的動(dòng)畫为流,添加動(dòng)畫沒有前后順序呕屎,一般我們都是根據(jù)動(dòng)畫的`beginTime`來(lái)區(qū)分前后順序
22 過(guò)渡動(dòng)畫
1.當(dāng)我們需要更改圖層的底圖或者文本的時(shí)候,想動(dòng)畫更改那別不能動(dòng)畫的屬性的時(shí)候敬察,這是我們就可以使用過(guò)渡動(dòng)畫秀睛。
2,過(guò)渡動(dòng)畫使用CATransition
來(lái)表示,使用type
和subType
來(lái)表示變換效果莲祸,注意是CATransition
蹂安,而不是事務(wù)CATransaction
3.type
:表示想要使用那種變化效果,subType
:表示效果從那個(gè)方向過(guò)來(lái)锐帜。
4.startProgress
開始動(dòng)畫的地方,默認(rèn)是0
5.endProgress
結(jié)束動(dòng)畫的地方田盈,默認(rèn)是1.0
type:
kCATransitionFade :淡入淡出
kCATransitionMoveIn:從頂部滑動(dòng)進(jìn)來(lái)
kCATransitionPush: 一側(cè)滑動(dòng)進(jìn)來(lái),把舊圖推送出去
kCATransitionReveal:把舊圖層滑動(dòng)出去缴阎,顯示新的
以下為私有API允瞧,目前還可以使用:
cube 立方體
suckEffect 吸走的效果
oglFlip 前后翻轉(zhuǎn)效
rippleEffect 波紋效果
pageCurl 翻頁(yè)起來(lái)
pageUnCurl 翻頁(yè)下來(lái)
cameraIrisHollowOpen 鏡頭開
cameraIrisHollowClose 鏡頭關(guān)
subType:
kCATransitionFromRight: 從右側(cè)劃入
kCATransitionFromLeft: 從左側(cè)滑入
kCATransitionFromTop 往頭部方向滑動(dòng)
kCATransitionFromBottom 往底部方向滑動(dòng)
注意:過(guò)渡動(dòng)畫設(shè)置動(dòng)畫的key是一個(gè)常量transition,而不是你設(shè)置的key蛮拔,在此我們可以使用kvc來(lái)區(qū)分動(dòng)畫
切換tabbar加上過(guò)渡動(dòng)畫
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let animation = CATransition.init();
animation.duration = 4.0;
animation.type = "oglFlip";
if viewController.isMember(of: ViewController.self) {
animation.subtype = kCATransitionFromLeft;
}else{
animation.subtype = kCATransitionFromRight;
}
self.view.layer.add(animation, forKey: nil);
}
下面是小魚兒推薦應(yīng)用環(huán)節(jié)
mac效率軟件Alfred述暂,讓你慢慢丟失鼠標(biāo),讓你工作效率翻倍建炫。密碼為xclient.info
傳送門
- iOS11和iPhone X的適配
- 2017年iOS面試題總結(jié)
- iOS開發(fā)個(gè)人開發(fā)賬號(hào)的證書詳細(xì)使用及介紹
- 自定義XIB View里面添加其他自定義Xib View
你的關(guān)注和喜歡是七秒前進(jìn)的動(dòng)力