蘋(píng)果開(kāi)發(fā)者中心網(wǎng)址:http://developer.apple.com
蘋(píng)果開(kāi)元資源的網(wǎng)址:http://opensource.apple.com
蘋(píng)果開(kāi)發(fā)者論壇網(wǎng)址:http://forums.developer.apple.com
第三方社區(qū)
stackoverflow宋列、cocoachina技矮、ourcoders呕乎、 v2ex 、github(搜a(bǔ)wesome ios 會(huì)有很多有用的代碼)
App概率
和C語(yǔ)言一樣也是從main函數(shù)進(jìn)入徘键,main函數(shù)調(diào)用UIApplicationMain函數(shù)翩瓜,再由UIApplicationMain函數(shù)的最后一個(gè)參數(shù)傳入AppDelegate類有咨。
//int main(int argc, char* argv[]){
@autoreleasepool{
return UIApplicationMain(argc, argv , nil, NSStringFromClass([AppDelegate class]));
}
}
iOS App的運(yùn)行環(huán)境是Sandbox(安全環(huán)境), 運(yùn)行期目錄結(jié)構(gòu)可以通過(guò)調(diào)用NSHomeDirectory()函數(shù)來(lái)得到酱固。
每個(gè)iOS App都是一個(gè)目錄文件(Bundle),帶有:Info.plist的目錄械念。通過(guò)NSBundle類可以讀取目錄文件中的信息。resource bundle和framework都可以嵌在mainBundle里运悲。
Button
界面與代碼分離
可以只用代碼來(lái)描繪見(jiàn)面及響應(yīng)用戶操作龄减,缺點(diǎn)是不直觀,調(diào)整麻煩班眯。iOS編程使用的是界面與代碼分離解決的方案欺殿,用Interface Builder來(lái)編輯界面,保存到xib(xml版的nib)文件鳖敷,用代碼來(lái)更新界面脖苏、響應(yīng)用戶操作,保存在.m文件里定踱。
使用界面代碼分離解決方案棍潘,我們需要關(guān)注兩個(gè)方面:1、界面操作怎么指定響應(yīng)代碼崖媚。2亦歉、代碼怎么引用界面元素。
在開(kāi)發(fā)時(shí)畅哑,代碼描述的是類肴楷,界面描述的是模板(xib)。等程序運(yùn)行時(shí)荠呐,代碼的類形成類實(shí)例赛蔫,界面形成的是界面對(duì)象。
Outlet
為了讓代碼能引用nib中的對(duì)象泥张,需要代碼里有一個(gè)變量來(lái)引用界面對(duì)象(該變量會(huì)加上修飾<IBOutlet>)呵恢,在界面創(chuàng)建后,給這個(gè)變量賦值(和一個(gè)nib object建立一個(gè)connection關(guān)系)媚创,這個(gè)變量就成了一個(gè)界面對(duì)象的referencing outlet渗钉。這個(gè)過(guò)程最好能自動(dòng)完成。
Outlet Connection
存在xib里的是界面模板钞钙,運(yùn)行時(shí)鳄橘,類實(shí)例的代碼會(huì)觸發(fā)界面實(shí)例化。最終調(diào)用[UINib instantiateWithOwner:options:];再根據(jù)模板實(shí)例化其中的對(duì)象[owner-setValue:uiObj forKey:outlet.property]
Action Connection
界面事件:Interface Builder, Connection Inspector
響應(yīng)代碼:IBAction標(biāo)記的方法
關(guān)聯(lián):界面對(duì)象.事件=>類實(shí)例.方法
在有關(guān)聯(lián)的類實(shí)例方法返回值設(shè)為IBAction讓編譯器知道這是一個(gè)響應(yīng)事件的方法芒炼。//-(IBAction)greeting:(id)sender{}
Demo
在Interface Builder里制作界面(拖動(dòng)所需的界面對(duì)象到Interface Builder界面里)瘫怜,給按鈕添加響應(yīng)代碼(將Interface Builder界面里的對(duì)象按住control鍵向ViewController.m文件中聲明處拖動(dòng),將自動(dòng)生成屬性聲明代碼)焕议,在響應(yīng)代碼里訪問(wèn)其他界面元素(將Interface Builder界面里的對(duì)象按住control鍵向ViewController.m文件中實(shí)現(xiàn)處拖動(dòng)宝磨,將自動(dòng)生成實(shí)現(xiàn)代碼的框架弧关,后續(xù)再按實(shí)際需求補(bǔ)全代碼)。
UIButton樣式
UIButton的樣式
代碼創(chuàng)建UIButton
創(chuàng)建
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
定制
[btn setBackgroundImage:[UIImage imageNamed:@"okbtn"]forState:UIControlStateNormal];
[btn setTitle:@"OK"forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor]forState:UIControlStateNormal];//將顯示的字設(shè)置為紅色
添加響應(yīng)
[btn addTarget:self action:@selector(greeting:)forControlEvents:UIControlEventTouchUpInside]; //按鈕點(diǎn)擊后形成一個(gè)響應(yīng)事件唤锉,調(diào)用了greeting方法
event mask:UIControlEventTouchUpInside | UIControlEventTouchUpOutside
Image
Assert Catalog
Assert Catalog是一個(gè)圖片管理器世囊,針對(duì)不同的iOS設(shè)備,可視化管理不同的分辨率窿祥。在Xcode里面使用圖片株憾,首先要將需要使用的圖片加到項(xiàng)目里面,定義圖片為項(xiàng)目里面的一個(gè)資源晒衩,如果圖片有邊框的嗤瞎,還要做圖片的邊框切片定義,好讓同一張圖片應(yīng)對(duì)不同分辨路的縮放听系。
打開(kāi)Xcode后選擇Assets.xcassets用來(lái)編輯圖片贝奇。在Interface Builder里面拖入一個(gè)Image View,在圖片屬性里嘗試各種功能對(duì)圖片的影響靠胜。
Assets.xcassets的編輯區(qū)里有Appicon掉瞳,這個(gè)是程序顯示在設(shè)備上的圖標(biāo),由于iOS設(shè)備現(xiàn)在的不斷增加浪漠,有不同的分辨率陕习,我們可以根據(jù)不同的分辨率配屬不同大小的圖片。
矢量圖:矢量圖是根據(jù)幾何特性來(lái)繪制圖形址愿,矢量可以是一個(gè)點(diǎn)或一條線该镣,矢量圖只能靠軟件生成,文件占用內(nèi)在空間較小响谓。最大的特點(diǎn)是可以無(wú)限放大损合,不變色、不模糊歌粥。
UIImageView
用UIImageView在Interface Builder顯示圖片,UIImageView有許多不同的屬性塌忽。Mode屬性對(duì)應(yīng)UIImageView中圖片的顯示方式拍埠,有適應(yīng)邊框填滿(Scale To Fill)失驶、保持橫豎比例縮放(Aspect Fit)、保持橫豎比例填滿(Aspect Fill)等枣购。
.image屬性是指關(guān)聯(lián)到UIImageView的圖片屬性嬉探。
圖片屬性可以根據(jù)不同大小或配置的設(shè)備指定不同的圖片,圖片的Render屬性是指圖片出現(xiàn)在ToolBar上時(shí)的表現(xiàn)棉圈,有默認(rèn)涩堤、原始圖片和模板圖片三種屬性選項(xiàng)。
有邊框的圖片可以進(jìn)行裁剪設(shè)置分瘾,保證圖片縮放時(shí)邊框比例保持不變胎围。使用圖片的Silcing屬性進(jìn)行編輯,也可以在圖片編輯區(qū)點(diǎn)擊右下角的Show Slicing設(shè)置。(注:縮放中心點(diǎn)最好和左上角的邊框點(diǎn)接近白魂,拖動(dòng)時(shí)圖片不容易超出邊框)
圖片在IB里選擇意味著圖片打包在mainBundle里汽纤,系統(tǒng)會(huì)自動(dòng)緩存。
加載App bundle里的圖片
image = [UIImage imageNamed:@"mypic"]; //自動(dòng)在App bundle里尋找名字為mypic的問(wèn)題件福荸。
image = [UIImage imageNamed:@"mypic" inBundle:nil compatibleWithTraitCollection:nil]; //如果是自己打包的resource bundle就用以上方法蕴坪。
NSURL *url = [[NSBundle mainBundle] URLForResource:@"mypic"withExitension:@"png"];//得到mypic.png文件的文件路徑
UIImage *image = [UIImage imageWithContentsOfFile:url.path]; //通過(guò)以上的文件路徑創(chuàng)建圖片實(shí)例,這種方法比較好敬锐,不需要提前緩存
加載文件里的圖片
UIImage *image = [UIImage imageWithContentsOfFile:path]; //通過(guò)可以訪問(wèn)到的文件加載圖片背传。
UIImage *image = [UIImage imageWithData:data]; //通過(guò)data來(lái)得到對(duì)象。
加載動(dòng)畫(huà)
將一段連續(xù)的圖片加載到App bundle中台夺,命名由相同名字+數(shù)字的方法径玖。
這一課主要是實(shí)踐練習(xí),熟悉圖片在Interface Builder里面的各種屬性和用法颤介。在ViewController.h 文件中聲明一個(gè)UIImageView屬性:@property (weak, nonatomic) IBOutlet UIImageView *imageView;挺狰,并且在-(void)viewDidLoad方法實(shí)現(xiàn)中加入圖片加載代碼:
UIImage *image = [UIImage animatedImageNamed:@"動(dòng)畫(huà)"duration:1.0]; //將名字為“動(dòng)畫(huà)”的圖片打包成一個(gè)動(dòng)畫(huà)
self.imageView.image = image; //把圖片“動(dòng)畫(huà)”集加載到imageView屬性窗口中
第一個(gè)App
一個(gè)小游戲,猜城市买窟。主要玩法:顯示一張城市的圖片丰泊,用戶輸入城市的名字,猜對(duì)得分始绍。
在制作軟件之前除了基本的要求描述外瞳购,還需要做進(jìn)一步的需求分析。大型軟件還需要做多次的用戶需求訪問(wèn)亏推,軟件架構(gòu)分析及設(shè)計(jì)学赛,開(kāi)發(fā)組員討論交流等必要工作來(lái)確保開(kāi)發(fā)軟件的準(zhǔn)確性和高效性。上述的游戲還有不少細(xì)節(jié)我們需要了解吞杭。例如:城市圖片的展示順序盏浇,是順序展示還是隨機(jī)展示。 圖片的來(lái)源芽狗,是本地圖片還是從服務(wù)器下載绢掰。輸入框中是需要輸入中文還是英文。如果輸錯(cuò)可否重試童擎,可以重試幾次滴劲。游戲計(jì)分系統(tǒng)怎樣設(shè)置。游戲結(jié)束觸發(fā)條件等顾复。要在需求收集盡可能完善的情況下再進(jìn)行分析班挖、設(shè)計(jì)。
根據(jù)需求分析設(shè)計(jì)芯砸,來(lái)設(shè)計(jì)整個(gè)程序的流程萧芙,設(shè)計(jì)時(shí)需要考慮一定的可擴(kuò)展性 给梅、跟合理性。通過(guò)程序流程設(shè)計(jì)再設(shè)計(jì)出合理的代碼結(jié)構(gòu)双揪。
改進(jìn)鍵盤(pán)的顯示問(wèn)題**
方案1:點(diǎn)擊鍵盤(pán)外的地方收起鍵盤(pán)破喻,首先在storyboard,點(diǎn)擊背景View盟榴,將它的Custom Class設(shè)置為UIControl再將UIControl的Touch Down響應(yīng)事件關(guān)聯(lián)到一個(gè)重新聚焦方法曹质。 [UITextField resignFirstResponder];
方案2:輸入完成后點(diǎn)擊return關(guān)閉鍵盤(pán), 選中一個(gè)UITextField控件將Did End on Exit事件響應(yīng)關(guān)聯(lián)到一個(gè)重新聚焦方法擎场。 [sender resignFirstResponder];
第六天視頻課程
演示了猜城市游戲的全部代碼羽德,講解了代碼的設(shè)計(jì)結(jié)構(gòu)和注意事項(xiàng)。 代碼在實(shí)現(xiàn)功能的前提下需要有條理的分類迅办,保證整個(gè)程序的代碼結(jié)構(gòu)合理性宅静。控制界面刷新的ViewController不應(yīng)該放入業(yè)務(wù)邏輯站欺,只負(fù)責(zé)從頁(yè)面上拿信息和更新頁(yè)面的狀態(tài)姨夹。 應(yīng)該另外新建一個(gè)Game類來(lái)描述游戲的邏輯。
pragma mark 預(yù)處理器文法用來(lái)方便查找和導(dǎo)航代碼用的矾策,在代碼編輯器的導(dǎo)航欄插入我們想要的標(biāo)題磷账。
id和instancetype:
他們都可以作為方法的返回類型,instancetype可以返回和方法所在類型相同的對(duì)象贾虽,id只能返回未知類型的對(duì)象逃糟。instancetype只能作為返回值,不能像id那樣作為參數(shù)蓬豁。
學(xué)會(huì)寫(xiě)單元測(cè)試绰咽,Unit Test可以分塊測(cè)試,在編程的過(guò)程中只需要專注當(dāng)前區(qū)塊的編寫(xiě)就可以了地粪。Xcode還有界面自動(dòng)化測(cè)試(UI Test)取募,可以幫助我們自動(dòng)測(cè)試軟件。
為了做測(cè)試可能會(huì)需要訪問(wèn)一些內(nèi)部狀態(tài)蟆技,可以用一個(gè)類別吧內(nèi)部狀態(tài)暴露出來(lái)玩敏。頭文件放在測(cè)試文件夾里只供測(cè)試使用。這樣既保證了代碼的安全付魔,又可以順利的測(cè)試到內(nèi)部狀態(tài)聊品。