自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

創(chuàng)建一個(gè)iOS應(yīng)用程序

移動(dòng)開發(fā) iOS
iPhone不是桌面計(jì)算機(jī),有不同的預(yù)期,需要完全不同設(shè)計(jì)思路。需要從iOS的能力獲得優(yōu)勢(shì),還要避開那些對(duì)移動(dòng)環(huán)境無關(guān)和不切實(shí)際的特性。iPhone和iPod touch的小尺寸屏幕意味著,你的應(yīng)用程序用戶界面應(yīng)該合理組織,并總是關(guān)注于用戶最需要的信息。

在表面看,創(chuàng)建一個(gè)iOS應(yīng)用程序和創(chuàng)建一個(gè)Mac OS X應(yīng)用程序很像。使用相同的工具和許多相同的基礎(chǔ)庫。盡管很像,還是有些顯著的不同。iPhone不是桌面計(jì)算機(jī),有不同的預(yù)期,需要完全不同設(shè)計(jì)思路。需要從iOS的能力獲得優(yōu)勢(shì),還要避開那些對(duì)移動(dòng)環(huán)境無關(guān)和不切實(shí)際的特性。iPhone和iPod touch的小尺寸屏幕意味著,你的應(yīng)用程序用戶界面應(yīng)該合理組織,并總是關(guān)注于用戶最需要的信息。

iOS運(yùn)行用戶跟iPhone和iPod touch的設(shè)備,用桌面程序無法實(shí)現(xiàn)的交互方式來交互。多點(diǎn)觸摸(Multi-Touch)是一種革命性的接收事件的新方法,報(bào)告每一個(gè)獨(dú)立的手指對(duì)屏幕的觸摸,并使處理多手指手勢(shì)和其他的復(fù)雜輸入變得非常簡(jiǎn)單。此外,內(nèi)建的硬件特性,例如加速度傳感器,雖然也在一些桌面系統(tǒng)使用,但是在iOS中使用的更佳廣泛,可以跟蹤屏幕的當(dāng)前方向并相應(yīng)的調(diào)整你的內(nèi)容。了解如何在你的程序中使用這些特性,有助于你聚焦適于用戶的設(shè)計(jì)方式。

了解iPhone程序設(shè)計(jì)的最好辦法就是看例子。本文針對(duì)例程MoveMe進(jìn)行介紹。下面的例子展示iOS程序的典型性為,包括:

◆初始化程序

◆顯示窗口

◆描繪定制內(nèi)容

◆處理觸摸事件

◆進(jìn)行動(dòng)畫

圖 1 展現(xiàn)了應(yīng)用程序的接口。觸摸Welcome按鈕會(huì)引發(fā)一個(gè)動(dòng)畫,按鈕會(huì)跳動(dòng)并把自己的中心移動(dòng)到你的指下。手指在屏幕上移動(dòng),按鈕就會(huì)跟著你的手指移動(dòng)。把你的手指從屏幕上拿開,引發(fā)另一個(gè)動(dòng)畫,按鈕跳回它的原始位置。在按鈕以外的任何位置雙擊屏幕會(huì)改變按鈕歡迎詞的語言。

MoveMe程序的窗口

圖1 MoveMe程序的窗口

閱讀本文的其他部分前,你應(yīng)該下載例子(MoveMe),這樣你可以直接參照源代碼學(xué)習(xí)。你應(yīng)該已經(jīng)閱讀了iPhone開發(fā)者中心下面的指南文章,對(duì)iOS和開發(fā)需要的工具和語言有了基本的了解:

iOS概述

iOS開發(fā)工具

如果你對(duì)Objective-C編程語言不熟悉,你應(yīng)該閱讀學(xué)習(xí)Objective-C:入門手冊(cè)讓自己對(duì)Objective-C的基本語法有所了解。#p#

查看MoveMe例子工程

下載MoveMe例程,你可以得到構(gòu)建和運(yùn)行程序需要的源代碼和支持文件。你應(yīng)該使用Xcode應(yīng)用程序(位于 /Developer/Applications)管理iOS項(xiàng)目。每個(gè)Xcode項(xiàng)目窗口包含一個(gè)工作空間用來組織代碼和資源文件,編譯和組裝程序的構(gòu)建規(guī)則,編輯和調(diào)試代碼的工具。

圖 2現(xiàn)實(shí)MoveMe程序的Xcode項(xiàng)目窗口。要打開這個(gè)項(xiàng)目,首先把它復(fù)制到本地硬盤,然后雙擊MoveMe.xcodeproj文件即可。(你可以在可以在Xcode選擇菜單File > Open然后選擇文件。)項(xiàng)目包含了多個(gè)Objective-C源代碼文件(擴(kuò)展名為.m),一些圖像文件和其他資源,以及構(gòu)建程序包的預(yù)定義目標(biāo)。

MoveMe項(xiàng)目窗口

圖2 MoveMe項(xiàng)目窗口

在iOS,Xcode項(xiàng)目的最終目標(biāo)是程序包,一個(gè)特性類型的目錄,放置程序的二進(jìn)制執(zhí)行文件以及資源文件。iOS包是一個(gè)相對(duì)平面的目錄結(jié)構(gòu),包含的大多數(shù)文件都在包目錄的頂層。然而,包文件也可以包含子目錄去存儲(chǔ)字符串的本地化版本以及其他的語言相關(guān)的資源文件。本文不需要你了解程序的確切結(jié)構(gòu),但是你感興趣的話可以在iOS編程指南程序包章節(jié)找到這些信息。

構(gòu)建MoveMe程序

要構(gòu)建MoveMe程序并在模擬器里運(yùn)行它,要找如下的步驟去做:

1. 在Xcode中打開MoveMe.xcodeproj文件

2. 在項(xiàng)目工具欄,確保Active SDK菜單中選中了simulator選項(xiàng)。(如果Active SDK菜單在工具欄中沒有出現(xiàn),選擇菜單Project > Set Active SDK > Simulator。)

3. 從菜單選擇Build > Build and Go (Run),或者簡(jiǎn)單的點(diǎn)擊工具欄上的Build and Go按鈕。

當(dāng)程序構(gòu)建完成,Xcode把它裝入到模擬器中然后開始運(yùn)行它。使用鼠標(biāo),你可以點(diǎn)擊Welcome按鈕,并把它拖到屏幕的任意位置,查看程序的行為(是否符合需求)。如果你把一個(gè)設(shè)備設(shè)置為開發(fā)所用,你可以構(gòu)建程序并讓它在設(shè)備上運(yùn)行。#p#

