憋了一兩年終于要放大招了,我和幾位小伙伴編寫的《iOS開發:從零基礎到精通》這本書終于上市了,在此感謝和我一同完成這件事情的小伙伴們,他們是:湯海波、閆珍和李維佳,附上我們4個人的合影。
新書上市了,離不開大家的多多支持,本書的定價有點高,主要是貨真價實,一共800多頁,原價150元,網上一般打7.5折左右,但仍然比其他iOS的書要高一些,但我們給大家提供了全套的培訓視頻和案例代碼,每個小章節都有,一共有300-400個視頻,也算是良心之作了。
在此我代表所有的創作人員,感謝大家的支持,有興趣購買的同學可以到淘寶或者京東搜索:iOS開發從零基礎到入門,請認準下面的封面。同時也附上清華大學出版社在淘寶的官方購買鏈接,有興趣的同學多多支持正版!
今天申請了一個微信公眾號,有興趣的網友可以添加一下。
一直等到第一期所有的文章整理完畢才想起來需要給大家寫點什么,想到哪里,寫到哪里吧,隨性一些。
幾年前離開了工作近10年的知名IT企業,投身到互聯網教育領域,也是帶著一些情懷的,雖然我已不再如年輕人一樣年輕。之所以選擇互聯網教育,主要是看到成千上萬的莘莘學子把父母的辛苦錢扔給一些無良的培訓機構,因此我總是希望去做點什么,或者去改變點什么。年輕人懷揣著進入知名企業、月薪過萬的夢想進入培訓機構,等到真正開始找工作時,夢想卻被社會的現實無情的摧毀,年輕人的夢想不應該被欺騙、被踐踏!
我一直在思考,我應該如何去做?從事技術崗位,請拋棄一切不切實際的想法,腳踏實地的從零開始學習,我把自己的經驗總結出來,希望能夠帶領大家開始步入iOS開發的世界。經過學習,我希望大家能夠找到一份iOS開發實習的工作,并且具備繼續深入學習的能力,這一切都是建立在【免費】的基礎之上的,當然我非常歡迎大家可以與我分享自己學習的心得以及工作中的酸談苦辣。
由于我個人能力也有限,寫博客也是利用業余時間完成的,如果大家有發現存在錯誤的地方,歡迎隨時向我反饋,在此也謝謝大家,多多包涵。
希望與我聯系的可以加我的QQ或者給我發郵件:【3300170691@QQ.com】。
Objective-C語言的學習內容比較廣泛,但是對于入門iOS開發來說,只要掌握常用的一些操作即可。九九學院在此匯總在實際項目開發中必須掌握的OC基礎知識點,以饋廣大網友。
數據類型
OC數據類型:1-基本數據類型(int, float, char, BOOL)
OC數據類型:2-限定詞(long, long long, short, sunsigned, signed)
OC數據類型:3-id與instancetype
循環結構
OC循環結構:1-for循環
OC循環結構:2-forin循環
OC循環結構:3-其他循環方式
OC循環結構:4-break與continue
typedef語句
OC基礎:typedef語句
屬性Property
OC屬性property:1-屬性定義
OC屬性property:2-公共屬性與專有屬性
OC屬性property:3-屬性關鍵字
方法Method
OC方法Method:1-方法的定義
OC方法Method:2-方法的調用
OC方法Method:3-方法重寫override
對象Object
OC對象Object:1-創建對象
OC對象Object:2-對象操作
變量Variable
OC變量Variable:1-局部變量Local Variable
OC變量Variable:2-全局變量extern
OC變量Variable:3-靜態變量static
OC變量Variable:4-const關鍵字
Foundation框架簡介
Foundation框架簡介
數字對象
NSNumber基本使用
日期時間
NSDate類(日期時間)基本使用
文件操作
OC文件管理:1-NSFileManager類:文件操作
OC文件管理:2-NSFileManager類:目錄操作
OC文件管理:3-枚舉目錄中的內容
OC文件管理:4-文件內容讀取與寫入
NSURL類
NSURL類基本使用
NSBundle類
NSBundle類基本使用
Block塊
OC Block塊:1-Block簡介
OC Block塊:2-Block的簡單使用
OC Block塊:3-訪問Block之外定義的變量
OC Block塊:4-回調CallBack
OC Block塊:5-系統框架中的Block
分類Category
OC基礎知識:分類Category
協議Protocol
OC基礎:協議Protocol
OC基礎:代理(delegate)協議
KVC
KVC介紹:1 - 使用KVC進行賦值取值
KVC介紹:2 - setValuesForKeysWithDictionary字典轉模型
KVC介紹:3 - 修改readonly屬性以及私有屬性
對象復制
OC對象復制:1-深復制與淺復制
OC對象復制:2-可變對象與不可變對象復制
OC對象復制:3-自定義對象復制
內存管理
Objective-C內存管理
預處理
OC預處理:1-宏#define
OC預處理:2-條件指令編譯#if/#elif/#else/#ifdef/#ifndef
OC預處理:3-文件引用#include/#import/@class
NSLog()函數
NSLog()函數:1-基本使用
NSLog()函數:2-定制輸入日志的格式
結構struct
結構struct:1-結構的定義與基本使用
結構struct:2-結構的嵌套
UIKit框架簡介
UIKit框架簡介
UIView(視圖)
UIView詳解:1-UIView簡介
UIView詳解:2-視圖的外觀
UIView詳解:3-視圖的形變
UIView詳解:4-視圖的層次關系
UIView詳解:5-視圖的動畫
UIView詳解:6-響應用戶交互事件
UIView詳解:7-內容模式contentMode
UIView詳解:8-圖片拉伸
UIView詳解:9-使用代碼創建自定義UIView
UIView詳解:10-使用xib創建自定義UIView
UIView詳解:11-控件改變坐標系(convertRect:)
UITextField(輸入框)
UITextField詳解:1-UITextField的基本屬性
UITextField詳解:2-UITextField的代理方法簡介
UITextField詳解:3-UITextField的代理方法實例之鍵盤回收
UITextField詳解:4-UITextField的代理方法實例之字數限制
UILabel(文本框)
UILabel詳解:1-UILabel簡介
UILabel詳解:2-常用的UILabel使用場景
UIButton(按鈕)
UIButton:1-基本使用介紹
UIButton:2-按鈕的創建
UIButton:3-調整圖標與標題的位置
UIImageView(圖片視圖)
UIImageView控件:1-基本使用
UIImageView控件:2-常用操作
UIImageView控件:3-幀動畫功能
UIScrollView
UIScrollView滾動視圖:1-基本使用
UIScrollView滾動視圖:2-常用代理方法的實現
UIScrollView滾動視圖:3-視圖的縮放功能
UITableView
UITableView詳解:1-基本介紹
UITableView詳解:2-數據源方法
UITableView詳解:3-了解單元格(UITableViewCell)
UITableView詳解:4-表視圖創建示例
UITableView詳解:5-代理方法之點擊單元格
UITableView詳解:6-代理方法之編輯單元格
UITableView詳解:7-單元格(UITableViewCell)性能優化
UITableView詳解:8-分段(Section)
UITableView詳解:9-分段(Section)實例
UITableView詳解:10-自定義Cell
UITableView詳解:11-Cell高度的設置
UITableView詳解:12-動態調整Cell高度(self-sizing)
UITableView詳解:13-動態調整Cell高度(代碼)
UITableView詳解:14-UITableView+FDTemplateLayoutCell計算Cell高度
UITableView詳解:15-改變Cell位置
UITableView詳解:16-UITableView的Header與Footer
UITableView詳解:17-去除多余的單元格分割線
UICollectionView
UICollectionView詳解:1-集合視圖簡介
UICollectionView詳解:2-數據源協議DataSource
UICollectionView詳解:3-最簡單的集合視圖實現
UICollectionView詳解:4-代理協議方法簡介
UICollectionView詳解:5-代理方法實例
UICollectionView詳解:6-UICollectionViewFlowLayout簡介
UICollectionView詳解:7-UICollectionViewFlowLayout使用示例
UICollectionView詳解:8-UICollectionViewDelegateFlowLayout類的代理方法實現
UICollectionView詳解:9-自定義Cell
UIGestureRecognizer手勢
UIGestureRecognizer手勢 : 1-概要介紹
UIGestureRecognizer手勢 : 2-點擊手勢
UIGestureRecognizer手勢 : 3-捏合手勢與旋轉手勢
UIGestureRecognizer手勢 : 4-滑動手勢
UIGestureRecognizer手勢 : 5-拖動手勢
UIGestureRecognizer手勢 : 6-長按手勢
UIViewController
UIViewController介紹:1-控制器簡介以及創建控制器
UIViewController介紹:2-使用xib以及Storyboard創建控制器
UIViewController介紹:3-控制器的生命周期
UIViewController介紹:4-使用代碼切換控制器
UIViewController介紹:5-使用StoryBoard切換控制器
UIViewController介紹:6-控制器嵌套
UINavigationController
UINavigationController介紹:1-導航控制器簡介
UINavigationController介紹:2-控制器跳轉
UINavigationController介紹:3-子控制器的管理
UINavigationController介紹:4-UINavigationBar
UINavigationController介紹:5-barStyle屬性
UINavigationController介紹:6-barTintColor與tintColor
UINavigationController介紹:7-導航欄設置背景圖片
UINavigationController介紹:8-UINavigationItem
UINavigationController介紹:9-UINavigationItem定制示例
UINavigationController介紹:10-UINavigationItem顯示原始圖片樣式
UINavigationController介紹:11-代理方法
UINavigationController介紹:12-順傳數據(源VC->目標VC)
UINavigationController介紹:13-使用代理逆傳數據(目標VC->源VC)
UINavigationController介紹:14-使用通知逆傳數據(目標VC->源VC)
UINavigationController介紹:15-使用Block逆傳數據(目標VC->源VC)
UINavigationController介紹:16-toolbar(工具欄)
UITabbarController
UITabBarController介紹:1-UITabBarController常用屬性和方法
UITabBarController介紹:2-UITabBar的常用屬性和方法
UITabBarController介紹:3-UITabBarItem的常用屬性和方法
UITabBarController介紹:4-微信TabBar實現
UITabBarController介紹:5-UITabBarController的代理協議
WKWebView
WKWebView詳解:1-WKWebView簡介
WKWebView詳解:2-WKWebView的基本使用--加載網頁
WKWebView詳解:3-網頁瀏覽控制
WKWebView詳解:4-加載本地文件
WKWebView詳解:5-WKWebView代理協議之WKNavigationDelegate
WKWebView詳解:6-WKWebView代理協議之WKUIDelegate
UIPageControl
UIPageControl詳解:1-UIPageControl介紹
UIPageControl詳解:2-UIPageControl實際應用
UITextView
UITextView詳解:1-UITextView的基本屬性
UITextView詳解:2-UITextView的代理方法
UIPickerView
UIPickerView詳解:1-UIPickerView簡介
UIPickerView詳解:2-UIPickerView的基本使用
UIPickerView詳解:3-相互依賴的多列選擇器
UISegmentedControl
UISegmentedControl詳解:1-UISegmentedControl簡介
UISegmentedControl詳解:2-UISegmentedControl實例
UIDatePicker
UIDatePicker詳解:1-UIDatePicker基本介紹
UIDatePicker詳解:2-UIDatePicker基本使用
UIDatePicker詳解:3-UIDatePicker應用之倒計時器
NSThread
線程(Thread)基礎知識
GCD
GCD使用介紹:1-基本概念介紹
GCD使用介紹:2-隊列與任務的組合
GCD使用介紹:3-線程間通信
GCD使用介紹:4-隊列組dispatch group
GCD使用介紹:5-延遲執行操作
NSOperation
NSOperation:1-基本使用
NSOperation:2-線程間通信
NSOperation:3-任務間的執行依賴
網絡相關基礎知識
iOS開發之網絡編程:1-網絡開發基本概念介紹
iOS開發之網絡編程:2-常用網絡協議之HTTP
iOS開發之網絡編程:3-網絡請求之GET、POST請求簡介
第三方框架介紹
iOS開發之網絡編程:4-AFNetworking介紹
iOS開發之網絡編程:5-聚合數據API用法簡介
iOS開發之網絡編程:6-POST請求和GET請求實例
網絡高級知識
iOS開發之網絡編程:7-JSON和XML簡單介紹
iOS開發之網絡編程:8-網絡狀態監測之Reachability的使用
iOS開發之網絡編程:9-常用網絡內部類之NSURLConnection
iOS開發之網絡編程:10-常用網絡內部類之NSURLSession
iOS開發之網絡編程:11-NSURLSession的簡單使用
沙盒SandBox
沙盒SandBox:1-沙盒基礎
沙盒SandBox:2-在Mac上查看沙盒的目錄
Plist文件
Plist文件操作:1-Plist簡介
Plist文件操作:2-Plist文件的讀取
Plist文件操作:3-Plist文件的寫入
Plist文件操作:4-操作實例
偏好設置 NSUserDefaults
偏好設置(NSUserDefaults):1-簡介
偏好設置(NSUserDefaults):2-讀寫示例
歸檔NSKeyedArchiver/解檔NSKeyedUnarchiver
歸檔:1-簡介
歸檔:2-單個對象歸檔/解檔
歸檔:3-自定義對象歸檔/解檔
歸檔:4-歸檔多個自定義對象
歸檔:5-子類對象的歸檔
歸檔:6-歸檔多個不同類型的對象
SQLite&FMDB
SQLite入門:1-數據庫的操作
SQLite入門:2-表的操作
SQLite入門:3-數據記錄的操作
FMDB:1-基本介紹
FMDB:2-更新操作與查詢操作
FMDB:3-線程安全(FMDatabaseQueue)
CoreData
Core Data入門:1-概念簡介
Core Data入門:2-使用示例
Realm
Realm介紹:1-Realm基本介紹
Realm介紹:2-Realm的安裝
Realm介紹:3-常用屬性與方法
Realm介紹:4-Realm使用示例
核心繪圖CoreGraphics
繪圖CoreGraphics:1-基本概念
繪圖CoreGraphics:2-貝塞爾路徑(UIBezierPath)
繪圖CoreGraphics:3-繪圖方法和步驟
繪圖CoreGraphics:4-常見圖形的繪制方法
UIImage繪圖應用
UIImage與繪圖:1-繪制圖片
UIImage與繪圖:2-添加水印
UIImage與繪圖:3-裁剪圓形圖片
UIImage與繪圖:4-截屏
CALayer類
CALayer介紹:1-CALayer簡介
CALayer介紹:2-iOS開發中的坐標系
CALayer介紹:3-動畫屬性
CoreAnimation框架
核心動畫CoreAnimation:1-簡介
核心動畫CoreAnimation:2-動畫的實現步驟
核心動畫CoreAnimation:3-CAPropertyAnimiation屬性動畫
核心動畫CoreAnimation:4-CABasicAnimiation基本動畫
核心動畫CoreAnimation:5-CAKeyframeAnimation關鍵幀動畫
核心動畫CoreAnimation:6-CASpringAnimation彈簧動畫
核心動畫CoreAnimation:7-CAAnimationGroup動畫組
核心動畫CoreAnimation:8-CATransition轉場動畫
Auto Layout : 1-自動布局簡介
Auto Layout : 2-Masonry
CoreLocation框架
定位服務:1-CoreLocation框架的基本介紹
定位服務:2-CoreLocation框架的基本使用
定位服務:3-地理信息編碼簡介
定位服務:4-CLGeocoder應用案例1
定位服務:5-CLGeocoder應用案例2
MapKit框架
Mapkit框架:1-MKMapView簡介
MapKit框架:2-MKMapView的基本使用
MapKit框架:3-簡易地圖標注
MapKit框架:4-簡易地圖標注示例
MapKit框架:5-復雜地圖標注(MKAnnotationView)
MapKit框架:6-復雜地圖標注示例
UIDevice類
UIDevice類:1-獲取設備基本信息
UIDevice類:2-獲取電池信息batteryState
UIDevice類:3-接近傳感器proximityState
UIDevice類:4-方向傳感器orientation
CoreMotion框架
CoreMotion框架:1-基本介紹
CoreMotion框架:2-獲取運動傳感器的裸數據(Raw Data)
CoreMotion框架:3-CMDeviceMotion
相機與相冊
相機與相冊的調用:1-UIImagePickerController簡介
相機與相冊的調用:2-UIImagePickerController的使用
推送證書管理
iOS推送證書:1-推送調試證書
iOS推送證書:2-推送生產證書
App Store應用發布
App Store應用發布詳解
App被拒絕上架的原因解析
遠程消息推送
遠程消息推送:1-極光(JPush)消息推送集成
遠程消息推送:2-獲取推送消息內容
遠程消息推送:3-打開指定界面(自定義消息內容)
遠程消息推送:4-管理App的Badge(本地方式)
遠程消息推送:5-管理App的Badge(遠程服務器方式)
遠程消息推送:6-更改推送消息提示音
本地消息推送
本地消息推送(基于iOS10 UserNotifications框架):1-UNNotificationRequest類
本地消息推送(基于iOS10 UserNotifications框架):2-UNNotificationContent類
本地消息推送(基于iOS10 UserNotifications框架):3-UNNotificationTrigger類
本地消息推送(基于iOS10 UserNotifications框架):4-UNUserNotificationCenterDelegate代理協議
本地消息推送(基于iOS10 UserNotifications框架):5-代碼示例
短信驗證碼
免費短信驗證碼:mob短信驗證碼SDK
高德地圖SDK
高德地圖SDK:1-高德地圖簡介
高德地圖SDK:2-高德地圖SDK的安裝
高德地圖SDK:3-地圖SDK簡介
高德地圖SDK:4-繪制地圖標注
高德地圖SDK:5-定位SDK
SDWebImage
網絡圖片下載SDK:SDWebImage
MJRefresh
MJRefresh的使用:下拉刷新與上拉加載
MBProgressHUD
MBProgressHUD:1-簡介
MBProgressHUD:2-基本使用
友盟U-Share
友盟 U-Share SDK:1-使用前準備
友盟 U-Share SDK:2-第三方登錄
友盟 U-Share SDK:3-社會化分享
Charles--網絡抓包工具
Charles使用介紹:1-抓取HTTP請求(基礎)
Charles使用介紹:2-抓取HTTPS請求(高級)
GitHub
GitHub:1-GitHub簡介
GitHub:2-GitHub Desktop桌面工具的安裝
GitHub:3-創建倉庫:Github For Mac 客戶端
GitHub:4-版本控制
GitHub:5-分支branch操作
GitHub:6-沖突處理
GitHub:7-團隊合作(GitHub Flow)
Swift: 1 Swift簡介
Swift: 2 常量和變量
Swift: 3 運算符
Swift: 4 字符串和字符
Swift: 5.1 集合類型-數組
Swift: 5.2 集合類型-集合
Swift: 5.3 集合類型-字典
Swift: 6.1 語句和流程控制--循環語句
Swift: 6.2 語句和流程控制--分支條件語句
Swift: 6.3 語句和流程控制--控制轉移語句
Swift: 7.1 函數基礎
Swift: 7.2 函數類型和嵌套函數
Swift: 8 閉包
Swift: 9 枚舉
Swift:10 類和結構體
Swift:11 屬性
Swift:12 方法
Swift:13 下標
Swift:14 繼承
Swift:15 初始化
Swift:16 析構
Swift:17 擴展
Swift:18 協議
Swift:19 泛型
Swift:20 可選鏈
React Native基礎:1-搭建React Native開發環境
React Native基礎:2-編寫Hello World
React Native基礎:3-屬性Props
React Native基礎:4-狀態State
React Native基礎:5-樣式style
React Native基礎:6-界面布局
React Native基礎:7-網絡
React Native基礎:8-Text組件
React Native基礎:9-Image組件
React Native基礎:10-Button組件
React Native基礎:11-TouchableHighlight組件
React Native基礎:12-TextInput組件
React Native基礎:13-KeyboardAvoidingView組件
React Native基礎:14-ScrollView組件
React Native基礎:15-ListView組件
React Native基礎:16-Navigator組件
React Native基礎:17-TabBarIOS組件
GitHub除了能夠對版本進行管理之外,更加重要的價值在于團隊協作,絕大多數軟件項目都不是一個人獨立完成的,而是需要團隊合作,在團隊合作中建立一套高效的協作方式就變得尤為重要。Github Flow是Github 多年來總結出來一套自己的團隊協作流程,簡單而且強大,網站上的各個功能都是圍繞著這個流程來開發的。
GitHub Flow包含有如下五個標準環節:
接下來我們通過一個實際的示例展示一下GitHub Flow的整個過程。
首先,在我們的本地倉庫中,使用GitHub客戶端創建一個名稱為“修改README”的分支。
修改README.md文件,在GitHub客戶端中,我們可以查看修改的內容,然后提交到當前分支。
發起一個Pull Request,點擊GitHub客戶端右上角的【Pull Request】按鈕,發起PR。在提交PR的界面,我們可以選擇希望合并的分支。如下圖所示,我們希望把“修改README”分支合并到master分支上。
假如該項目還有一個開發者,在GitHub的Web端就可以看到其他開發者發起的PR,并且可以查看該PR中涉及的代碼修改內容,并給出自己的評論。如果審核通過,可以點擊【Merge pull request】按鈕,合并到master分支上。
合并成功后,我們可以看到合并結果,并且可以點擊【Delete branch】按鈕刪除分支。
Reveal是一款可以在iOS開發過程中用于界面控件分析的開發輔助工具。借助Reveal,我們可以對App界面上的所有可見元素進行分析。在開發過程中,經常會出現界面展示的樣式與預期不符的情況,Reveal可以輔助我們進行故障定位。
我們可以到Reveal的官方網站(https://revealapp.com/)下載最新的版本。Reveal為我們提供了14天免費試用的版本,需要在注冊界面提供我們的郵箱地址,即可收到一封包含試用激活碼的郵件,試用期結束后可以購買正式版本。
Reveal的安裝推薦使用CocoaPods,當然我們也可以使用手工方式安裝,但手工安裝的步驟非常繁雜,涉及到多步操作,因此推薦使用CocoaPods。
target 'YourMainAppTargetName' do
pod 'Reveal-SDK', :configurations => ['Debug']
end
cd [Podfile所在目錄]
pod install
Reveal安裝完畢后,點擊.xcworkspace文件打開工程,運行程序后,我們可以在Xcode的日志窗口中看到如下提示,說明Reveal已經部署成功。
此時,打開Reveal應用,Reveal可以自動查詢可以分析的App應用。
選中需要分析的App即可打開分析窗口。在分析窗口中,我們可以查看當前App界面中顯示的所有控件信息。
在實際的App開發中,界面顯示的圖片除了少量的本地圖片外,絕大多數圖片都需要通過網絡從服務器下載。對于網絡圖片下載的處理邏輯需要考慮諸多因素,例如網絡傳輸因素、圖片緩存等,通常情況下我們都會使用SDWebImage來完成網絡圖片的下載。本節簡單介紹一下SDWebImage的基本使用,全球超過90%的App都會存在SDWebImage的身影。
從Github中搜索關鍵字:SDWebImage,即可找到SDWebImage的版本倉庫;
SDWebImage的安裝支持使用CocoaPods、Carthage以及手工方式安裝,以CocoaPods為例,需要在工程的Podfile文件中添加如下內容,然后更新下載即可。
platform :ios, '7.0'
pod 'SDWebImage', '~>3.8'
SDWebImage是對UIImageView類增加了分類。在需要使用圖片下載的類中,引用SDWebImage頭文件即可對UIImageView對象使用擴展的方法。
#import <SDWebImage/UIImageView+WebCache.h>
SDWebImage提供了極其簡單的方法用于下載網絡圖片,最簡單的情況下,只要提供圖片素材的URL即可。SDWebImage提供的常見下載圖片方法如下:
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
SDWebImage提供了緩存機制,即下載過的圖片,當需要再次顯示時,SDWebImage會優先從緩存中查找是否有存儲圖片。SDWebImage使用的緩存即包括在內存中的緩存,也包括在應用沙盒中的緩存(硬盤中的緩存)。緩存機制的存在一方面加快了圖片下載的速度,為用戶節省了流量,但另外一方面也會帶來存儲空間的浪費,因此在SDWebImage中,也提供了用于緩存管理的類--SDImageCache。在SDImageCache類中,提供了如下幾個常用的方法。
@property (assign, nonatomic) NSUInteger maxMemoryCost;
@property (assign, nonatomic) NSUInteger maxCacheSize;
@property (assign, nonatomic) NSInteger maxCacheAge;
- (void)clearMemory;
- (void)clearDisk;
- (void)cleanDisk;
高德定位SDK提供了不依賴于地圖定位的定位功能,開發者可以無地圖顯示的場景中便捷地為應用程序添加定位功能。定位SDK提供了單次定位、連續定位、逆地理信息、地理圍欄等功能。
本節以單次定位為例介紹一下高德定位SDK的使用方法。定位SDK提供的單次定位方法基于蘋果定位核心,蘋果定位核心會在設備移動時連續返回定位結果,高德在此基礎上封裝了單次定位。當設備可以正常聯網時,還可以返回該定位點的對應的中國境內位置信息(包括:省、市、區/縣以及詳細地址)。
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
[AMapServices sharedServices].apiKey =@"您的key";
-(AMapLocationManager *)locationManager{
if (_locationManager == nil) {
_locationManager = [[AMapLocationManager alloc] init];
// 帶逆地理信息的一次定位(返回坐標和地址信息)
[_locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
// 定位超時時間,最低2s,此處設置為2s
_locationManager.locationTimeout =2;
// 逆地理請求超時時間,最低2s,此處設置為2s
_locationManager.reGeocodeTimeout = 2;
}
return _locationManager;
}
調用AMapLocationManager類的requestLocationWithReGeocode:completionBlock: 方法,請求一次定位。另外,在聯網條件下,還可以選擇在一次定位時是否返回地址信息。以下是請求帶逆地理信息的一次定位,代碼如下:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// 帶逆地理(返回坐標和地址信息)。將下面代碼中的 YES 改成 NO ,則不會返回地址信息。
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
if (error)
{
NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
if (error.code == AMapLocationErrorLocateFailed)
{
return;
}
}
NSLog(@"location:%@", location);
if (regeocode)
{
NSLog(@"reGeocode:%@", regeocode);
}
}];
}
同MapKit框架類似,使用高德地圖SDK也可以在地圖上添加標注。標注可以精確表示用戶需要展示的位置信息,高德地圖SDK提供的標注功能允許用戶自定義圖標和信息窗,同時提供了標注的點擊、拖動事件的回調。高德地圖SDK提供的地圖標注為MAAnnotation類,不同的標記可以根據圖標和改變信息窗的樣式和內容加以區分。
高德地圖SDK提供的大頭針標注MAPinAnnotationView,通過它可以設置大頭針顏色、是否顯示動畫、是否支持長按后拖拽大頭針改變坐標等。在地圖上添加大頭針標注的步驟如下:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
//添加大頭針
MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
pointAnnotation.coordinate = CLLocationCoordinate2DMake(32.03522, 118.74237);
pointAnnotation.title = @"侵華日軍南京大屠殺遇難同胞紀念館";
pointAnnotation.subtitle = @"水西門大街418號";
[self.mapView addAnnotation:pointAnnotation];
self.mapView.centerCoordinate = pointAnnotation.coordinate;
}
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id <MAAnnotation>)annotation
{
if ([annotation isKindOfClass:[MAPointAnnotation class]])
{
static NSString *pointReuseIndentifier = @"pointReuseIndentifier";
MAPinAnnotationView*annotationView = (MAPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
if (annotationView == nil)
{
annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndentifier];
}
annotationView.canShowCallout= YES; //設置氣泡可以彈出,默認為NO
annotationView.animatesDrop = YES; //設置標注動畫顯示,默認為NO
annotationView.draggable = YES; //設置標注可以拖動,默認為NO
annotationView.pinColor = MAPinAnnotationColorPurple;
return annotationView;
}
return nil;
}
運行后,可以在地圖上展示地圖標注。
高德地圖所提供的SDK中,地圖SDK是用于提供地圖展示相關功能的SDK,其可以提供地圖顯示(含室內、室外地圖)、與地圖交互、在地圖上繪制、興趣點搜索、地理編碼、離線地圖等功能。
MAMapView類是高德地圖提供的用于展示地圖的類,其與MapKit框架中的MKMapView功能是類似的,但其提供的功能更加強大。在MAMapView類中,提供了如下一些比較常用的屬性和方法。
@property (nonatomic) MAMapType mapType;
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
@property (nonatomic) MACoordinateRegion region;
@property (nonatomic) BOOL showsUserLocation;
- (void)addAnnotation:(id <MAAnnotation>)annotation;
下方的示例代碼創建了一個MAMapView,并顯示在屏幕上。
引入高德地圖頭文件。
#import <MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
在viewDidLoad方法中,創建MAMapView。
- (void)viewDidLoad {
[super viewDidLoad];
//實例化MAMapView對象
MAMapView *mapView = [[MAMapView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
//設置代理
mapView.delegate = self;
//設置地圖類型
mapView.mapType = MAMapTypeStandard;
//定位以后改變地圖的圖層顯示。
[mapView setUserTrackingMode: MAUserTrackingModeFollow animated:YES];
//添加到控制器view上
[self.view addSubview:mapView];
}
運行結果如下:
CocoaPods安裝完畢后,我們就可以通過CocoaPods來安裝第三方庫了。使用CocoaPods為一個工程安裝第三方庫,需要按照如下步驟進行。
在工程目錄中,創建Podfile文件。使用終端命令行工具,在工程所在的目錄,添加一個名稱為Podfile的空文件。使用的命令如下:
$ touch Podfile
使用vim命令編輯Podfile,在Podfile中添加需要安裝的第三方庫名稱,我們以添加一個名為AMap3DMap的庫以及一個名為AMapLocation的庫為例,使用:wq保存文件內容。
platform :ios, '7.0' #手機的系統
target 'Location' do #工程名字
pod 'AMap3DMap' #3D地圖 SDK
pod 'AMapLocation' #定位SDK
end
當我們需要為多個Target導入不同的庫時,也可以在Podfile中針對不同的Target做不同的設置。
執行下列命令進行配置并安裝第三方庫.
pod repo update
pod install
安裝命令執行成功后,在工程目錄中,會生成.xcworkspace 文件,打開.xcworkspace 文件以啟動工程,原.xcodeproj文件不再使用。
若希望升級已安裝的第三方庫到最新版本,可以在Podfile文件的目錄中執行如下命令:
pod repo update
pod update
使用指定版本 SDK,需要修改 Podfile 文件,添加版本相關信息,其文件內容如下:
platform :ios, '7.0'
target 'Location' do
pod 'AMap3DMap', '~>4.4.1' #此處指定版本號
end
然后再執行如下命令:
pod repo update
pod install
CocoaPods是iOS開發中最常使用的第三方開源庫管理工具。如果不使用CocoaPods,我們在iOS開發過程中使用的第三方庫需要手工進行安裝以及更新,并且需要手工來設置各個第三方庫所需的系統依賴。在我們有了CocoaPods這個工具之后,只需要將用到的第三方開源庫放到一個名為Podfile的文件中,然后在命令行執行安裝命令,CocoaPods就會自動將這些第三方開源庫的源碼下載下來,并且為我們的工程設置好相應的系統依賴和編譯參數。
在Mac電腦上安裝CocoaPods,需要按照如下步驟進行。
rvm install ruby-2.3.0
rvm 2.3.0 --default
使用默認的 Ruby 的軟件源(https://rubygems.org/)會因為網絡原因無法訪問,造成 CocoaPods 安裝失敗,因此需要更新一下 ruby 的源。依次在終端中執行如下命令:
gem sources -l #(查看當前ruby的源)
gem sources --remove https://rubygems.org/ #(移除當前ruby的源)
gem sources -a https://gems.ruby-china.org/ #(設置當前ruby源為國內源)
gem sources -l #(再次查看當前ruby的源)
顯示如下文字表示更新成功。
*** CURRENT SOURCES ***
https://gems.ruby-china.org
sudo gem update --system
gem -v
sudo gem install -n /usr/local/bin cocoapods
pod setup
pod --version
本節的示例代碼,在MKMapView上實現了添加自定義樣式的地圖標注,該地圖標注的圖標使用自定義圖片,點擊圖標后,可以在附加視圖的左右兩側各添加一個按鈕。
在進行地圖標注樣式定制之前,需要提前完成如下代碼的編寫:
使用自定義樣式的地圖標注,需要在MKMapViewDelegate代理協議中的mapView:viewForAnnotation:方法中完成。
- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
MKAnnotationView *customAnnotationView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if (customAnnotationView == nil){
customAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
}
//設置標注的圖片
customAnnotationView.image = [UIImage imageNamed:@"99logo"];
//設置點擊標注可以顯示更多信息
customAnnotationView.canShowCallout = YES;
//右側按鈕定制
UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
rightButton.backgroundColor = [UIColor redColor];
[rightButton setTitle:@"前往" forState:UIControlStateNormal];
customAnnotationView.rightCalloutAccessoryView = rightButton;
//左側按鈕定制
UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
leftButton.backgroundColor = [UIColor blueColor];
[leftButton setTitle:@"詳情" forState:UIControlStateNormal];
customAnnotationView.leftCalloutAccessoryView = leftButton;
return customAnnotationView;
}
return nil;
}
運行后,我們可以看到地圖標注的樣式如下所示:
https://github.com/99ios/17.3.6
上一節的示例代碼演示了使用CLGeocoder類進行地址到經緯度的轉換,本節我們來完成從經緯度到地址的反向轉換過程。
新建一個Single View Application工程,并導入CoreLocation框架,操作方法參見前面章節。
在Storyboard中,搭建如下的界面,用于輸入經緯度信息,并且可以顯示對應的地址信息。建立控件與控制器類之間的連線,添加屬性以及按鈕的點擊方法。
在控制器類中,添加一個CLGeocoder類的屬性,并對其進行簡單的初始化操作。
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *lngTextField;//經度
@property (weak, nonatomic) IBOutlet UITextField *latTextField;//緯度
@property (weak, nonatomic) IBOutlet UITextField *addressTextField;//地址
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;//名稱
@property (nonatomic,strong)CLGeocoder *geocoder;
@end
- (CLGeocoder *)geocoder {
if (_geocoder == nil) {
_geocoder = [[CLGeocoder alloc] init];
}
return _geocoder;
}
在【獲取經緯度的地址名稱】按鈕的點擊方法中,添加如下代碼,實現根據用戶輸入的經緯度獲取該經緯度對應的地址名稱,并顯示到界面上。
- (IBAction)reverseGeocode:(id)sender {
double latitude = [self.latTextField.text doubleValue];
double longitude = [self.lngTextField.text doubleValue];
CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
[self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if ([placemarks count] > 0) {
//返回描述信息
CLPlacemark *placemark = placemarks[0];
//獲取所需信息
NSString *country = placemark.country;
NSString *area = placemark.administrativeArea;
NSString *city = placemark.locality;
NSString *street = placemark.thoroughfare;
//在textView上面顯示
self.addressTextField.text = [NSString stringWithFormat:@"%@ %@ %@ %@",country,area,city,street];
self.nameTextField.text = placemark.name;
}
}];
}
運行效果如下所示,當我們輸入經緯度信息后,點擊按鈕,即可顯示該經緯度對應的地址信息。
https://github.com/99ios/17.2.5