ios應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(GeekBand)03

蘋(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)聊品。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市几苍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陈哑,老刑警劉巖妻坝,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伸眶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刽宪,警方通過(guò)查閱死者的電腦和手機(jī)厘贼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圣拄,“玉大人嘴秸,你說(shuō)我怎么就攤上這事”幼唬” “怎么了岳掐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饭耳。 經(jīng)常有香客問(wèn)我串述,道長(zhǎng),這世上最難降的妖魔是什么寞肖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任纲酗,我火速辦了婚禮,結(jié)果婚禮上新蟆,老公的妹妹穿的比我還像新娘觅赊。我一直安慰自己,他們只是感情好琼稻,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布茉兰。 她就那樣靜靜地躺著,像睡著了一般欣簇。 火紅的嫁衣襯著肌膚如雪规脸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天熊咽,我揣著相機(jī)與錄音莫鸭,去河邊找鬼。 笑死横殴,一個(gè)胖子當(dāng)著我的面吹牛被因,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衫仑,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梨与,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了文狱?” 一聲冷哼從身側(cè)響起粥鞋,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞄崇,沒(méi)想到半個(gè)月后呻粹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壕曼,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年等浊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腮郊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筹燕,死狀恐怖轧飞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撒踪,我是刑警寧澤过咬,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站糠涛,受9級(jí)特大地震影響援奢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忍捡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一集漾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砸脊,春花似錦具篇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瞳抓,卻和暖如春埃疫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孩哑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工栓霜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人横蜒。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓胳蛮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丛晌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仅炊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容