篇一:iOS 8自定義動(dòng)畫轉(zhuǎn)場上手指南
華寧ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
iOS 5發(fā)布的時(shí)候,蘋果針對應(yīng)用程序界面的設(shè)計(jì),提出了一種全新的,革命性的方法—Storyboard,它從根本上改變了現(xiàn)有的設(shè)計(jì)理念。iOS 5之前,每個(gè)視圖控制器通常都伴有一個(gè)Interface Builder的文件,叫nib或者xib,這個(gè)想法比較簡單:每個(gè)視圖控制器的界面應(yīng)該在各自的nib文件中設(shè)計(jì),而所有的nib文件一起構(gòu)成了整個(gè)應(yīng)用程序的界面。一方面,這個(gè)是很方便的,因?yàn)樗鼜?qiáng)迫開發(fā)者在界面設(shè)計(jì)的時(shí)候?qū)⒆⒁饬性诮缑嫔?,但另一方面,到最后,太多的文件不得不被?chuàng)建,開發(fā)者將不能概覽應(yīng)用的整體界面。
隨著storyboard的產(chǎn)生,上面的這些都成為了歷史,因?yàn)檫@種新方法受到了開發(fā)者社區(qū)的廣泛使用。相比老的技術(shù),storyboards提供了三個(gè)重要的優(yōu)勢:
整個(gè)界面設(shè)計(jì)只發(fā)生在一個(gè)文件里。項(xiàng)目的總文件數(shù)量大大減少了,特別是在大項(xiàng)目里。當(dāng)然你可以使用額外的nib文件,并且允許只創(chuàng)建輔助視圖。
開發(fā)者能即時(shí)瀏覽應(yīng)用的界面和流程。 視圖控制器之間的轉(zhuǎn)換(界面設(shè)計(jì)的專業(yè)術(shù)語叫場景(scene)),以及轉(zhuǎn)換是如何發(fā)生的,在storyboard中已被完美地定義并清楚地呈現(xiàn)給了開發(fā)者。
綜上所述,場景之間的轉(zhuǎn)換構(gòu)成storyboard的特殊部分,我們一般把它叫做轉(zhuǎn)場(segue)。
轉(zhuǎn)場跟應(yīng)用的導(dǎo)航和處理是密切相關(guān)的,因?yàn)樗鞔_定義了一個(gè)視圖切換到另一個(gè)視圖的轉(zhuǎn)換細(xì)節(jié)。這些細(xì)節(jié)指定了是否應(yīng)用動(dòng)畫,動(dòng)畫的類型,當(dāng)然還有實(shí)際轉(zhuǎn)換時(shí)的準(zhǔn)備和性能。除此之外,轉(zhuǎn)場也用來將傳遞數(shù)據(jù)到下一個(gè)視圖控制器里,這個(gè)用法也很常見。
從編程的角度看,場景是UIStoryboardSegue類的一個(gè)對象,它第一次在iOS 5中介紹到。和其它類的對象
不同的是,這種對象不能直接的創(chuàng)建或使用。不過你可以指定轉(zhuǎn)場的屬性,然后在轉(zhuǎn)場即將發(fā)生時(shí)提供給它以達(dá)到目的。UIKit框架提供了一些帶默認(rèn)動(dòng)畫過渡的預(yù)定義的轉(zhuǎn)場,包括:push segues(包括導(dǎo)航控制器的app),帶有動(dòng)畫選擇的模態(tài)轉(zhuǎn)場(modal segues), popover segues。更高級的情況下,iOS SDK默認(rèn)的轉(zhuǎn)場可能不夠用,所以開發(fā)者必須實(shí)現(xiàn)他們的自定義轉(zhuǎn)場(custom segues)。 創(chuàng)建一個(gè)自定義轉(zhuǎn)場并不難,因?yàn)樗莍OS標(biāo)準(zhǔn)編程技術(shù)的組成部分。實(shí)際上你只需要生成UIStoryboardSegue的子類,并重載一個(gè)叫perform的方法即可。這個(gè)perform方法中必須實(shí)現(xiàn)自定義動(dòng)畫的邏輯。從一個(gè)視圖控制器轉(zhuǎn)換到另一個(gè)以及返回操作的觸發(fā),也需要由開發(fā)者編程提供,這是一個(gè)標(biāo)準(zhǔn)的步驟。 在本教程中,我的目標(biāo)是向你們展示如何實(shí)現(xiàn)自定義轉(zhuǎn)場,并通過一個(gè)簡單的演示應(yīng)用介紹這個(gè)概念的所有方面。擁有創(chuàng)建自定義轉(zhuǎn)場的知識, 可以將你導(dǎo)
向開發(fā)更強(qiáng)大的app的道路。此外,對于最大化用戶體驗(yàn),并開發(fā)引人注目的漂亮應(yīng)用,自定義轉(zhuǎn)場也很有幫助。 如果你有興趣學(xué)習(xí)我剛剛說的話,就一起來探索教程里的`所有細(xì)節(jié)和自定義轉(zhuǎn)場的奧秘吧。
應(yīng)用程序概述不像我之前幾個(gè)教程提供了一個(gè)啟動(dòng)項(xiàng)目,本教程我們將從頭開始創(chuàng)建app。事實(shí)上,我是故意這么做的,因?yàn)?,?xiàng)目中一些重要部分需要用到Interface Builder,所以我認(rèn)為從頭開始按部就班的來做,能讓你看清里面的細(xì)節(jié)。
正如我先前所說,我們將開發(fā)一個(gè)非常簡單的app,在這個(gè)應(yīng)用中我們將創(chuàng)建兩個(gè)自定義轉(zhuǎn)場。需要提前說明的是,我們的演示應(yīng)用將有三個(gè)視圖控制器,也就是在Interface Builder中有三個(gè)場景和三個(gè)相關(guān)類。默認(rèn)情況下,第一個(gè)是由Xcode創(chuàng)建的,因此我們只要再添加兩個(gè)。我們將創(chuàng)建的自定義轉(zhuǎn)場用來導(dǎo)航第一個(gè)視圖控制器到第二個(gè)
(以及返回),以及從第一個(gè)到第三個(gè)(以及返回)。第二個(gè)和第三個(gè)視圖控制器之間我們不添加任何聯(lián)系。
因此,我們需要?jiǎng)?chuàng)建兩個(gè)自定義轉(zhuǎn)場。因?yàn)橐ǚ祷兀恳粋€(gè)轉(zhuǎn)場需要?jiǎng)?chuàng)建兩個(gè)對應(yīng)的類(因此,共四個(gè)):第一個(gè)類里我們將實(shí)現(xiàn)從第一個(gè)視圖控制器到另一個(gè)轉(zhuǎn)換的所有自定義邏輯。第二個(gè)類實(shí)現(xiàn)返回到第一個(gè)視圖控制器的邏輯,或者換句話說要實(shí)現(xiàn)解除轉(zhuǎn)場(unwind segue)。后面會(huì)講到解除轉(zhuǎn)場,現(xiàn)在只需要記住這就是用來讓我們返回到前一個(gè)視圖控制器的轉(zhuǎn)場。
視圖控制器本身沒什么需要做的。我們會(huì)用一個(gè)label注明視圖控制器的名稱,每一個(gè)會(huì)有一個(gè)不同的背景顏色,可以讓我們很容易地查看轉(zhuǎn)換(是的,這將是一個(gè)五顏六色的應(yīng)用)。第一個(gè)和第二個(gè)視圖控制器也會(huì)多一個(gè)label,其中從其他視圖控制器傳來的自定義的消息將被顯示出來。
最后,轉(zhuǎn)場將在以下的動(dòng)作發(fā)生的時(shí)候
篇二:Swift常用UIView Animation API使用
Swift常用UIView Animation API使用
本文默認(rèn)讀者有基礎(chǔ)動(dòng)畫編寫能力
參數(shù)解釋
*如解釋有誤,請指出,謝謝*
1 duration: 動(dòng)畫執(zhí)行時(shí)間
2 delay:動(dòng)畫延遲執(zhí)行時(shí)間
3 options:
.Repeat:動(dòng)畫永遠(yuǎn)重復(fù)的運(yùn)行
.Autoreverse:動(dòng)畫執(zhí)行結(jié)束后按照相反的行為繼續(xù)執(zhí)行。該屬性只能和.Repeat屬性組合使用
.CurveLinear:動(dòng)畫做線性運(yùn)動(dòng)
.CurveEaseIn:動(dòng)畫緩慢開始,然后逐漸加速
.CurveEaseOut:動(dòng)畫迅速開始,在結(jié)束時(shí)減速
.CurveEaseInOut:動(dòng)畫慢慢開始,然后加速,在結(jié)束之前減速.TransitionNone:沒有轉(zhuǎn)場動(dòng)畫
.TransitionFlipFromTop :從頂部圍繞水平軸做翻轉(zhuǎn)動(dòng)畫 .TransitionFlipFromBottom:從底部圍繞水平軸做翻轉(zhuǎn)動(dòng)畫
.TransitionFlipFromLeft :從左側(cè)圍繞垂直軸做翻轉(zhuǎn)動(dòng)畫
.TransitionFlipFromRight:從右側(cè)圍繞垂直軸做翻轉(zhuǎn)動(dòng)畫
.TransitionCurlUp:從下往上做翻頁動(dòng)畫
.TransitionCurlDown :從上往下做翻頁動(dòng)畫
.TransitionCrossDissolve:視圖溶解消失顯示新視圖動(dòng)畫
4 usingSpringWithDamping:彈簧阻力,取值范圍為0.0-1.0,數(shù)值越小“彈簧”振動(dòng)效果越明顯。
5 initialSpringVelocity:動(dòng)畫初始的速度(pt/s),數(shù)值越大初始速度越快。但要注意的是,初始速度取值較高而時(shí)間較短時(shí),也會(huì)出現(xiàn)反彈情況。普通動(dòng)畫
animateWithDuration:delay:options:animations:completion: class func animateWithDuration(_ duration: NSTimeInterval,
delay delay: NSTimeInterval,
options options: UIViewAnimationOptions,
animations animations: () - Void,
completion completion: ((Bool) - Void))
Animate changes to one or more views using the specified duration, delay, options, and completion handler.
對一個(gè)或者多個(gè)視圖按照相應(yīng)參數(shù)做固定動(dòng)畫(翻譯純屬個(gè)人見解,有錯(cuò)請指出)
animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
class func animateWithDuration(_ duration: NSTimeInterval,
delay delay: NSTimeInterval,
usingSpringWithDamping dampingRatio: CGFloat,
initialSpringVelocity velocity: CGFloat,
options options: UIViewAnimationOptions,
animations animations: () - Void,
completion completion: ((Bool) - Void))
Performs a view animation using a timing curve corresponding to the motion of a physical spring.
對一個(gè)視圖按照相應(yīng)參數(shù)做彈性動(dòng)畫(類似于彈簧,翻譯純屬個(gè)人見解,有錯(cuò)請指出)
圖片借鑒Renfei Song's Blog,只為更清楚的展示調(diào)用兩個(gè)API的不同效果
Spring Animation 和普通的動(dòng)畫的運(yùn)動(dòng)曲線的對比:
Spring Animation, Ease-Out Animation 和 Linear Animation 的動(dòng)畫效果:
轉(zhuǎn)場動(dòng)畫
transitionWithView:duration:options:animations:completion: class func transitionWithView(_ view: UIView,
duration duration: NSTimeInterval,
options options: UIViewAnimationOptions,
animations animations: (() - Void),
completion completion: ((Bool) - Void))
Creates a transition animation for the specified container view.為指定的視圖構(gòu)建一個(gè)過渡動(dòng)畫(翻譯純屬個(gè)人見解,有錯(cuò)請指出)transitionFromView:toView:duration:options:completion:
class func transitionFromView(_ fromView: UIView,
toView toView: UIView,
duration duration: NSTimeInterval,
options options: UIViewAnimationOptions,
completion completion: ((Bool) - Void))
Creates a transition animation between the specified views using the given parameters.
在兩個(gè)給定視圖之間構(gòu)建過渡動(dòng)畫(翻譯純屬個(gè)人見解,有錯(cuò)請指出)
以上為UIView Animation的基礎(chǔ)動(dòng)畫API,使用其實(shí)很簡單,就是要理解不同參數(shù)的意義。
篇三:iOS開發(fā)學(xué)習(xí)之核心動(dòng)畫
核心動(dòng)畫基本概念
基礎(chǔ)動(dòng)畫(CABasicAnimation)
關(guān)鍵幀動(dòng)畫(CAKeyframeAnimation)
動(dòng)畫組
轉(zhuǎn)場動(dòng)畫-CATransition
UIView的轉(zhuǎn)場動(dòng)畫-雙視圖
一、核心動(dòng)畫基本概念
1.導(dǎo)入QuartzCore.framework框架
開發(fā)步驟
1).初始化一個(gè)動(dòng)畫對象(CAAnimation)并且設(shè)置一些動(dòng)畫相關(guān)屬性
2).CALayer中很多屬性都可以通過CAAnimation實(shí)現(xiàn)動(dòng)畫效果,包括:opacity、position、transform、bounds、contents等(可以在API文檔中搜索:CALayer Animatable Properties)
3).添加動(dòng)畫對象到層(CALayer)中,開始執(zhí)行動(dòng)畫
4).通過調(diào)用CALayer的addAnimation:forKey增加動(dòng)畫到層(CALayer)中,這樣就能觸發(fā)動(dòng)畫。通過調(diào)用removeAnimationForKey可以停止層中的動(dòng)畫
5).Core Animation的動(dòng)畫執(zhí)行過程都是后臺(tái)操作的,不會(huì)阻塞主線程
2.屬性
1).duration:動(dòng)畫的持續(xù)時(shí)間
2).repeatCount:重復(fù)次數(shù)(HUGE_VALF、MAX FLOAT無限重復(fù))
3).repeatDuration:重復(fù)時(shí)間(用的很少)
4).removedOnCompletion:默認(rèn)為Yes。動(dòng)畫執(zhí)行完后默認(rèn)會(huì)從圖層刪除掉
5).fillMode
6).biginTime
7).timingFunction:速度控制函數(shù),控制動(dòng)畫節(jié)奏
8).delegate
二、基礎(chǔ)動(dòng)畫(CABasicAnimation)
如果只是實(shí)現(xiàn)簡單屬性變化的動(dòng)畫效果,可以使用UIView的塊動(dòng)畫替代基本動(dòng)畫
1.屬性說明
-fromValue:keyPath相應(yīng)屬性值的初始值
-toValue:keyPath相應(yīng)屬性的結(jié)束值
2.動(dòng)畫過程說明:
-隨著動(dòng)畫的就行,在duration的持續(xù)時(shí)間內(nèi),keyPath相應(yīng)的屬性值從fromValue漸漸變?yōu)閠oValue
-keyPath內(nèi)容是CALayer的可動(dòng)畫Animation屬性
-如果fillMode=kCAFillModeForwards同時(shí)removedOnCompletion=NO,那么在動(dòng)畫執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫執(zhí)行后的狀態(tài),但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫執(zhí)行前的初始值,并沒有真正改變
3.代碼實(shí)現(xiàn)
位移需要考慮目標(biāo)點(diǎn)設(shè)定的問題
1.將動(dòng)畫的所有方法封裝到一個(gè)類里面
MyCAHelper.h
#import
#import
#define kCAHelperAlphaAnimation @"opacity"; ?// 淡入淡出動(dòng)畫 #define kCAHelperScaleAnimation @"transform.scale";// 比例縮放動(dòng)畫
#define kCAHelperRotationAnimation @"transform.rotation";// 旋轉(zhuǎn)動(dòng)畫
#define kCAHelperPositionAnimation @"position"; // 平移位置動(dòng)畫
@interface MyCAHelper : NSObject
#pragma mark - 基本動(dòng)畫統(tǒng)一調(diào)用方法
+ (CABasicAnimation *)myBasicAnimationWithType:(NSString *)animationTypeduration:(CFTimeInterval)duration from:(NSValue *)from
to:(NSValue *)to
autoRevereses:(BOOL)autoRevereses;
#pragma mark - 關(guān)鍵幀動(dòng)畫方法
#pragma mark 搖晃動(dòng)畫
+ (CAKeyframeAnimation
*)myKeyShakeAnimationWithDuration:(CFTimeInterval)duration
angle:(CGFloat)angle
repeatCount:(CGFloat)repeatCount;
#pragma mark 貝塞爾路徑動(dòng)畫
+ (CAKeyframeAnimation *)myKeyPathAnimationWithDuration:(CFTimeInterval)durationpath:(UIBezierPath *)path;
#pragma mark 彈力仿真動(dòng)畫
+ (CAKeyframeAnimation *)myKeyBounceAnimationFrom:(CGPoint)from
to:(CGPoint)to
duration:(CFTimeInterval)duration;
@end
MyCAHelper.m
#import "MyCAHelper.h"
@implementation MyCAHelper
#pragma mark - 基本動(dòng)畫統(tǒng)一調(diào)用方法
+ (CABasicAnimation *)myBasicAnimationWithType:(NSString *)animationTypeduration:(CFTimeInterval)duration
from:(NSValue *)from
to:(NSValue *)to
autoRevereses:(BOOL)autoRevereses
{
// 1. 實(shí)例化一個(gè)CA動(dòng)畫對象
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:animationType];
// 2. 設(shè)置動(dòng)畫屬性
[anim setDuration:duration];
[anim setFromValue:from];
[anim setToValue:to];
[anim setAutoreverses:autoRevereses];
return anim;
}
#pragma mark - 關(guān)鍵幀動(dòng)畫方法
#pragma mark 搖晃動(dòng)畫
+ (CAKeyframeAnimation
*)myKeyShakeAnimationWithDuration:(CFTimeInterval)duration
angle:(CGFloat)angle
repeatCount:(CGFloat)repeatCount
{
// 1. 初始化動(dòng)畫對象實(shí)例
CAKeyframeAnimation *anim = [CAKeyframeAnimation
animationWithKeyPath:@"transform.rotation"];
// 2. 設(shè)置動(dòng)畫屬性
[anim setDuration:duration];
[anim setValues:@[@(angle), @(-angle), @(angle)]];
[anim setRepeatCount:repeatCount];
return anim;
}
#pragma mark 貝塞爾路徑動(dòng)畫
+ (CAKeyframeAnimation *)myKeyPathAnimationWithDuration:(CFTimeInterval)duration path:(UIBezierPath *)path
{
// 1. 初始化動(dòng)畫對象實(shí)例
CAKeyframeAnimation *anim = [CAKeyframeAnimation
animationWithKeyPath:@"position"];
// 2. 設(shè)置動(dòng)畫屬性
[anim setDuration:duration];
基礎(chǔ)
一定的編程經(jīng)驗(yàn)
這里說的編程經(jīng)驗(yàn)是至少熟練一門編程語言,對 OOP 有一定的了解,最好熟悉一些基本的設(shè)計(jì)模式。遇到過的好多 iOS 開發(fā),大多是從別的語言轉(zhuǎn)過來的,所以有一定的編程基礎(chǔ),學(xué)起來會(huì)更容易 get the point.
如果是第一次接觸編程,當(dāng)然也是沒問題的,只是要做好心理準(zhǔn)備,可能會(huì)比想象的難。
英語
發(fā)現(xiàn)不少開發(fā)對于英語似乎有點(diǎn)接受不能,通常都是中文優(yōu)先,除非迫不得已,才硬著頭皮看看 StackOverflow,英文文章,文檔等。忘了是誰說過「難走的路越走越好走」,通常如此。其實(shí)只要稍微 push 一下自己,那些技術(shù)文章啃下來應(yīng)該不會(huì)有太大的問題,有過幾次成功的體驗(yàn)后,這種恐懼感就會(huì)減少很多。優(yōu)質(zhì)的文章、視頻、書籍,多是英文的,不邁過這個(gè) 坎,將來要么成為瓶頸,要么花更大的成本去填補(bǔ)。
入門
書籍
要學(xué)習(xí) iOS 開發(fā),自然要先學(xué) Objective-C (當(dāng)然現(xiàn)在也可以直接上 Swift,不過如果多人協(xié)作的話,OC目前還是主流),因?yàn)?OC 是 C 語言的超集,所以了解 C 語言對于學(xué)習(xí) OC 肯定會(huì)有幫助,不過就算不了解,直接學(xué) OC 也沒太大問題。
這里推薦 BNR (Big Nerd Ranch) 的這本 Objective-C Programming The Big Nerd Ranch Guide,講解地比較細(xì)致,能幫助你更好的理解 OC,更重要的是教你遇到問題時(shí),如何去解決問題,以及這個(gè)問題對應(yīng)的一些知識點(diǎn),如何使用文檔等等。
來到一個(gè)新的世界,肯定會(huì)對這個(gè)世界充滿好奇,想訂閱一大堆博客,買一堆書,看各種教程和視頻,然后就變得浮躁,不知該從哪下手,這會(huì)導(dǎo)致拖延癥。 我渴了,給我倒一杯水,這個(gè)很直接,馬上就可以做,但如果是給我買一瓶飲料,而自己對那些飲料又不怎么熟悉時(shí),就糾結(jié)了,不如刷會(huì)微博,看看朋友圈,玩?zhèn)€小游戲先。
所以一本好的入門教材很重要,要契合自己當(dāng)前的水平,且常常會(huì)有收獲,這種成就感會(huì)激勵(lì)著你繼續(xù)學(xué)下去。
在看書的過程中,往往會(huì)有這樣的經(jīng)歷:書中提到某個(gè)人、觀點(diǎn)、知識點(diǎn)、書、文章,然后就順著它提到的這些東西出去了,可能某個(gè)知識點(diǎn)又牽扯到另一些內(nèi)容,然后就這樣越走越遠(yuǎn)。想起了一個(gè)故事——
三只獵狗追一只土拔鼠,土拔鼠逃跑時(shí)鉆進(jìn)了一個(gè)樹洞。這個(gè)樹洞只有一個(gè)出口,不一會(huì)兒,忽然從樹洞里跑出一只兔子。兔子飛快地向前跑,并爬上另一棵大樹。兔子因?yàn)榛艁y在樹上沒站穩(wěn),掉了下來,砸暈了正仰頭看的三只獵狗,最后,兔子終于逃脫。
對于這個(gè)故事可以從不同的角度去解讀,我更愿意以初心去解讀。兔子為什么會(huì)爬樹?為什么能砸暈三只獵狗?這不是重點(diǎn),重點(diǎn)是,之前追趕的土撥鼠哪去了?看書時(shí)難免會(huì)有延伸閱讀,這個(gè)深度我覺得不宜超過 2 層,不然很容易就回不來了。
還有就是如果有可能,最好每天都看點(diǎn),這其實(shí)是很難的,因?yàn)榭偸菚?huì)有優(yōu)先級更高的事,或者之前的某些習(xí)慣在干擾。一旦斷了幾天,就不想再拿起來了。
還有,蘋果官方的 Start Developing iOS Apps Today 也是很不錯(cuò)的入門材料。
視頻
推薦斯坦福老頭子(Paul Hegarty)的 Developing iOS 7 Apps for iPhone and iPad ,當(dāng)初也是看的這個(gè)(那時(shí)還是更老的版本),Paul 是資深的 Mac/iOS 開發(fā)(前蘋果員工?),很多知識點(diǎn)講得很到位,學(xué)生們的提問也大都在點(diǎn)上,同時(shí)配有Demo,總之聽下來會(huì)對 iOS 開發(fā)有比較全面的了解。
同時(shí)推薦一本小冊子:objc-zen-book,花不長時(shí)間就能看完,里面是一些 Best Practices,對于編寫優(yōu)質(zhì)代碼會(huì)很有幫助。
筆記
這是一個(gè)持久的過程,任何階段都適用。以前也沒太在意這個(gè),覺得概念性的東西,腦子過一遍,就大概知道了,然后就去啃其他的東西了,現(xiàn)在看來,如果有記筆記的話,會(huì)更有助于消化概念、知識點(diǎn),也可以記錄自己的思考過程。達(dá)芬奇就記錄了10000多頁的筆記。
記筆記可以加深對知識點(diǎn)的理解,而成為編程巨星的唯一秘訣就是:對所做的事情理解地越深,就會(huì)做得越好。同時(shí)如果遵循遺忘曲線去復(fù)習(xí)的話,效果更佳。對知識點(diǎn)了解地足夠透徹后,Debug 時(shí)才更有可能知道問題出在哪,解決問題也更容易有思路。
筆記不僅可以記知識點(diǎn),也可以記錄調(diào)試過程,比如這篇筆記,有一種調(diào)試方法:小黃鴨調(diào)試法
許多程序員都有過向別人(甚至可能向完全不會(huì)編程的人)提問及解釋編程問題,就在解釋的過程中擊中了問題的解決方案。一邊闡述代碼的意圖一邊觀察它實(shí)際上的意圖并做調(diào)試,這兩者之間的任何不協(xié)調(diào)會(huì)變得很明顯,并且更容易發(fā)現(xiàn)自己的錯(cuò)誤。
生活中我們可能不會(huì)真的這么去做,這時(shí)抽離出另一個(gè)自己,記錄下跟ta的對話,也是個(gè)發(fā)現(xiàn)問題的好方法。
練習(xí)
這也是一個(gè)持續(xù)的過程,知道了些概念或原理后,總是會(huì)想著去驗(yàn)證下是不是這樣,無論結(jié)果是否如自己預(yù)期,實(shí)踐的過程會(huì)降低對語言的陌生感,慢慢地培養(yǎng)一種駕馭這門語言的自信,如果出了錯(cuò),正好可以重新梳理一下。
目標(biāo)
如果靜下心來看完了 BNR 的這本書,以及斯坦福的 iOS 開發(fā)視頻,那么對 OC 應(yīng)該比較了解了,一些常用的 UIKit 用起來也沒什么問題了,比如 UIViewController / UIView / UIScrollView / UIImageView / UITableView。也熟悉一些概念,如 KVO / MVC / Delegate / DataSource。
這個(gè)階段下來,應(yīng)該會(huì)有:哦,iOS 開發(fā)也就這樣嘛,多翻翻文檔,熟悉 Cocoa Touch 的一些 Class,差不多也能做出一個(gè)簡單的 App 了。
進(jìn)階
入門之后,接下來可以折騰的東西還會(huì)有不少。
書籍
Effective Objective-C 2.0,里面提到了 52 種提高 iOS App 質(zhì)量的途徑。涉及了 API 設(shè)計(jì)、protocols / category 的使用、寫出更模塊化的代碼等,讀下來應(yīng)該會(huì)有不少收獲。
iOS Programming: The Big Nerd Ranch Guide (4th Edition),又是一本 BNR 的書,這本書的特點(diǎn)是通過 Demo 來引出知識點(diǎn),然后提一些問題,并且會(huì)細(xì)說解題思路。看書的過程中,對于元學(xué)習(xí)能力的提升也會(huì)有一定幫助。
--- update ---
發(fā)現(xiàn)巧哥的 iOS開發(fā)進(jìn)階 已經(jīng)可以在京東買到了,雖然沒有細(xì)看,但巧哥出品質(zhì)量肯定有保障。
其他資源
進(jìn)入這個(gè)階段后,可以去探索更大的世界了,現(xiàn)在的資源已經(jīng)很豐富了,但還是要遵循「少而精」的原則。以下是我覺得挺不錯(cuò)的資源
iOS Dev Weekly 每周一期,內(nèi)容多為這一星期里值得關(guān)注的Github項(xiàng)目、文章、工具等。
iOS 移動(dòng)開發(fā)周報(bào) 這是唐巧大大整理的每周不錯(cuò)的 iOS 開發(fā)相關(guān)的內(nèi)容,多為中文。
RayWenderlich 很多詳細(xì)又全面的教程,不容錯(cuò)過。
iOS Dev Slack 國內(nèi)不少 iOS 開發(fā)(包括大大們)都在這里,不過現(xiàn)在好像不怎么能拿到邀請了。
中文 iOS/Mac 開發(fā)博客列表,打開工具訂閱吧。
還有,如果可能的話,多去分享自己學(xué)到的東西,教是最好的學(xué),我試過幾次,效果真的很不錯(cuò)。
目標(biāo)
這個(gè)階段下來,對于常用的設(shè)計(jì)模式、內(nèi)存管理、Blocks 的使用、圖像操作、網(wǎng)絡(luò)請求和管理、多線程應(yīng)該比較熟悉了。對于 CALayer、Animation、UIScrollView、UITableView、UICollectionView、 ViewController Container 則非常熟悉,對「非常熟悉」的定義是:不打開 Xcode,腦子里就能把相應(yīng)的知識點(diǎn)復(fù)述出來 80% ,比如這個(gè)類有哪些方法,Delegate / DataSource 有哪些方法,怎么使用,如果要實(shí)現(xiàn)某個(gè)效果,應(yīng)該怎么做(好吧, UICollectionView 除外)。
高級
其實(shí)高級、進(jìn)階、入門并沒有嚴(yán)格的界限,在入門階段也可以探究高級階段的一些東西。我覺得支撐我們不斷探索和前進(jìn)的動(dòng)力不是興趣,而是永不滿足的好奇心,和對優(yōu)雅代碼的追求。
If your standards are low, you're going to stop pretty early on in the process.
BNR 的這篇 Leveling Up 已經(jīng)講得很好了,也更加細(xì)致。
書籍
iOS 7 Programming Pushing the Limits 這本書對 iOS 7 的一些特性會(huì)講解地比較深入,當(dāng)然也不僅僅是 iOS 7。只嘆 iOS 更新實(shí)在太快,書籍往往跟不上,一本好書往往需要很長時(shí)間來撰寫,等書可以出版了,iOS 又出新版本了。
源碼
看優(yōu)秀的源碼,可以學(xué)到很多東西,使用過程中遇到問題也更容易解決。這些是我覺得值得細(xì)看的源碼:AFNetworking(NSOperation, HTTP, Block), SDWebImage(Image Handle, Cache, NSOperation, Block),SVPullToRefresh(UIScrollView, State Handle), JSONModel(runtime)
如果有興趣,也可以翻翻 CoreFoundation / OC runtime 的源碼。
資源
oleb
NSHipster
objc.io || objcio.cn
WWDC 視頻
工具
chisel Facebook 出品的 LLDB 助手,用于調(diào)試很方便
Reveal 每當(dāng)好奇某個(gè) App 的實(shí)現(xiàn)時(shí),都會(huì)打開它一窺究竟,用于調(diào)試自己的 App 也很方便
Aspects steipete 大大出品的一款方便使用 method swizzling 的工具,可以在運(yùn)行時(shí)動(dòng)態(tài)添加代碼到某個(gè)方法
class-dump 從 Mach-O 文件生成 OC 頭文件,有時(shí)想看看某個(gè) App 大概是如何組織的會(huì)比較方便
Hopper 可以對二進(jìn)制文件進(jìn)行反編譯,甚至可以生成偽代碼!有時(shí)想看看 UIViewController 里某個(gè)方法大概是怎么實(shí)現(xiàn)的,就可以用它。
Instruments 這個(gè)內(nèi)置的工具對于發(fā)現(xiàn) App 的各種問題很有幫助,如內(nèi)存占用、泄露,渲染問題等。
目標(biāo)
這個(gè)階段,對于底層的實(shí)現(xiàn)會(huì)有更深入的了解,各種 Core 開頭的 Framework 至少可以說出個(gè)大概,工具也能熟練使用,「正經(jīng)的代碼」寫過數(shù)萬行,可能天天在翻 Dash。如果別人讓你實(shí)現(xiàn)某個(gè)功能,能在較短的時(shí)間內(nèi)給出不錯(cuò)的實(shí)現(xiàn)方案,并且足夠細(xì)致,甚至精細(xì)到如何使用 Core Graphic 去畫某個(gè)圖像。
其他
我覺得無論學(xué)習(xí)什么,「速成」的心態(tài)是最要不得的,這只會(huì)讓自己變得浮躁,一知半解,整個(gè)過程也很難讓自己的元學(xué)習(xí)能力得到提升。慢慢來,攻占一個(gè)城后,再去打下一個(gè),這時(shí)心態(tài)也會(huì)平和許多。
作者:匿名用戶
鏈接:
另一本是Big?Nerd?Ranch出的《Objective-C編程(第2版)》。(推薦華中師大出的版本)
img?src=""?data-rawwidth="333"?data-rawheight="413"?class="content_image"?width="333"
——————————————————————
2、視頻教程的話,只推薦我贏職場出的iOS移動(dòng)開發(fā)課程。
教程鏈接如下:
iOS9實(shí)戰(zhàn)開發(fā)教程
img?src=""?data-rawwidth="398"?data-rawheight="202"?class="content_image"?width="398"
講的細(xì)致是這門課程最大的特點(diǎn)。因此,這款教程尤其適合那些零基礎(chǔ)學(xué)習(xí)iOS的學(xué)員。我贏職場知名度不夠,但是做的課程不錯(cuò),可惜沒人聽說過這個(gè)品牌。這款教程是從Objc一直講到iOS高編。所以跟著這款教程走,iOS開發(fā)基本也可以學(xué)的差不多。
——————————————————————
二、其次,你要學(xué)習(xí)API,了解iOS?UI控件
Objc階段的學(xué)習(xí)只是帶你入門,如果你想進(jìn)階,API和UI控件是必須需要學(xué)的。一門語言可能會(huì)有成千上百的API和UI控件。你不需要把他們?nèi)加涀?,只需要記住一些常用的即可?/p>
例如:Objc中的UITableView的dataSouce和delegate;NSDictionary、NSArray相關(guān)的增刪查改方法;JSON數(shù)組轉(zhuǎn)換方法;文件操作方法等。
UI控件的話,常用的有UIView、UITableView、UIScrollView、UIButton、UILable等。你要熟悉這些控件的屬性和相關(guān)的操作方法。
記憶這些東西,只靠死記硬背是不行的。多去寫代碼,多去實(shí)踐,這樣才能逐漸掌握。
學(xué)完這個(gè)階段,基本上就可以做出來一個(gè)簡單的APP了。由于沒有進(jìn)一步學(xué)習(xí)高深的東西,咱們暫且不說流暢性和內(nèi)存。
UI控件部分的知識點(diǎn)如圖:
img?src=""?data-rawwidth="607"?data-rawheight="531"?class="origin_image?zh-lightbox-thumb"?width="607"?data-original=""
——————————————————————
三、最后,你還需要了解iOS開發(fā)的底層原理。
能學(xué)到這一部分已經(jīng)很不錯(cuò)了。所謂專業(yè)的iOS開發(fā)工程師和一個(gè)業(yè)余的iOS開發(fā)愛好者基本也差在這最后一步了。這一部分的知識點(diǎn)也是在面試的時(shí)會(huì)經(jīng)常問道的。如果你想找一份iOS開發(fā)工程師的職位,這一部分是非學(xué)不可的。
這一部分的需要掌握的知識點(diǎn)包括:
iOS內(nèi)存管理、iOS運(yùn)行時(shí)機(jī)制、RunLoop、多線程等
每一塊都需要掌握的很詳細(xì)。
你還要熟練使用類庫并閱讀類庫源碼,例如AFNetWorking、SDWeblmage等,這兩個(gè)是初學(xué)者必看的。
——————————————————————
這一階段的學(xué)習(xí)可以多去github上下載源代碼去閱讀。
推薦一些完整的源碼下載:
1、懶人筆記iOS客戶端
GitHub?-?liaojinxing/Voice2Note:?Voice2Note?iOS?client?source?codes.
2、《猿已閱》碼農(nóng)周刊iOS客戶端
GitHub?-?icepy/manong-reading:?《猿已閱》碼農(nóng)周刊?iOS?App(放棄維護(hù),推薦大家下載《開發(fā)者頭條》App)
3、火狐瀏覽器iOS客戶端
GitHub?-?mozilla/firefox-ios:?Firefox?for?iOS
4、某位大神做的高仿網(wǎng)易新聞項(xiàng)目源碼
GitHub?-?dsxNiubility/SXNews:?High?imitation?Neteasy?News.?(include?list,detail,photoset,weather,feedback)
5、維基百科iOS客戶端
GitHub?-?wikimedia/wikipedia-ios:?The?official?Wikipedia?iOS?app.
6、品趣iOS客戶端
GitHub?-?ltebean/novel-design:?PinQu?ios?client
7、YoCelsius——一款天氣預(yù)報(bào)的應(yīng)用
GitHub?-?YouXianMing/YoCelsius:?A?weather?app?that?uses?animation?to?give?you?an?at-a-glance?look?at?the?weather.
8、密記iOS版——款簡單的筆記應(yīng)用
GitHub?-?iHTCboy/SecurityNote:?密記iOS版:本應(yīng)用主要功能是簡單筆記?!疽呀?jīng)開源,AppStroe可下載】The?application?of?the?main?function?is?a?simple?notes.
——————————————————————
四、關(guān)于swift語言的學(xué)習(xí)。
學(xué)習(xí)iOS開發(fā)分為Objc和swift兩個(gè)路線,以上介紹的是最經(jīng)典的Objc路線。如果你想靠學(xué)習(xí)iOS開發(fā)找到一份工作,就要選擇從Objc開始學(xué)起。因?yàn)榻^大多數(shù)公司都是以O(shè)bjc為開發(fā)語言的。
然而swift作為一門現(xiàn)代語言,集合了很多編程語言的優(yōu)點(diǎn),并且比Objc也更加簡單易學(xué),近幾年swift語言的發(fā)展勢頭十分不錯(cuò),大有取代Objc而代之的跡象。所以在這里建議題主把兩個(gè)語言都學(xué)習(xí)一下。并且Swift語言是在Objc的基礎(chǔ)上發(fā)明的,學(xué)完Objc,再學(xué)習(xí)swift也會(huì)更加容易。
關(guān)于swift路線的學(xué)習(xí),可以看看我贏職場的iOS開發(fā)教程,有大篇幅的章節(jié)去介紹swift語言,并且講得細(xì)致入微,十分適合新手學(xué)習(xí)。
教程鏈接:iOS9實(shí)戰(zhàn)移動(dòng)開發(fā)(swift加強(qiáng)版)
img?src=""?data-rawwidth="860"?data-rawheight="589"?class="origin_image?zh-lightbox-thumb"?width="860"?data-original=""
五、下面把自己多年來私藏的一些學(xué)習(xí)iOS開發(fā)的網(wǎng)站推薦給大家。當(dāng)然這只是部分,贊數(shù)過百還會(huì)把這些資料再放出來一部分。所以,你們快點(diǎn)贊吧!
——————————————————————
iOS開發(fā)相關(guān)的網(wǎng)站:
1、我贏職場
上文已經(jīng)介紹過了,他們家的課程質(zhì)量算是很贊的了,教程最大的特點(diǎn)是特別適合新手學(xué)習(xí)。
2、tutsplus
不定時(shí)更新一些?iOS?教程
3、WWDC
蘋果官方每年一度的?WWDC?視頻,?可以了解歷年有關(guān)?iOS?發(fā)布的內(nèi)容。
4、asciiwwdc
WWDC?的文字版
5、Swift?by?Robin?Eggenkamp
該網(wǎng)站收集了很多關(guān)于?Swift?的學(xué)習(xí)資料,?新聞。
——————————————————————
郵件訂閱:
1、iOS?Dev?Weekly
每周一期,內(nèi)容多為這一星期里值得關(guān)注的?GitHub?項(xiàng)目、文章、工具等。
2、iOS?Design?Weekly
每周一期,會(huì)提供一些iOS開發(fā)的建議,新聞資訊以及創(chuàng)意方面的內(nèi)容。