十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
你做過表格頁面的開發(fā)嗎?
創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為阜寧等服務(wù)建站,阜寧等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為阜寧企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在網(wǎng)上看到兩個實現(xiàn)demo,可以說是兩種方式實現(xiàn)的。
大致就是頂部的航標(biāo)題用一個TopCollectionView封裝實現(xiàn),底部的表格使用JContentTableView封裝實現(xiàn),tableViewCell里是一個collectionView,每一行有一個collectionView,稍微自己處理下數(shù)據(jù)源還是可以使用的。
大致就是自己封裝了一個view,視圖由LeftTableView,RightTableView,TopScrollView實現(xiàn)。
RightTableViewCell里是scrollView,使用的按鈕實現(xiàn)的表格的效果??赐赀@個實現(xiàn)還是不推薦吧。
暫時只是學(xué)習(xí)了下實現(xiàn),后續(xù)有啥問題更新吧~~~
IOS中得控件,大家并不陌生。那么如何來自定義一個控件呢,對于純粹的顯示類的控件我們在這里不再贅述,只是說一下自定義控件,如何響應(yīng)點擊消息。
一、UIControl中的觸摸事件響應(yīng)函數(shù)
自定義一個控件,如果是需要響應(yīng)點擊消息、拖動消息,大多是直接繼承自UIControl,在不熟悉下面所要講的東西之前,一直是自己寫手勢判斷來響應(yīng),然后發(fā)現(xiàn)... ...后面的都不說了,一切都是淚??!
二、Target-Action模式
在可以響應(yīng)觸摸事件之后,就會如何使其調(diào)用我們的自定義方法了。在了解這個模式之前,都是一直在用“protocol”來做... ...好了,一切不說從前。
見如下代碼:
// 添加一個 target/action 注冊事件及其響應(yīng)
span style="color:#ff6666;"- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;/span
// 移除一個 target/action 注銷事件及其響應(yīng)
- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 獲取所有 target/action 的 target 對象
- (NSSet *)allTargets;
// 獲取所有要響應(yīng)的 UIControlEvents
- (UIControlEvents)allControlEvents;
// 獲取指定target和UIControlEvents的action的方法名,target不能為nil
- (NSArray *)actionsForTarget:(id)target forControlEvent:(UIControlEvents)controlEvent;
// 調(diào)用指定的 target/action,第三個參數(shù)作用未知
- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event;
// 發(fā)送一個事件,使觸發(fā)對應(yīng)的 target/action 可以指定自定義事件
span style="color:#ff6666;"- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents;/span
使用,標(biāo)為紅色的兩個方法,我們就可以實現(xiàn)自定義方法的處理。
下列事件為基類UIControl所支持,除非另有說明,也適用于所有控件。
UIControlEventTouchDown // 單點觸摸按下事件:用戶點觸屏幕,或者又有新手指落下的時候。
UIControlEventTouchDownRepeat // 多點觸摸按下事件,點觸計數(shù)大于1:用戶按下第二、三、或第四根手指的時候。
UIControlEventTouchDragInside //當(dāng)一次觸摸在控件窗口內(nèi)拖動時。
UIControlEventTouchDragOutside //當(dāng)一次觸摸在控件窗口之外拖動時。
UIControlEventTouchDragEnter //當(dāng)一次觸摸從控件窗口之外拖動到內(nèi)部時。
UIControlEventTouchDragExit //當(dāng)一次觸摸從控件窗口內(nèi)部拖動到外部時。
UIControlEventTouchUpInside //所有在控件之內(nèi)觸摸抬起事件。
UIControlEventTouchUpOutside //所有在控件之外觸摸抬起事件(點觸必須開始與控件內(nèi)部才會發(fā)送通知)。
UIControlEventTouchCancel //所有觸摸取消事件,即一次觸摸因為放上了太多手指而被取消,或者被上鎖或者電話呼叫打斷。
UIControlEventTouchChanged //當(dāng)控件的值發(fā)生改變時,發(fā)送通知。用于滑塊、分段控件、以及其他取值的控件。你可以配置滑塊控件何時發(fā)送通知,在滑塊被放下時發(fā)送,或者在被拖動時發(fā)送。
UIControlEventEditingDidBegin //當(dāng)文本控件中開始編輯時發(fā)送通知。
UIControlEventEditingChanged //當(dāng)文本控件中的文本被改變時發(fā)送通知。
UIControlEventEditingDidEnd //當(dāng)文本控件中編輯結(jié)束時發(fā)送通知。
UIControlEventEditingDidOnExit //當(dāng)文本控件內(nèi)通過按下回車鍵(或等價行為)結(jié)束編輯時,發(fā)送通知。
UIControlEventAlltouchEvents //通知所有觸摸事件。
UIControlEventAllEditingEvents //通知所有關(guān)于文本編輯的事件。
UIControlEventAllEvents //通知所有事件。
用xib連線的用weak修飾,自定義的屬性控件用strong,一般推薦純代碼寫,用strong,用xib或者sb創(chuàng)建的時候,view上會addsubview這個控件,這里強(qiáng)引用一次,如果再用strong修飾那不是強(qiáng)引用兩次了嗎
在開發(fā)過程中,有時候UIKit的標(biāo)準(zhǔn)控件并不能滿足我們的需求,例如你需要一個控件能支持用戶方便的選擇0-360°之間的一個角度值,此時就需要根據(jù)自己的需求自定義控件了。
對于選擇角度值的控件可以這樣實現(xiàn):創(chuàng)建一個圓形的滑塊,用戶通過拖動手柄操作就能選擇角度值。實際上這樣的控件在別的一些平臺中你可能看到過,但是在UIKit中并沒有。
本文就實現(xiàn)一個選擇角度值的控件來介紹控件的自定義。下面先來看看到底要做成什么樣子:
1. 子類化UIControl
UIControl 是UIView的子類,它又是所有UIKit控件的父類(例如UIButton、UISlider和UISwitch等)。
UIControl的主要作用是創(chuàng)建相應(yīng)的邏輯將action分發(fā)到對應(yīng)的target,另外90%的情況下,它會根據(jù)自身的狀態(tài)(例如Highlighted, Selected和Disabled等)來繪制用戶界面。
通過UIControl,我們主要管理3個重要的任務(wù):
繪制用戶界面
跟蹤用戶的操作
Target-Action模式
在本文的圓形滑塊中,我們要做如下一些事情:
定制一個用戶界面(圓形滑塊本身),通過該界面用戶可以通過手柄進(jìn)行界面交互。用戶的交互操作會被轉(zhuǎn)換為控件target對應(yīng)的action(控件將滑塊按鈕的frame origin轉(zhuǎn)換為0-360之間的一個值,并用于target/action上)。
建議在學(xué)習(xí)本文的時候從文章尾部的連接中下載完整的示例工程。
下面我將從上面列出的3個重要任務(wù)一一進(jìn)行分解介紹。
這些步驟都是模塊化的,所以如果你對界面的繪制不感興趣,可以跳 繪制用戶界面 ,直接學(xué)習(xí)后面的步驟。
打開工程文件中的 TBCircluarSlider.m 文件。然后開始學(xué)習(xí)下面的內(nèi)容。
1.1 繪制用戶界面
我比較喜歡使用Core Graphics,唯一用到UIKit的就是通過textfield來顯示滑塊的值。
提醒 :此處需要用到一些 Core Graphics 知識,如果你不懂也沒多大關(guān)系,我會盡量把代碼做詳細(xì)的講解。
我們先來看看控件的不同組成部分,這樣更有利于后面的學(xué)習(xí)。
首先,是用一個 黑色的圓環(huán) 當(dāng)做滑塊的背景。
可操作區(qū)域(active area) 是一個從藍(lán)色到紫色的梯度漸變效果。
用戶通過拖拽下面的這個手柄按鈕來選擇值:
最后,用于顯示選中值的 TextField 。在下一版中,我計劃讓用戶可以通過鍵盤輸入角度值。
控件界面的繪制主要使用drawRect函數(shù),首選我們需要獲取到當(dāng)前使用的圖形上下文,如下代碼所示:
1
CGContextRef ctx = UIGraphicsGetCurrentContext();
1.1.1 繪制背景
背景是360°的,所以只要用CGContextAddArc給圖形上下文添加正確的path,并設(shè)置正確的stroke即可。
下面的代碼可以就可以完成背景的繪制:
//Add the arc path
CGContextAddArc(ctx, self.frame.size.width/2, self.frame.size.height/2, radius, 0, M_PI *2, 0);
//Set the stroke colour
[[UIColor blackColor]setStroke];
//set Line width and cap
CGContextSetLineWidth(ctx, TB_BACKGROUND_WIDTH);
CGContextSetLineCap(ctx, kCGLineCapButt);
//draw it!
CGContextDrawPath(ctx, kCGPathStroke);
CGContextArc 函數(shù)的參數(shù)包括圖形上下文,弧度的中心坐標(biāo)點,以及半徑(是一個私有變量),接著是弧度開始和結(jié)束時的角度(在TBCircularSlider.m文件的頭部可以看到一些關(guān)于數(shù)學(xué)計算的方法),最后一個參數(shù)標(biāo)示繪制的方向,0表示逆時針方向。
接下來的3行的代碼是用來設(shè)置一些信息的,例如顏色和線條寬度等。最后使用 CGContextDrawPath 方法完成背景的繪制。
1.1.2 繪制用戶的可操作區(qū)域
這部分需要利用一點小技巧才行。此處我們繪制一個線性漸變的掩碼圖片,下面看看原理:
此處掩碼圖片的工作原理是可以看到原始漸變矩形框的一個孔。
在這里繪制的弧度有一個陰影,這是創(chuàng)建掩碼圖時使用了一點模糊的效果。
下面是創(chuàng)建掩碼圖的相關(guān)代碼:
UIGraphicsBeginImageContext(CGSizeMake(320,320));
CGContextRef imageCtx = UIGraphicsGetCurrentContext();
CGContextAddArc(imageCtx, self.frame.size.width/2 , self.frame.size.height/2, radius, 0, ToRad(self.angle), 0);
[[UIColor redColor]set];
//Use shadow to create the Blur effect
CGContextSetShadowWithColor(imageCtx, CGSizeMake(0, 0), self.angle/20, [UIColor blackColor].CGColor);
//define the path
CGContextSetLineWidth(imageCtx, TB_LINE_WIDTH);
CGContextDrawPath(imageCtx, kCGPathStroke);
//save the context content into the image mask
CGImageRef mask = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext());
UIGraphicsEndImageContext();
在上面的代碼中首先創(chuàng)建了一個圖形上下文,然后設(shè)置了一下陰影。通過 CGContextSetShadowWithColor 方法,我們可以設(shè)置如下內(nèi)容:
上下文
偏移量(此處不需要)
模糊值(該值是通過參數(shù)控制的:使用當(dāng)前的角度除以20,當(dāng)用戶與此控件交互時,以此獲得一個簡單的動畫模糊值)
顏色
接著是根據(jù)當(dāng)前的角度繪制一個相應(yīng)的弧度。
例如,如果當(dāng)前的角度變量是360°,那么就繪制一個圓弧,如果是90°,就繪制一個弧度為90°的一個弧。最后,利用 CGBitmapContextCreateImage 方法獲取一張圖片(剛剛繪制的?。?。這個圖片就是我們所需要的掩碼圖了。
裁剪上下文:
現(xiàn)在我們已經(jīng)有一個漸變的掩碼圖了。接著利用函數(shù) CGContextClipToMask 對上下文進(jìn)行裁剪——給該函數(shù)傳入上面剛剛創(chuàng)建好的掩碼圖。代碼如下所示:
CGContextClipToMask(ctx, self.bounds, mask);
最后我們來繪制漸變效果,代碼如下所示:
//Define the colour steps
CGFloat components[8] = {
0.0, 0.0, 1.0, 1.0, // Start color - Blue
1.0, 0.0, 1.0, 1.0 }; // End color - Violet
CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, components, NULL, 2);
//Define the gradient direction
CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
//Choose a colour space
CGColorSpaceRelease(baseSpace), baseSpace = NULL;
//Create and Draw the gradient
CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient), gradient = NULL;
繪制漸變效果需要很多處理,不過我們可以將其分為4部分:
定義顏色的變化范圍
定義漸變的方向
選擇顏色空間
創(chuàng)建并繪制漸變
最終的顯示效果(看到漸變矩形框的一部分)要歸功于之前創(chuàng)建的掩碼圖。
另外,為了在背景邊框模擬光線反射,我添加了一些燈光效果。
1.1.3 繪制手柄
下面我們根據(jù)當(dāng)前的角度值,在的正確位置繪制出手柄。
實際上,在繪制過程中,這一步非常簡單,復(fù)雜一點的就是計算一下手柄所在的位置。
這里我們需要使用三角函數(shù)將一個 標(biāo)量值(scalar number) 轉(zhuǎn)換為 CGPoint 。不要擔(dān)心有多復(fù)雜,只需要使用Sin和Cos函數(shù)就可以完成。代碼如下所示:
-(CGPoint)pointFromAngle:(int)angleInt{
//Define the Circle center
CGPoint centerPoint = CGPointMake(self.frame.size.width/2 - TB_LINE_WIDTH/2, self.frame.size.height/2 - TB_LINE_WIDTH/2);
//Define The point position on the circumference
CGPoint result;
result.y = round(centerPoint.y + radius * sin(ToRad(-angleInt))) ;
result.x = round(centerPoint.x + radius * cos(ToRad(-angleInt)));
return result;
}
上面的代碼中,指定一個角度值,然后計算出在圓周上面的位置,當(dāng)然,這里需要圓周的中心點和半徑。
使用sin函數(shù)在使用sin函數(shù)時,需要一個Y坐標(biāo)值,而cos函數(shù)則需要X坐標(biāo)值。
需要注意的是此處每個函數(shù)返回的值都認(rèn)為半徑為1,所以需要將所得結(jié)果乘以我們指定的半徑大小,并相對于圓周的中心做計算。
希望下面的公式對你的理解有所幫助:
1
2
point.y = center.y + (radius * sin(angle));
point.x = center.x + (radius * cos(angle));
通過上面的計算,現(xiàn)在我們已經(jīng)知道手柄的具體位置了,所以,接下來就直接將手柄繪制到指定位置即可,如下代碼所示:
-(void) drawTheHandle:(CGContextRef)ctx{
CGContextSaveGState(ctx);
//I Love shadows
CGContextSetShadowWithColor(ctx, CGSizeMake(0, 0), 3, [UIColor blackColor].CGColor);
//Get the handle position!
CGPoint handleCenter = [self pointFromAngle: self.angle];
//Draw It!
[[UIColor colorWithWhite:1.0 alpha:0.7]set];
CGContextFillEllipseInRect(ctx, CGRectMake(handleCenter.x, handleCenter.y, TB_LINE_WIDTH, TB_LINE_WIDTH));
CGContextRestoreGState(ctx);
}
具體操作步驟如下:
保存當(dāng)前的上下文(當(dāng)在一個單獨的函數(shù)中進(jìn)行繪制任務(wù)時,將上下文的狀態(tài)進(jìn)行保存是編程的一個好習(xí)慣)。
給手柄設(shè)置一些陰影效果
定義手柄的顏色,然后利用 CGContextFillEllipseInRect 將其繪制出來。
我們在drawRect函數(shù)的最后調(diào)用上面這個方法:
1
[self drawTheHandle:ctx];
至此,我們就完成了繪制部分的任務(wù)。
1.2 跟蹤用戶的操作
在UIControl的子類中,我們可以 override 3個特殊的方法來提供一個自定義的跟蹤行為
1.2.1 開始跟蹤
當(dāng)在控件的bound內(nèi)發(fā)生了一個觸摸事件,首先會調(diào)用控件的 beginTrackingWithTouch 方法。
我們就看看如何 override 這個方法吧:
-(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super beginTrackingWithTouch:touch withEvent:event];
//We need to track continuously
return YES;
}
該函數(shù)返回的BOOl值決定著:當(dāng)觸摸事件是dragged時,是否需要響應(yīng)。在我們這里的自定義控件中,是需要跟蹤用戶的dragging,所以返回YES。
上面這個函數(shù)有兩個參數(shù):touch對象和事件。
1.2.2 持續(xù)跟蹤
在上一個方法中我們指定了這里的自定義控件需要跟蹤一個持續(xù)的事件,所以當(dāng)用戶進(jìn)行drag時,會調(diào)用一個特殊的方法: continueTrackingWithTouch :
-(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
該方法返回的BOOL值標(biāo)示是否繼續(xù)跟蹤touch事件。
通過該方法我們可以根據(jù)touch位置對用戶的操作進(jìn)行過濾。例如,我們可以:僅當(dāng)touch位置與手柄位置相交的時候才激活控件(activate control)。不過在這里我們的控制邏輯并不是這樣的,我們希望用戶點擊任何位置都能對手柄做出相應(yīng)的位置處理。
本文的該方法負(fù)責(zé)更新手柄的位置(在后面的一節(jié)中會看到我們把該位置信息傳遞給對應(yīng)的target上)。
對上面這個方法的override代碼如下所示:
-(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super continueTrackingWithTouch:touch withEvent:event];
//Get touch location
CGPoint lastPoint = [touch locationInView:self];
//Use the location to design the Handle
[self movehandle:lastPoint];
//We'll see this function in the next section:
[self sendActionsForControlEvents:UIControlEventValueChanged];
return YES;
}
上面的代碼中,首先利用 locationInView 獲取到touch的位置,然后將該位置傳遞給 moveHandle 方法,該方法會將傳入的值轉(zhuǎn)換為一個有效的手柄位置(a valid handle position)。
此處“a valid position”的意思是什么呢?
此控件的手柄只能在背景圓弧定義的邊界范圍內(nèi)做移動,但是我們不希望強(qiáng)制要求用戶必須在很小的圓弧內(nèi)才可以移動手柄,如果非要這樣的話,用戶體驗會非常的糟糕。
moveHandle 的任務(wù)就是負(fù)責(zé)把任意的位置值轉(zhuǎn)變?yōu)槭直梢苿拥闹?,另外,另外,在該函?shù)中,還對指定的滑塊角度值做了轉(zhuǎn)換,代碼如下所示:
-(void)movehandle:(CGPoint)lastPoint{
//Get the center
CGPoint centerPoint = CGPointMake(self.frame.size.width/2,
self.frame.size.height/2);
//Calculate the direction from the center point to an arbitrary position.
float currentAngle = AngleFromNorth(centerPoint,
lastPoint,
NO);
int angleInt = floor(currentAngle);
//Store the new angle
self.angle = 360 - angleInt;
//Update the textfield
_textField.text = [NSString stringWithFormat:@"%d",
self.angle];
//Redraw
[self setNeedsDisplay];
}
上面代碼中,實際上主要任務(wù)都是在 AngleFromNorth 方法中處理的:根據(jù)兩個point,就會返回一個連接這兩點對應(yīng)的一個角度關(guān)系, AngleFromNorth 方法的實現(xiàn)如下所示:
static inline float AngleFromNorth(CGPoint p1, CGPoint p2, BOOL flipped) {
CGPoint v = CGPointMake(p2.x-p1.x,p2.y-p1.y);
float vmag = sqrt(SQR(v.x) + SQR(v.y)), result = 0;
v.x /= vmag;
v.y /= vmag;
double radians = atan2(v.y,v.x);
result = ToDeg(radians);
return (result =0 ? result : result + 360.0);
}
提醒: angleFromNorth 方法并不是我的原創(chuàng),我是直接從蘋果提供的OSX示例clockControl中拿過來用的。
在上面的代碼中,獲得了角度值以后,將其存儲到 angle 中,然后更新一下textfield的值。
接著調(diào)用的 setNeedDisplay 是為了確保 drawRect 被調(diào)用,以盡快在界面上做出相應(yīng)的更新。
1.2.3 結(jié)束跟蹤
當(dāng)跟蹤結(jié)束的時候,會調(diào)用下面這個方法:
-(void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super endTrackingWithTouch:touch withEvent:event];
}
在本文中,我們并不需要override該方法。如果當(dāng)用戶完成控件的界面操作時,你希望做一些處理,那么該方法會非常有用。
1.3 Target-Action模式
至此,圓形滑塊控件可以工作了,你可以drag手柄,并能看到textfield中值的改變。
發(fā)送action——控件事件
如果希望自己定制的控件與UIControl行為保持一致,那么當(dāng)控件的值發(fā)生變化時,需要進(jìn)行通知處理:使用 sendActionsForControlEvents 方法,并制定特定的事件類型,值改變對應(yīng)的事件一般是 UIControlEventValueChanged 。
蘋果已經(jīng)預(yù)定義了許多事件類型(Xcode中,在UIControlEventValueChanged上 cmd + 鼠標(biāo)單擊 )。如果你的控件是繼承自UITextField,那么你可能會對 UIControlEventEdigitingDidBegin 感興趣,如果你要做一個touch Up action,那么可以使用UIControlTouchUpInside。
如果你注意的話,在本文前部分的continueTrackingWithTouch方法里面,我們調(diào)用了 sendActionsForControlEvents 方法:
[self sendActionsForControlEvents:UIControlEventValueChanged];
這樣處理之后,當(dāng)控件值發(fā)生變化時,每一個對象(觀察者——注冊該事件)都會收到響應(yīng)的通知。
對于沒有相應(yīng)開發(fā)經(jīng)驗的人來說,分為三步。
第一步,學(xué)習(xí)開發(fā)語言O(shè)bjective-C。參考書看《Objective-C基礎(chǔ)教程》這本書就行了。書看到后來還需要補(bǔ)充一些關(guān)于面向?qū)ο蟮闹R,一般計算機(jī)專業(yè)的學(xué)生都是在學(xué)C++的時候接觸這類思想的。我推薦的那本參考書里也會有一些講解,進(jìn)階的學(xué)習(xí)需要以后再去看資料,沒有特定教材,因為面向?qū)ο笫且环N編程思想,好在Objective-C本身就是這種思想的體現(xiàn),以后寫代碼的時候可以慢慢體會。學(xué)完《Objective-C基礎(chǔ)教程》,就會對iOS開發(fā)中所用到的基礎(chǔ)數(shù)據(jù)類有一個了解了,這時候應(yīng)該就可以寫簡單的無界面程序了。
第二步,學(xué)習(xí)iOS開發(fā)的軟件運(yùn)行原理,軟件開發(fā)思想、規(guī)范以及一些蘋果公司提供的常用標(biāo)準(zhǔn)UI(User Interface,用戶界面)控件的使用方法。這個階段推薦的參考書是《iPhone 4與iPad開發(fā)基礎(chǔ)教程》,該書有中文譯本,雖然不是最新的iOS教程(最新的教程應(yīng)該是iOS7開發(fā)基礎(chǔ)教程,但是該書沒有中文譯本,如果英文過硬,看這本書當(dāng)然最好)。
第三步,熟悉常用第三方控件。因為蘋果本身開放性的局限,其提供的標(biāo)準(zhǔn)開發(fā)庫會有一些功能局限,智慧無線的網(wǎng)友們開發(fā)了各種各樣的第三方控件來實現(xiàn)他們想要的功能,可以使開發(fā)過程事半功倍。此部分為進(jìn)階學(xué)習(xí)內(nèi)容,需要在掌握前兩步內(nèi)容的基礎(chǔ)上展開。這一步主要是試用,學(xué)習(xí)第三方代碼,要求閱讀第三方開發(fā)文檔以及代碼多一些??梢耘c開發(fā)同時進(jìn)行,邊學(xué)變進(jìn)行軟件開發(fā)。
除了參考書,這里推薦一個網(wǎng)站“Cocoachina蘋果開發(fā)中文站”里面分享了很多網(wǎng)友的代碼,并且可以對自己學(xué)習(xí)過程中遇到的問題進(jìn)行討論。學(xué)習(xí)初期,中期以及后期進(jìn)階都可以在這個論壇找到相應(yīng)的學(xué)習(xí)資料與代碼,并且可以通過發(fā)帖得到大神的技術(shù)指點。對應(yīng)的英文網(wǎng)站是Stackflow,此網(wǎng)站偏重實際開發(fā)問題的解決,交流語言為英文。
另外,斯坦福大學(xué)每年都開設(shè)iOS開發(fā)的公開課,從Objective-C的學(xué)習(xí)到最后的控件使用以及開發(fā)思想,架構(gòu)的學(xué)習(xí),都有涉獵,是很好的視頻教程。網(wǎng)易公開課中有以往課程配中文字幕的視頻,而最新的課程一般沒有中文字幕,并且,該課程選擇默認(rèn)學(xué)生已經(jīng)有C++編程基礎(chǔ),可能對于初學(xué)者會困難一些。視頻屬于公開資源,在搜索引擎上搜索斯坦福、iOS等關(guān)鍵字,即可找到相應(yīng)資源。剛剛簡單搜索了一下,優(yōu)酷已經(jīng)提供iOS7開發(fā)的高清視頻專輯。
最后,無論學(xué)習(xí)哪個操作系統(tǒng)的軟件開發(fā),最關(guān)鍵還是要多多練習(xí),因此大量的寫練習(xí)代碼,看別人的優(yōu)秀代碼很重要。