首發地址:http://www.cnblogs.com/esrichina/archive/2012/09/01/2666647.html
安裝完ArcGIS Runtime SDK for iOS後,系統會自帶一個支持ArcGIS Runtime SDK的項目MapViewDemo。路徑爲:${HOME}/Library/SDKs/ArcGIS/Samples/MapViewDemo
打開MapViewDemo文件夾下的MapViewDemo.xcodeproj項目文件,可以在Xcode中看到項目文件結構如圖
圖1 MapViewDemo文件結構
下面我們來介紹下MapViewDemo中文件結構
1.ArcGIS.bundle(包)是一個內部結構按照標準規則組織的ArcGIS資源目錄(使用方法如:ArcGIS.bundle/GpsDisplay.png)。解壓後可以看到以下資源:
圖2 ArcGIS.bundle包含的資源
其中Resources目錄是應用程序本地化的一些設置
圖3 ArcGIS.bundle中用於應用程序本地化的資源
其實,iOS的應用也都是通過bundle進行封裝的,只不過對應的bundle類型爲Application而已。Finder會把這個bundle當做一個文件顯示給我們,因爲這個bundle自身也是一個package,而Mac系統會把所有的package當做一個文件顯示給用戶,從而防止用戶誤操作導致程序文件損壞或丟失。
2.Classes文件夾,用來存放我們編寫的代碼,包括所有的Objective-C類,也可以通過創建子文件夾進行分類。該demo中包含兩個類:MapViewDemoViewController(視圖控制類)和MapViewDemoAppDelegate(應用程序代理類)。
在每一個IOS應用程序都有一個實現UIApplicationDelegate協議的AppDelegate類,用來通過從iOS接收消息的方式來跟蹤應用程序的狀態變化。如,在開始的時候就運行– applicationDidFinishLaunching方法,在結束的時候運行– applicationWillTerminate方法。它還可以讓你確定什麼時候接電話,或者什麼時候內存將滿等。
3.Other Sources文件夾,用來存放Objective—C類之外的源代碼文件。通常,它包含了MapViewDemo_Prefix.pch和main.m文件。
*.pch文件表示預編譯頭文件(precompiled header),包含了項目中所使用的來自外部框架的一組頭文件。Xcode會預編譯包含在此文件中的頭文件,以減少項目編譯時間。
main.m文件包含應用程序的main()方法,一般不需要修改。
4.Resources文件夾,用來存放應用程序的非代碼文件。如:應用程序圖標文件、圖片資源、聲音影片資源、文本文件等。
由於IOS應用程序在自己的沙盒中運行,因此需要將應用程序所需的文件資源保存在此處。
MapViewDemoViewController.xib文件是應用程序的界面視圖文件,可以使用Interface Builder(用於應用程序界面設計的工具)進行編輯,如拖放控件等。
MainWindow.xib是應用程序界面構建的主文件,默認不需要修改。
MapViewDemo-Info.plist包含應用程序相關配置信息的屬性列表。
Resources-iPad是構建iPad設備應用界面所需的文件。
5.Frameworks,是應用程序需要使用到的框架或者庫文件。可以包含代碼、圖像、聲音文件等資源,5中框出來的框架和庫就是MapViewDemo這個項目需要用的框架和庫文件。
其中*.a爲靜態庫、*.dylib爲動態庫。
該文件夾下添加的任何框架和庫都將連鏈接到應用程序中,並且代碼將能夠使用包含在該框架或者庫中的對象、函數和資源。
6.Products,存放項目編譯時生成的應用程序。
MapViewDemo.app是該項目的唯一產品,紅色表明無法找到該文件,需要連接設備編譯。
以上就是MapViewDemo這個項目包含的文件以及他們的作用,下面我們運行看看效果,在虛擬機中使用window鍵+R運行項目,效果如下圖
接下來,我們來看MapViewDemo中的代碼部分
每一個Objective-C類都包含兩部分,類聲明(*.h)和類實現(*.m)
其中,應用程序代理類MapViewDemoAppDelegate的聲明如下:
Objective-C中使用@interface和@end關鍵字來聲明一個類,以上MapViewDemoAppDelegate類是一個實現了實現UIApplicationDelegate協議的NSObject類,並定義了用於界面構建的輸出口UIWindow和視圖控制器MapViewDemoViewController。
#import表示頭文件包含,IBOutlet是輸出口關鍵字,retain、nonatomic跟內存管理相關。
關於Objective-C的語法後面專門來講,大家也可以參考網絡上關於Objective-C的資源。
MapViewDemoAppDelegate的實現
Objective-C中使用@implementation和@end關鍵字來實現一個類。
@synthesize關鍵字類似於對象的setter,getter 方法。
在應用程序入口applicationDidFinishLauching函數中,實現界面創建,使用addSubView的方法將視圖控制器中的界面元素添加到視圖中並設置顯示。
dealloc用於應用程序關閉時對象銷燬。
視圖控制器類的聲明
MapViewDemoViewController:UIViewController<AGSMapViewLayerDelegate>{}表明MapViewDemoViewController是繼承與視圖控制類,並實現了AGSMapViewLayerDelegate協議。AGSMapView、AGSDynamicMapServiceLayer等就是ArcGIS Runtime SDK提供的用於訪問ArcGIS的GIS功能的Objective-C類,類似於Flex等其他平臺的API的對象。
Objective-C中使用IBAction來聲明一個方法。
-(IBAction)opacitySliderValueChanged(id)sender;是MapViewDemoViewController類的一個方法,用於拖動滑塊改變動態圖層的透明度。
視圖控制器類實現
如果你使用過基於REST接口的ArcGIS API,是不是感覺非常熟悉呢,在IOS中這個接口的使用都是類似。
我們不難理解,在視圖創建完成後應用程序完成了切片圖層的初始化、動態圖層初始化以及在視圖中加載、投影、顯示範圍設置等操作。
-(IBAction) opacitySliderValueChanged:(id)sender{self.dynamicLayerView.alpha=((UISlider *)sende).value;}用於實現拖動滑塊改變圖層透明度的操作
-(void) mapViewDidLoad:(AGSMapView*)mapView{[self.mapview.gps.start];} 用於實現AGSMapViewLayerDelegate協議中的mapViewDidLoad:方法,作用就是在地圖加載完成後,開啓ArcGIS Runtime SDK自帶的GPS定位功能。
總結:本講主要向大家介紹ArcGIS Runtime SDK for iOS自帶例子的文件結構與代碼邏輯,下一講我們將給大介紹Objective-C語法基礎,歡迎大家繼續關注!