簡(jiǎn)述內(nèi)存管理

iOS主要是一個(gè)面向?qū)ο笙到y(tǒng),所以你分配的大多數(shù)內(nèi)存都是以O(shè)bjective-C對(duì)象的形式存在的。iOS中的對(duì)象使用引用計(jì)數(shù)機(jī)制來確定是否可以安全的釋放對(duì)象占用的內(nèi)存。當(dāng)你創(chuàng)建一個(gè)對(duì)象,它的引用計(jì)數(shù)從1開始??蛻臬@得對(duì)象后可以選擇保留它,這樣就要把他的引用技術(shù)加1。如果客戶保留一個(gè)對(duì)象,那么它也必須在不再需要的時(shí)候釋放這個(gè)對(duì)象。釋放一個(gè)對(duì)象就會(huì)讓它的引用技術(shù)減1。當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)等于0,系統(tǒng)就會(huì)自動(dòng)的回收對(duì)象占用的內(nèi)存。

注意:iOS并不支持Mac OS X v10.5以及更新版本中的垃圾回收型內(nèi)存管理機(jī)制。如果你需要分配普通的內(nèi)存塊,沒有跟一個(gè)對(duì)象想關(guān)聯(lián)的內(nèi)存塊,你可以使用標(biāo)準(zhǔn)的malloc庫調(diào)用。任何使用malloc函數(shù)分配的內(nèi)存,你都有責(zé)任在用完后,調(diào)用free函數(shù)釋放。系統(tǒng)不會(huì)幫助你釋放基于malloc的內(nèi)存塊。

無論你想如何分配內(nèi)存,在iOS中管理全部?jī)?nèi)存使用都比在Mac OS X中更加的重要。雖然iOS有一個(gè)虛擬內(nèi)存系統(tǒng),但是他不使用交換文件。這就是說如果需要的話,代碼頁可以被覆蓋,但是同時(shí)應(yīng)用程序的數(shù)據(jù)必須適應(yīng)內(nèi)存的尺寸。系統(tǒng)監(jiān)控著空閑內(nèi)存的大小,并試圖給程序需要的全部?jī)?nèi)存。但是當(dāng)內(nèi)存使用情況太危急的時(shí)候,系統(tǒng)可能會(huì)終止你的應(yīng)用程序。但是這個(gè)選項(xiàng)僅僅系統(tǒng)是為了確保系統(tǒng)有足夠的內(nèi)存執(zhí)行最重要的操作,例如接電話,的最后一招。

更多關(guān)于在iOS下分配內(nèi)存的信息,參看Cocoa基礎(chǔ)指南。更多關(guān)于如何改善程序內(nèi)存使用的信息,參看iOS編程指南的管理你的內(nèi)存使用章節(jié)。

初始化MoveMe程序

就像每個(gè)基于C的程序一樣,每個(gè)iPhone程序的初始入口點(diǎn)也是main函數(shù)。好消息是,當(dāng)你使用Xcode的iPhone模板創(chuàng)建新項(xiàng)目的時(shí)候,你不需要自己寫這個(gè)函數(shù)。項(xiàng)目模板包含了一個(gè)帶有啟動(dòng)一個(gè)程序所有需要代碼的這個(gè)函數(shù)的版本。

列表1展示了MoveMe程序的main函數(shù)。這個(gè)main函數(shù)位于項(xiàng)目中的main.m文件內(nèi)。你創(chuàng)建的所有程序都會(huì)有一個(gè)跟這個(gè)一樣的main函數(shù)。這個(gè)函數(shù)執(zhí)行兩個(gè)關(guān)鍵任務(wù)。首先,它為程序創(chuàng)建一個(gè)最高級(jí)的自動(dòng)釋放的內(nèi)存池,這個(gè)內(nèi)存池可以回收使用autorelease函數(shù)釋放的 Objective-C對(duì)象占用的內(nèi)存。其次,它調(diào)用UIApplicationMain函數(shù)創(chuàng)建MoveMe程序的關(guān)鍵對(duì)象,初始化這些對(duì)象,開始事件處理循環(huán)。直到程序退出這個(gè)函數(shù)才會(huì)返回。

列表1 使用提供的main函數(shù)

  1. int main(int argc, char *argv[]) 
  2.  
  3.  
  4. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
  5.  
  6. int retVal = UIApplicationMain(argc, argv, nil, nil); 
  7.  
  8. [pool release]; 
  9.  
  10. return retVal; 
  11.  

定義程序的委托對(duì)象

你的項(xiàng)目中最重要的架構(gòu)細(xì)節(jié)之一就是定義一個(gè)程序委托對(duì)象,從你提供的類實(shí)例化。MoveMe項(xiàng)目中的程序委托類的接口聲明在 MoveMeAppDelegate.h文件內(nèi),實(shí)現(xiàn)定義在MoveMeAppDelegate.m文件內(nèi)。一旦你把這些文件加入到項(xiàng)目中,你可以使用界面構(gòu)建器指明這個(gè)類作為程序的委托對(duì)象。界面構(gòu)建器是一個(gè)可視化工具,用來創(chuàng)建和管理窗口的視圖,設(shè)置視圖之間的層級(jí),配置每個(gè)視圖的選項(xiàng),在視圖和程序的其他對(duì)象間建立聯(lián)系。因?yàn)樗且粋€(gè)可視化工具,你可以通過在窗口上拖動(dòng)組件完成這些任務(wù)。操作的結(jié)果是你的界面的交互版本,你可以快速修改,隨時(shí)看到改變。界面構(gòu)建器把你的用戶界面保存為一個(gè)nib文件,這是你的程序?qū)ο髨D形的存檔。

要啟動(dòng)界面構(gòu)建器,并查看程序委托對(duì)象的定義,雙擊Xcode項(xiàng)目窗口中的文件組面板中的MainWindow.xib文件。MainWindow.xib 是一個(gè)nib文件,包含了程序的窗口,定義了程序中幾個(gè)重要對(duì)象之間的關(guān)系,包括程序的委托對(duì)象。要了解程序委托關(guān)系是如何建立的,點(diǎn)擊nib文件文檔窗口(標(biāo)題為MainWindow.xib)中的File's Owner圖標(biāo),顯示查看器窗口(選擇菜單Tools > Inspector),然后點(diǎn)擊查看器窗口的連接頁。

如圖3所示,查看器現(xiàn)實(shí)File's Owner對(duì)象(表示nib文件中的應(yīng)用程序)有一個(gè)委托出口連接到MoveMeAppDelegate對(duì)象。

程序委托

圖3 程序委托

程序委托對(duì)象與標(biāo)準(zhǔn)的UIApplication對(duì)象串聯(lián)工作,對(duì)程序狀態(tài)改變做出反應(yīng)。程序?qū)ο笞龃蠖鄶?shù)的繁重工作,但是委托也負(fù)責(zé)幾項(xiàng)關(guān)鍵的行為,如下:

◆設(shè)定程序窗口,初始化用戶界面

◆執(zhí)行定制數(shù)據(jù)引擎所需的格外初始化任務(wù)

◆打開與程序定制的URL模式相關(guān)聯(lián)的內(nèi)容

◆對(duì)設(shè)備方向的變化做出響應(yīng)

◆處理內(nèi)存不足的警告

◆處理系統(tǒng)要求程序退出的請(qǐng)求

啟動(dòng)期間,對(duì)委托對(duì)象最緊急的任務(wù)就是設(shè)定和展現(xiàn)程序窗口,詳情在“創(chuàng)建程序窗口”中描述。委托對(duì)象還應(yīng)該為了程序可以立即使用而執(zhí)行需要的任務(wù),例如從之前的一個(gè)狀態(tài)恢復(fù)程序,或者創(chuàng)建需要的對(duì)象。當(dāng)程序退出時(shí),委托對(duì)象需要執(zhí)行有序的程序關(guān)閉操作,并保存下次啟動(dòng)循環(huán)所需要的信息。#p#

創(chuàng)建程序窗口

每個(gè)程序都需要?jiǎng)?chuàng)建窗口覆蓋整個(gè)屏幕然后在窗口內(nèi)放置內(nèi)容。iOS的圖形程序不會(huì)和其他的程序一起運(yùn)行。實(shí)際上除了核心和一些底層系統(tǒng)守護(hù)進(jìn)程,程序啟動(dòng)后就獨(dú)占系統(tǒng)了。甚至,你的程序可能最多需要一個(gè)窗口,一個(gè) UIWindow類的實(shí)例。你希望改變用戶界面的時(shí)候,你只需要改變窗口上顯示的視圖即可。

窗口提供了用戶界面的描繪空間,但是視圖對(duì)象提供實(shí)際的內(nèi)容。視圖對(duì)象是UIView類的實(shí)例,描繪內(nèi)容,并響應(yīng)對(duì)內(nèi)容的交互行為。iOS定義了標(biāo)準(zhǔn)視圖去表現(xiàn)表格,按鈕,文本框以及其他類型的交互控件。你可以把這些視圖都加入到窗口,或者你可以用繼承UIView定義一個(gè)定制視圖,實(shí)現(xiàn)一些定制描繪和事件響應(yīng)。MoveMe程序定義了兩個(gè)視圖,由MoveMeView和PlacardView兩個(gè)類實(shí)現(xiàn),顯示用戶界面,處理用戶交互事件。

程序啟動(dòng)期間,目標(biāo)是創(chuàng)建程序窗口并盡快的顯示一些初始內(nèi)容。窗口從MainWindow.xib文件中展開。當(dāng)程序達(dá)到啟動(dòng)完成狀態(tài),準(zhǔn)備就緒可以處理事件的時(shí)候,UIApplication對(duì)象向委托對(duì)象發(fā)出applicationDidFinishLaunching:消息。這個(gè)消息暗示委托對(duì)象把內(nèi)容放入窗口,并執(zhí)行其他程序所需的初始化操作。

在MoveMe程序中,委托在applicationDidFinishLaunching:消息中做如下工作:

◆創(chuàng)建一個(gè)視圖控制器對(duì)象,管理窗口中的內(nèi)容視圖。

◆使用MoveMeView類的實(shí)例初始化試圖控制器,這個(gè)實(shí)例保存在MoveMeView.xib文件內(nèi),作為背景視圖并填滿整個(gè)窗口邊框。

◆把視圖控制器作為子視圖加入窗口。

◆顯示窗口。

列表2展示了MoveMe程序的applicationDidFinishLaunching:方法,該方法定義在程序委托對(duì)象的實(shí)現(xiàn)文件MoveMeAppDelegate.m中。這個(gè)方法創(chuàng)建了窗口的主內(nèi)容視圖,并使窗口可見。展現(xiàn)窗口讓系統(tǒng)了解到,程序已經(jīng)準(zhǔn)備就緒可以處理事件了。

列表2 創(chuàng)建內(nèi)容視圖

  1. - (void)applicationDidFinishLaunching:(UIApplication *)application 
  2.  
  3.  
  4. // Set up the view controller 
  5.  
  6. UIViewController *aViewController = [[UIViewController alloc] 
  7.  
  8. initWithNibName:@"MoveMeView" bundle:[NSBundle mainBundle]]; 
  9.  
  10. self.viewController = aViewController
  11.  
  12. [aViewController release]; 
  13.  
  14. // Add the view controller's view as a subview of the window 
  15.  
  16. UIView *controllersView = [viewController view]; 
  17.  
  18. [window addSubview:controllersView]; 
  19.  
  20. [window makeKeyAndVisible]; 
  21.  

注意:你可以利用applicationDidFinishLaunching:方法執(zhí)行設(shè)定程序用戶界面以外的其他任務(wù)。許多程序利用它初始化需要的數(shù)據(jù)結(jié)構(gòu),讀取用戶參數(shù),或者返回到上次程序退出時(shí)的狀態(tài)。

雖然前面的代碼創(chuàng)建了窗口的背景視圖,并顯示了窗口,但是在前面的代碼中,你無法找到創(chuàng)建PlacardView類顯示W(wǎng)elcome按鈕的代碼。這個(gè)行為由MoveMeView類的 setUpPlacardView方法來處理,這個(gè)方法在MoveMeView對(duì)象從nib文件中展開的時(shí)候會(huì)被調(diào)用。setUpPlacardView 方法在列表3中展示。這個(gè)視圖的初始化部分包括了PlacardView對(duì)象的創(chuàng)建。因?yàn)镸oveMeView類提供了整個(gè)程序的背景,所以它把 PlacardView對(duì)象加為子視圖。兩個(gè)視圖見的關(guān)系不僅令 Welcome按鈕顯示在程序的背景之上,而且讓MoveMeView類可以處理針對(duì)按鈕的事件。

列表3 創(chuàng)建placard視圖

  1. - (void)setUpPlacardView 
  2.  
  3.  
  4. // Create the placard view -- it calculates its own frame based on its image 
  5.  
  6. PlacardView *aPlacardView = [[PlacardView alloc] init]; 
  7.  
  8. self.placardView = aPlacardView
  9.  
  10. [aPlacardView release]; 
  11.  
  12. placardView.center = self.center; 
  13.  
  14. [self addSubview:placardView]; 
  15.  

#p#

描繪Welcome按鈕

UIKit提供的標(biāo)準(zhǔn)視圖無需修改就可以描繪很多類型的簡(jiǎn)單內(nèi)容。例如,你可以用UIImageView類顯示圖像,用UILabel類顯示文本信息。 MoveMe程序的MoveMeView類也得益于UIView對(duì)象的基本屬性,具體是backgroundColor屬性,用顏色填滿視圖。這個(gè)屬性可以在視圖對(duì)象的初始化方法中被設(shè)置。這里,這個(gè)屬性被設(shè)置于MoveMeView.xib文件中,使用界面構(gòu)建器的查看器窗口的屬性頁的顏色選擇器選擇顏色。當(dāng)你需要?jiǎng)討B(tài)描繪內(nèi)容,你必須使用在UIKit里的一些更高級(jí)的描繪特性,或者你應(yīng)該使用Quartz或者OpenGL ES。

MoveMe 程序的PlacardView類描繪Welcome按鈕并管理按鈕在屏幕上面的位置。雖然PlacardView類可以用嵌入U(xiǎn)IImageView和 UILabel對(duì)象的方法描繪內(nèi)容,但是這里明確的描繪內(nèi)容,來顯示全部的流程。所以,這個(gè)類實(shí)現(xiàn)了drawRect:方法,該方法是用來定制描繪的位置。

drawRect:方法被調(diào)用時(shí),描繪環(huán)境已經(jīng)配置就緒了。需要做的只是指定描繪命令描繪定制內(nèi)容。在PalcardView類中,內(nèi)容包括一個(gè)背景圖像(保存在Placard.png資源文件內(nèi))和一個(gè)定制字符串,文本可以動(dòng)態(tài)改變。要描繪內(nèi)容,該類需要執(zhí)行下面的步驟:

◆在視圖的原點(diǎn)描繪背景圖片。(因?yàn)橐晥D大小已經(jīng)調(diào)整到符合圖片尺寸,這個(gè)步驟提供了完整的按鈕北京。)

◆計(jì)算welcome字符串的位置,令其可以顯示在按鈕中間。(因?yàn)樽址某叽缈梢愿淖儯晕恢妹看味夹枰鶕?jù)當(dāng)前的字符串尺寸計(jì)算。)

◆設(shè)定描繪顏色為黑色。

◆用黑色描繪字符串,位置略有偏移。

◆設(shè)定描繪顏色為白色。

◆在正確的位置用白色描繪字符串。

列表4展示 PlacardView類的drawRect方法。成員變量placardImage包含一個(gè)帶有按鈕背景圖片的UIImage對(duì)象,成員變量 currentDisplayString是一個(gè)NSString對(duì)象包含了welcome字符串。描繪圖像后,這個(gè)方法計(jì)算字符串相對(duì)視圖的位置。字符串的尺寸是已知的,在字符串裝入的時(shí)候計(jì)算好并保存在成員變量textSize中。字符串會(huì)被描繪兩次,一次用黑色一次用白色,使用NSString的drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:方法。

列表4 描繪Welcome按鈕

  1. - (void)drawRect:(CGRect)rect 
  2.  
  3.  
  4. // Draw the placard at 0, 0 
  5.  
  6. [placardImage drawAtPoint:(CGPointMake(0.0, 0.0))]; 
  7.  
  8. /* 
  9.  
  10. Draw the current display string. 
  11.  
  12. This could be done using a UILabel, but this serves to illustrate 
  13.  
  14. the UIKit extensions to NSString. The text is drawn center of the 
  15.  
  16. view twice - first slightly offset in black, then in white -- to give 
  17.  
  18. an embossed appearance. The size of the font and text are calculated 
  19.  
  20. in setupNextDisplayString. 
  21.  
  22. */ 
  23.  
  24. // Find point at which to draw the string so it will be in the center of the view 
  25.  
  26. CGFloat x = self.bounds.size.width/2 - textSize.width/2; 
  27.  
  28. CGFloat y = self.bounds.size.height/2 - textSize.height/2; 
  29.  
  30. CGPoint point; 
  31.  
  32. // Get the font of the appropriate size 
  33.  
  34. UIFont *font = [UIFont systemFontOfSize:fontSize]; 
  35.  
  36. [[UIColor blackColor] set]; 
  37.  
  38. point = CGPointMake(x, y + 0.5); 
  39.  
  40. [currentDisplayString drawAtPoint:point 
  41.  
  42. forWidth:(self.bounds.size.width-STRING_INDENT) 
  43.  
  44. withFont:font 
  45.  
  46. fontSize:fontSize 
  47.  
  48. lineBreakMode:UILineBreakModeMiddleTruncation 
  49.  
  50. baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; 
  51.  
  52. [[UIColor whiteColor] set]; 
  53.  
  54. point = CGPointMake(x, y); 
  55.  
  56. [currentDisplayString drawAtPoint:point 
  57.  
  58. forWidth:(self.bounds.size.width-STRING_INDENT) 
  59.  
  60. withFont:font 
  61.  
  62. fontSize:fontSize 
  63.  
  64. lineBreakMode:UILineBreakModeMiddleTruncation 
  65.  
  66. baselineAdjustment:UIBaselineAdjustmentAlignBaselines]; 
  67.  

當(dāng)你需要描繪比圖像和字符串更復(fù)雜的內(nèi)容的時(shí)候,你可以選擇Quartz或者OpenGL ES。Quartz和UIKit協(xié)作,處理描繪矢量路徑,圖像,斜線,PDF和其他你想動(dòng)態(tài)創(chuàng)建的復(fù)雜內(nèi)容。因?yàn)镼uartz和UIKit基于相同的描繪環(huán)境,你可以直接在視圖的drawRect:方法中調(diào)用Quartz函數(shù),甚至可以在UIKit類中混用Quartz。

OpenGL ES是Quartz和UIKit之外的選擇,可以讓你用類似Mac OS X中OpenGL技術(shù)的函數(shù)來渲染2D和3D內(nèi)容。跟Quartz和UIKit不同的是,你不能用視圖的drawRect:方法來進(jìn)行描繪。仍舊是使用視圖,但是主要是用視圖對(duì)象作為OpenGL ES代碼的描繪空間。按照什么頻率更新描繪空間,使用什么對(duì)象,取決于你自己的選擇。

#p#

處理觸摸事件

iOS的多點(diǎn)觸摸接口令你的程序可以識(shí)別和響應(yīng)多個(gè)手指觸摸設(shè)備產(chǎn)生的不同事件。響應(yīng)多手指觸摸的能力帶來了強(qiáng)大的能力,但是也帶來跟傳統(tǒng)的基于鼠標(biāo)的事件處理系統(tǒng)操作的明顯不同。每次手指觸摸設(shè)備的表面,觸摸傳感器產(chǎn)生一個(gè)觸摸事件。每次手指移動(dòng),額外的觸摸事件產(chǎn)生表明手指的新位置。一旦手指離開設(shè)備表面,系統(tǒng)分發(fā)另外一個(gè)觸摸事件表明這一點(diǎn)。

因?yàn)橥瑫r(shí)可能有多個(gè)手指觸摸設(shè)備,這就產(chǎn)生了利用這些事件來識(shí)別復(fù)雜用戶手勢(shì)的可能性。系統(tǒng)對(duì)識(shí)別一些常用手勢(shì)(例如,雙擊)提供了幫助,但是你可以檢測(cè)到更復(fù)雜的手勢(shì)。當(dāng)事件系統(tǒng)產(chǎn)生了一個(gè)新的觸摸事件,它包含了每個(gè)手指當(dāng)前的狀態(tài),包括觸摸或者剛離開設(shè)備的表面。因?yàn)槊總€(gè)事件對(duì)象包括所有的活動(dòng)觸摸事件,你可以用新的事件監(jiān)控每個(gè)手指的動(dòng)作。你可以在事件行為之間跟蹤每個(gè)手指的移動(dòng)來檢測(cè)手勢(shì),你可以用來跟程序中的內(nèi)容交互。例如,如果事件表明用戶正在實(shí)施手指分開和手指并攏手勢(shì),而且下面的視圖支持放大,所以你可以用這些時(shí)間改變當(dāng)前的縮放級(jí)別。

用觸摸事件檢測(cè)手勢(shì)

圖4 用觸摸事件檢測(cè)手勢(shì)

系統(tǒng)把事件分發(fā)給程序的響應(yīng)者對(duì)象,它是UIResponder類的實(shí)例。在iPhone程序中,程序的視圖往往是你的定制響應(yīng)者對(duì)象。MoveMe程序?qū)崿F(xiàn)兩個(gè)視圖類,但是實(shí)際上只有MoveMeView類響應(yīng)事件消息。該類通過覆蓋 UIResponder的下列方法,檢測(cè)在Welcome按鈕內(nèi)外的輕點(diǎn)。

◆ (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

◆ (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

◆ (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

為了簡(jiǎn)化事件處理行為,MoveMe程序僅跟蹤接觸設(shè)備表面的第一次手指的事件。這可以利用UIView類對(duì)此的支持,此類在默認(rèn)情況下禁用多點(diǎn)觸摸事件。對(duì)于不需要跟蹤多個(gè)手指事件的程序,這個(gè)特性很方便。當(dāng)多點(diǎn)觸摸事件被禁用的時(shí)候,系統(tǒng)僅分發(fā)跟第一個(gè)接觸設(shè)備的手指的消息。與其他的觸摸相關(guān)的事件不會(huì)被分發(fā)給視圖。如果希望得到其他觸摸的信息,你可以利用UIView類的 setMultipleTouchEnabled:方法,打開多點(diǎn)觸摸支持。

作為事件處理部分,MoveMeView類執(zhí)行下面的操作:

◆當(dāng)觸摸第一次發(fā)生,檢查事件發(fā)生的位置。

◆雙擊Welcome按鈕外的位置,更新按鈕顯示的字符串。

◆單擊按鈕,把按鈕的中心移到手指之下,并引發(fā)一個(gè)動(dòng)畫放大按鈕。

◆其他的觸摸都忽略。

◆如果手指在按鈕之內(nèi)移動(dòng),按鈕的位置就會(huì)更新以匹配手指。

◆如果手指在按鈕內(nèi),然后離開設(shè)備的表面,按鈕以動(dòng)畫的形式回到他的原始位置。

列表5展示MoveMeView類的 touchesBegan:withEvent:方法。手指首次觸摸設(shè)備的時(shí)候系統(tǒng)調(diào)用這個(gè)方法。方法獲得所有的觸摸,然后抽出唯一的觸摸以及被觸摸的物體。UITouch對(duì)象中的信息可以說明觸摸發(fā)生在哪個(gè)視圖(MoveMeView或者PlacardView)上,以及與之相關(guān)的觸碰數(shù)量。如果觸摸是按鈕外的雙擊,touchesBegan:withEvent:方法調(diào)用setupNextDisplayString方法改變按鈕的歡迎字符串。如果事件發(fā)生在Welcome按鈕內(nèi),使用animateFirstTouchAtPoint:方法放大按鈕,并把按鈕中心移動(dòng)到觸摸發(fā)生的位置上。其他觸摸相關(guān)的事件都被忽略了。

列表5 處理初步的觸摸事件

  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  2.  
  3.  
  4. // We only support single touches, so anyObject 
  5.  
  6. // retrieves just that touch from touches 
  7.  
  8. UITouch *touch = [touches anyObject]; 
  9.  
  10. // Only move the placard view if the touch was in the placard view 
  11.  
  12. if ([touch view] != placardView) 
  13.  
  14.  
  15. // In case of a double tap outside the placard view, 
  16.  
  17. // update the placard's display string 
  18.  
  19. if ([touch tapCount] == 2) 
  20.  
  21.  
  22. [placardView setupNextDisplayString]; 
  23.  
  24.  
  25. return; 
  26.  
  27.  
  28. // Animate the first touch 
  29.  
  30. CGPoint touchPoint = [touch locationInView:self]; 
  31.  
  32. [self animateFirstTouchAtPoint:touchPoint]; 
  33.  

列表6展示MoveMeView類的touchesMoved:withEvent:方法。系統(tǒng)在響應(yīng)手指已經(jīng)觸摸設(shè)備,而且從原始位置移開的時(shí)候調(diào)用這個(gè)方法。MoveMe程序僅跟蹤發(fā)生在Welcome按鈕上的移動(dòng)。這個(gè)方法檢查觸摸事件的位置,并用之調(diào)整Placard對(duì)象的中點(diǎn)。視圖的系統(tǒng)會(huì)引發(fā)在新位置的自動(dòng)重繪。

列表6 響應(yīng)觸摸的移動(dòng)

  1. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
  2.  
  3.  
  4. UITouch *touch = [touches anyObject]; 
  5.  
  6. // If the touch was in the placardView, move the placardView 
  7.  
  8. // to its location 
  9.  
  10. if ([touch view] == placardView) 
  11.  
  12.  
  13. CGPoint location = [touch locationInView:self]; 
  14.  
  15. placardView.center = location
  16.  
  17. return; 
  18.  
  19.  

當(dāng)用戶的手指離開屏幕,MoveMe用動(dòng)畫的形式把按鈕移動(dòng)回它的原始位置,程序窗口的中點(diǎn)。列表7展示了開始動(dòng)畫的touchesEnded:withEvent:方法。

列表7 釋放Welcome按鈕

  1. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
  2.  
  3.  
  4. UITouch *touch = [touches anyObject]; 
  5.  
  6. // If the touch was in the placardView, bounce it back to the center 
  7.  
  8. if ([touch view] == placardView) 
  9.  
  10.  
  11. // Disable user interaction so subsequent touches 
  12.  
  13. // don't interfere with animation 
  14.  
  15. self.userInteractionEnabled = NO
  16.  
  17. [self animatePlacardViewToCenter]; 
  18.  
  19. return; 
  20.  
  21.  

為了簡(jiǎn)化程序的事件處理流程,touchesEnded:withEvent:方法在按鈕以動(dòng)畫方式返回原始位置的過程中暫時(shí)禁用了新的觸摸事件。如果不這么做的話,每個(gè)事件處理方法中都需要判斷按鈕是不是正在動(dòng)畫中,如果是就要終止動(dòng)畫。在按鈕返回屏幕中心的時(shí)候短時(shí)間禁用用戶交互,簡(jiǎn)化了事件處理代碼,無非額外的邏輯。當(dāng)按鈕達(dá)到他的原始位置,MoveMeView類的 animationDidStop:finished:方法重新啟用用戶交互,這樣事件循環(huán)又可以繼續(xù)下去。#p#

按鈕動(dòng)畫移動(dòng)

在iPhone程序中,動(dòng)畫起了非常重要的作用。動(dòng)畫廣泛用于給用戶相關(guān)信息以及立即響應(yīng)。例如,當(dāng)用戶在程序中瀏覽層級(jí)數(shù)據(jù),iPhone不是僅僅直接用其他的屏幕代替當(dāng)前的屏幕,而是讓屏幕以動(dòng)畫的方式就位。移動(dòng)的方向用戶走向?qū)蛹?jí)的高層還是低層,并給用戶可視化的信息這里有新的信息。

因?yàn)閯?dòng)畫很重要,所以UIKit的類中已經(jīng)內(nèi)建了對(duì)它的支持。MoveMe程序獲益于這種支持,動(dòng)畫改變Welcome按鈕的外觀。當(dāng)用戶第一次觸摸按鈕,程序引發(fā)一個(gè)動(dòng)畫讓按鈕的尺寸變大。

當(dāng)用戶放開這個(gè)按鈕,另外的動(dòng)畫產(chǎn)生讓按鈕回到原始位置。創(chuàng)建這樣動(dòng)畫的步驟如下:

◆調(diào)用你想動(dòng)畫的視圖的beginAnimations:context:方法。

◆設(shè)置動(dòng)畫的屬性。

◆調(diào)用commitAnimations方法開始動(dòng)畫。

列表8展示W(wǎng)elcome按鈕第一次被觸摸的時(shí)候令它動(dòng)畫的代碼。這個(gè)方法設(shè)置了動(dòng)畫的持續(xù)時(shí)間,并對(duì)按鈕實(shí)施放大操作。當(dāng)動(dòng)畫結(jié)束,動(dòng)畫的機(jī)制調(diào)用委托的 growAnimationDidStop:finished:context:方法,通過令按鈕輕微晃動(dòng)的方式結(jié)束動(dòng)畫,并把placard視圖移動(dòng)到觸點(diǎn)。

列表8 讓W(xué)elcome產(chǎn)生動(dòng)畫

  1. - (void)animateFirstTouchAtPoint:(CGPoint)touchPoint 
  2.  
  3.  
  4. #define GROW_ANIMATION_DURATION_SECONDS 0.15 
  5.  
  6. NSValue *touchPointValue = [[NSValue valueWithCGPoint:touchPoint] retain]; 
  7.  
  8. [UIView beginAnimations:nil context:touchPointValue]; 
  9.  
  10. [UIView setAnimationDuration:GROW_ANIMATION_DURATION_SECONDS]; 
  11.  
  12. [UIView setAnimationDelegate:self]; 
  13.  
  14. [UIView setAnimationDidStopSelector: @selector(growAnimationDidStop:finished:context:)]; 
  15.  
  16. CGAffineTransform transform = CGAffineTransformMakeScale(1.2, 1.2); 
  17.  
  18. placardView.transform = transform; 
  19.  
  20. [UIView commitAnimations]; 
  21.  
  22.  
  23. - (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
  24.  
  25.  
  26. #define MOVE_ANIMATION_DURATION_SECONDS 0.15 
  27.  
  28. [UIView beginAnimations:nil context:NULL]; 
  29.  
  30. [UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS]; 
  31.  
  32. placardView.transform = CGAffineTransformMakeScale(1.1, 1.1); 
  33.  
  34. // Move the placard view under the touch 
  35.  
  36. NSValue *touchPointValue = (NSValue *)context; 
  37.  
  38. placardView.center = [touchPointValue CGPointValue]; 
  39.  
  40. [touchPointValue release]; 
  41.  
  42. [UIView commitAnimations]; 
  43.  

#p#

完成程序

前面的章節(jié),你已經(jīng)看到MoveMe程序如何初始化,展現(xiàn)用戶界面和響應(yīng)事件。除了這些概念以外,在構(gòu)建程序并把它裝載到設(shè)備之前,你還需要了解一些小細(xì)節(jié)。最后需要考慮的是你的程序的信息屬性列表(info.plist)。這是程序用來跟系統(tǒng)通信的一個(gè)XML文件。Xcode 為你的程序創(chuàng)建一個(gè)默認(rèn)版本,并把程序的初始化配置信息放在其中。你可以拓展這個(gè)信息,為系統(tǒng)提供所需的關(guān)于程序的額外細(xì)節(jié)信息。例如,你使用這個(gè)文件通信,關(guān)于程序的版本,支持的定制URL模式,啟動(dòng)鏡像,默認(rèn)的視覺狀態(tài)和系統(tǒng)狀態(tài)欄的風(fēng)格。

列表9展示了MoveMe程序的info.plist文件的內(nèi)容。該文件指明可執(zhí)行文件的名字,顯示在用戶主屏幕的圖像文件,以及在系統(tǒng)中唯一確定程序的字符串。因?yàn)镸oveMe程序是一個(gè)全屏程序,也就是說,他不顯示狀態(tài)欄,所以它包含了鍵UIStatusBarHidden并把值設(shè)為true。把這個(gè)鍵設(shè)置為true令系統(tǒng)得知在啟動(dòng)或者程序運(yùn)行期間,不要顯示程序狀態(tài)欄。雖然MoveMe程序也可以用編程的手段配置相同的行為,但是那樣的話行為只能在程序已經(jīng)啟動(dòng)后起作用,看起來有點(diǎn)莫名其妙的。

列表9 Info.plist文件的內(nèi)容

  1. CFBundleDevelopmentRegion 
  2.  
  3. en 
  4.  
  5. CFBundleDisplayName 
  6.  
  7. ${PRODUCT_NAME} 
  8.  
  9. CFBundleExecutable 
  10.  
  11. ${EXECUTABLE_NAME} 
  12.  
  13. CFBundleIconFile 
  14.  
  15. Icon.png 
  16.  
  17. CFBundleIdentifier 
  18.  
  19. com.yourcompany.${PRODUCT_NAME:identifier} 
  20.  
  21. CFBundleInfoDictionaryVersion 
  22.  
  23. 6.0 
  24.  
  25. CFBundleName 
  26.  
  27. ${PRODUCT_NAME} 
  28.  
  29. CFBundlePackageType 
  30.  
  31. APPL 
  32.  
  33. CFBundleSignature 
  34.  
  35. ???? 
  36.  
  37. CFBundleVersion 
  38.  
  39. 1.0 
  40.  
  41. UIStatusBarHidden 
  42.  
  43. NSMainNibFile 
  44.  
  45. MainWindow 

注意:你可以使用文本編輯器編輯info.plist文件的內(nèi)容,顯示為Info.plist文件內(nèi)容對(duì)應(yīng)的XML內(nèi)容,或者使用屬性列表編輯器,顯示為鍵值對(duì)的表格。Xcode也提供了信息窗口訪問程序目標(biāo)的某些屬性。要展現(xiàn)這個(gè)窗口,選擇程序目標(biāo)然后選擇菜單File > Get Info。屬性表包含一些info.plist文件中的屬性。

現(xiàn)在你已經(jīng)了解了創(chuàng)建自己的iPhone程序需要的全部基礎(chǔ)信息。下面的步驟是學(xué)習(xí)更多的iOS特性。程序應(yīng)該利用iOS內(nèi)建的特性創(chuàng)建直觀而且令人愉悅的用戶體驗(yàn)。這些特性有些在“深入探討你的程序”,但是關(guān)于完全的特性列表以及如何使用它們的信息,參看iOS編程指南。

深入談?dòng)懩愕某绦?/strong>

這里有一些用戶可以獲得的iPhone和iPod touch的特性。有些特性跟硬件相關(guān),例如根據(jù)設(shè)備的方向自動(dòng)調(diào)整視圖。有些是跟軟件相關(guān)的,例如所有的內(nèi)建iPhone應(yīng)用程序都使用同一個(gè)聯(lián)系人列表。因?yàn)橄旅婷枋龅倪@些特性跟基本的用戶體驗(yàn)有關(guān),所以你應(yīng)該在原始設(shè)計(jì)就考慮這些特性是否適用于你的程序。

用加速度傳感器跟蹤方向和移動(dòng)

iPhone和iPod touch的加速度傳感器可以為系統(tǒng)和你的程序提供輸入。一個(gè)加速度傳感器測(cè)量在一個(gè)方向上速度的變化。iPhone和iPod touch都有三個(gè)加速度傳感器用來測(cè)量3D空間的每個(gè)主要軸向上的變化,允許你檢測(cè)任何方向的移動(dòng)。

加速度傳感器軸向

圖5 加速度傳感器軸向

也許你不認(rèn)為測(cè)量加速度變化有啥用處,但是實(shí)際上這個(gè)信息可以有很大的用處。重力的作用總是把物體拉向地面。這個(gè)力的作用造成即使設(shè)備是靜止不動(dòng)的,仍舊可以測(cè)量到朝向地面的加速度。通過跟蹤加速度傳感器記錄的加速度,以及加速度的大小,你可以精確的檢測(cè)到設(shè)備在3D空間內(nèi)的方向。你可以把方向作為程序的輸入。

系統(tǒng)使用加速度傳感器監(jiān)控設(shè)備當(dāng)前的方向,并在方向改變的時(shí)候通知程序。如果程序的用戶界面支持橫豎兩種模式,那么你應(yīng)該把視圖控制器加入到你的設(shè)計(jì)中。UIViewController類提供了,旋轉(zhuǎn)用戶界面以及根據(jù)方向改變自動(dòng)調(diào)整視圖位置的機(jī)制。

如果你想直接訪問原始的加速度傳感器數(shù)據(jù),你可以使用UIKit內(nèi)的共享對(duì)象UIAccelerometer。加速度傳感器在一個(gè)可以配置的時(shí)間間隔下定時(shí)報(bào)告當(dāng)前的加速度值。你還可以使用這些數(shù)據(jù)來檢測(cè)設(shè)備方向或者檢測(cè)其他的瞬間移動(dòng),例如用戶前后搖晃設(shè)備。你可以把這個(gè)信息作為游戲或者其他程序的輸入。想要找到如何配置UIAccelerometer對(duì)象,以及接收加速度傳感器事件的例子,參看iOS編程指南的訪問加速度傳感器事件章節(jié)。

訪問用戶通訊錄

用戶的通訊錄列表是所有系統(tǒng)程序共享的重要資源。電話,郵件和短信息程序都用它來識(shí)別用戶要聯(lián)系的聯(lián)系人,并使基本交互變得容易,例如打電話,發(fā)郵件,或者短信息。你自己的程序也可以為類似的目的訪問用戶的通訊錄信息,或者其他程序需要的相關(guān)信息。

訪問用戶通訊錄

圖6 訪問用戶通訊錄

iOS提供對(duì)用戶通訊錄的直接訪問,以及通過一個(gè)標(biāo)準(zhǔn)的選擇接口進(jìn)行的間接訪問。使用直接訪問,你可以直接用通訊錄數(shù)據(jù)庫獲得聯(lián)系人信息。你可以用另外的方式來展現(xiàn)這些聯(lián)系信息,或者根據(jù)程序的需求過濾它們。如果你不需要一個(gè)定制接口,iOS也提供了一系列系統(tǒng)接口選擇和創(chuàng)建聯(lián)系人。把這些接口加入你的程序需要一些額外的工作,但是可以令你的程序的外觀看起來更像系統(tǒng)的一部分。

獲得用戶當(dāng)前的位置

運(yùn)行iOS的設(shè)備是為用戶頻繁使用而設(shè)計(jì)的。你所設(shè)計(jì)的程序需要把這一點(diǎn)納入考慮之中。互聯(lián)網(wǎng)和Web讓人們可以在任何地方經(jīng)營(yíng)自己的事業(yè),所以可以追蹤用戶當(dāng)前位置就變成了必備的用戶體驗(yàn)了。畢竟,我們不能為一個(gè)在洛杉磯口渴的人,列出紐約的咖啡店。這就是Core Location框架的用處。

Core Location框架追蹤手機(jī)機(jī)站和Wi-Fi無線熱點(diǎn)的信號(hào),然后使用他們?nèi)嵌ㄎ怀鲇脩舢?dāng)前的位置(此文檔比較早期,現(xiàn)在已經(jīng)包括直接獲取GPS信號(hào)了)。你可以僅用該框架獲取一個(gè)固定的初始位置,也可以在用戶位置發(fā)生變化的時(shí)候得到通知。利用這些信息,你可以過濾要提供給用戶的信息,或者做一些其他的事情。

播放音頻和視頻

iOS通過Core Audio和OpenAL框架支持你的程序中的音頻特性,并使用Media Player框架提供視頻回放的能力。你可以用它播放簡(jiǎn)單的聲音效果,或者多個(gè)聲道的音頻,混音,把它們限制在某個(gè)音域內(nèi),甚至可以使用iPhone的振動(dòng)功能。如果你是一個(gè)游戲開發(fā)者,而且你的代碼中已經(jīng)使用了OpenAL的特性,你可以直接在iOS中繼續(xù)使用這些代碼在你的游戲中定位和回放你的音頻。

Media Player框架是用來回放全屏視頻文件。這個(gè)框架支持多種標(biāo)準(zhǔn)的電影文件格式,你可以控制回放的環(huán)境,包括是否顯示用戶控制器,以及視頻內(nèi)容的長(zhǎng)寬比。游戲開發(fā)者可以利用這個(gè)框架播放過場(chǎng)影片或者預(yù)先渲染好的內(nèi)容,而基于媒體的程序也可以用這個(gè)框架回放電影文件。

播放視頻

圖7 播放視頻

使用內(nèi)置相機(jī)

iPhone的相機(jī)程序允許用戶拍攝照片,然后保存在照片庫中,和其他從電腦上傳來的照片放在一起。雖然iPod touch沒有照相機(jī),但是它也有一個(gè)用來保存用戶上傳照片的照片庫。iOS用UIKit框架中的UIImagePickerController類來支持這些特性。

iPhone的相機(jī)

圖8 iPhone的相機(jī)

UIImagePickerController類為你的程序提供了相機(jī)和照片庫的訪問接口。包括照相和照片程序的很多程序,使用這些標(biāo)準(zhǔn)的系統(tǒng)接口。當(dāng)你顯示一個(gè)圖片選擇界面,選擇控制器UIImagePickerController實(shí)現(xiàn)所有所需的用戶交互細(xì)節(jié),然后返回一個(gè)結(jié)果圖像到你的應(yīng)用程序。

【編輯推薦】

  1. Windows Phone 7 免費(fèi)線下培訓(xùn)火熱報(bào)名中
  2. 我國(guó)IPTV研究目全球領(lǐng)先
  3. 3G與IPTV是發(fā)展大方向
  4. 我國(guó)IPTV研究目全球領(lǐng)先
  5. 3G與IPTV是發(fā)展大方向
責(zé)任編輯:佚名
相關(guān)推薦

2010-08-13 13:05:30

Flex應(yīng)用程序

2011-03-15 19:45:27

Windows Azu

2013-01-11 14:45:43

iOS開發(fā)移動(dòng)應(yīng)用iPhone

2011-06-08 10:01:36

Windows Pho 應(yīng)用程序

2011-06-08 10:24:38

Windows Pho 應(yīng)用程序

2011-03-10 10:45:47

Azure“Hello Worl

2022-06-07 07:21:19

Python內(nèi)置庫命令行

2011-06-09 09:31:40

Qt 實(shí)例

2023-05-19 08:49:58

SQLAlchemy數(shù)據(jù)庫

2009-10-19 14:14:19

OSGi Web應(yīng)用

2020-10-11 20:54:39

Python開發(fā)Docker

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2012-12-07 10:15:53

IBMdW

2013-05-13 09:31:29

Web App開發(fā)WebApp

2022-10-21 14:21:46

JavaScript筆記技能

2022-02-18 08:43:19

Spring Boo應(yīng)用程序RabbitMQ

2016-08-04 16:02:34

云計(jì)算

2010-07-12 10:11:27

ibmdwWeb

2013-06-14 17:16:44

WP開發(fā)Windows PhoWP應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)