九九學堂 http://www.346p.cn/ zh-CN 一位iOS開發布道者的個人博客,致力于提供一個開源免費的iOS學習平臺。 Fri, 11 Aug 2017 04:13:56 +0000 Fri, 11 Aug 2017 04:13:56 +0000 網站公告 http://www.346p.cn/index.php/archives/3489/ http://www.346p.cn/index.php/archives/3489/ Tue, 14 Mar 2017 08:58:00 +0000 99ios 2018年3月28日

憋了一兩年終于要放大招了,我和幾位小伙伴編寫的《iOS開發:從零基礎到精通》這本書終于上市了,在此感謝和我一同完成這件事情的小伙伴們,他們是:湯海波、閆珍和李維佳,附上我們4個人的合影。

新書上市了,離不開大家的多多支持,本書的定價有點高,主要是貨真價實,一共800多頁,原價150元,網上一般打7.5折左右,但仍然比其他iOS的書要高一些,但我們給大家提供了全套的培訓視頻和案例代碼,每個小章節都有,一共有300-400個視頻,也算是良心之作了。

在此我代表所有的創作人員,感謝大家的支持,有興趣購買的同學可以到淘寶或者京東搜索:iOS開發從零基礎到入門,請認準下面的封面。同時也附上清華大學出版社在淘寶的官方購買鏈接,有興趣的同學多多支持正版!

購買鏈接:https://qhdx.tmall.com/shop/view_shop.htm?spm=a230r.1.14.160.689265a3NVYxdb&user_number_id=1614846122

2017年8月7日

今天申請了一個微信公眾號,有興趣的網友可以添加一下。

2017年3月14日

一直等到第一期所有的文章整理完畢才想起來需要給大家寫點什么,想到哪里,寫到哪里吧,隨性一些。

幾年前離開了工作近10年的知名IT企業,投身到互聯網教育領域,也是帶著一些情懷的,雖然我已不再如年輕人一樣年輕。之所以選擇互聯網教育,主要是看到成千上萬的莘莘學子把父母的辛苦錢扔給一些無良的培訓機構,因此我總是希望去做點什么,或者去改變點什么。年輕人懷揣著進入知名企業、月薪過萬的夢想進入培訓機構,等到真正開始找工作時,夢想卻被社會的現實無情的摧毀,年輕人的夢想不應該被欺騙、被踐踏!

我一直在思考,我應該如何去做?從事技術崗位,請拋棄一切不切實際的想法,腳踏實地的從零開始學習,我把自己的經驗總結出來,希望能夠帶領大家開始步入iOS開發的世界。經過學習,我希望大家能夠找到一份iOS開發實習的工作,并且具備繼續深入學習的能力,這一切都是建立在【免費】的基礎之上的,當然我非常歡迎大家可以與我分享自己學習的心得以及工作中的酸談苦辣。

由于我個人能力也有限,寫博客也是利用業余時間完成的,如果大家有發現存在錯誤的地方,歡迎隨時向我反饋,在此也謝謝大家,多多包涵。


希望與我聯系的可以加我的QQ或者給我發郵件:【3300170691@QQ.com】。


]]>
0 http://www.346p.cn/index.php/archives/3489/#comments http://www.346p.cn/index.php/feed/archives/3489/
Objective-C語言入門教程 http://www.346p.cn/index.php/archives/3196/ http://www.346p.cn/index.php/archives/3196/ Mon, 15 Aug 2016 09:54:00 +0000 99ios

Objective-C語言的學習內容比較廣泛,但是對于入門iOS開發來說,只要掌握常用的一些操作即可。九九學院在此匯總在實際項目開發中必須掌握的OC基礎知識點,以饋廣大網友。

數據類型與運算

類、方法與對象

Foundation框架

Objective-C特性

Objective-C進階


]]>
0 http://www.346p.cn/index.php/archives/3196/#comments http://www.346p.cn/index.php/feed/archives/3196/
【iOS10】開發入門教程匯總 http://www.346p.cn/index.php/archives/3259/ http://www.346p.cn/index.php/archives/3259/ Mon, 31 Oct 2016 09:32:00 +0000 99ios 寫在開始之前

基礎UI控件

高級UI控件

控制器

其他控件


]]>
0 http://www.346p.cn/index.php/archives/3259/#comments http://www.346p.cn/index.php/feed/archives/3259/
【iOS10】開發進階教程匯總 http://www.346p.cn/index.php/archives/3254/ http://www.346p.cn/index.php/archives/3254/ Mon, 31 Oct 2016 09:33:00 +0000 99ios 多線程

網絡

持久化

繪圖與動畫

自動布局

Auto Layout : 1-自動布局簡介
Auto Layout : 2-Masonry

位置和地圖

設備調用

證書管理與應用發布

消息推送

其他高級知識點


]]>
0 http://www.346p.cn/index.php/archives/3254/#comments http://www.346p.cn/index.php/feed/archives/3254/
【iOS10】常用第三方工具與SDK使用教程匯總 http://www.346p.cn/index.php/archives/3443/ http://www.346p.cn/index.php/archives/3443/ Thu, 08 Dec 2016 03:16:00 +0000 99ios 常用第三方框架

常用輔助工具


]]>
0 http://www.346p.cn/index.php/archives/3443/#comments http://www.346p.cn/index.php/feed/archives/3443/
【Swift+ReactNative】基礎語法教程匯總 http://www.346p.cn/index.php/archives/3529/ http://www.346p.cn/index.php/archives/3529/ Tue, 25 Jul 2017 00:15:00 +0000 99ios 【Swift】基礎語法教程匯總

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】基礎語法教程匯總

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組件


]]>
0 http://www.346p.cn/index.php/archives/3529/#comments http://www.346p.cn/index.php/feed/archives/3529/
GitHub:7-團隊合作(GitHub Flow) http://www.346p.cn/index.php/archives/3568/ http://www.346p.cn/index.php/archives/3568/ Fri, 11 Aug 2017 04:13:56 +0000 99ios GitHub Flow簡介

GitHub除了能夠對版本進行管理之外,更加重要的價值在于團隊協作,絕大多數軟件項目都不是一個人獨立完成的,而是需要團隊合作,在團隊合作中建立一套高效的協作方式就變得尤為重要。Github Flow是Github 多年來總結出來一套自己的團隊協作流程,簡單而且強大,網站上的各個功能都是圍繞著這個流程來開發的。

GitHub Flow包含有如下五個標準環節:

  • 第一步,創建分支。

  • 第二步,創建新版本,即多個commit。

  • 第三步,發起“拉取請求”(Pull Request)。這里提到了一個新的概念Pull Request(簡稱PR)。PR 在整個 Github Flow 流程中占有核心位置, PR 的目的就是討論,或者說是邀請項目成員進行代碼審核,經過討論無誤后,代碼可以合并到master版本中。

  • 第四步,討論和代碼審核。一旦開啟了一個 Pull Request,審核你修改的人或團隊會來提出問題和評論。有可能是代碼風格符不符合項目規范, 也或者代碼忘了單元測試,也可能各方面都沒問題。Pull Request 就是為了鼓勵這種類型的討論而設計的。每一個 PR 都是開發歷史上的一次小事件,很長時間過去之后,再看看當時的 PR 就可以看到當時為什么要開發這個功能,大家都是什么意見,都寫了哪些代碼,所以是項目發展的珍貴資料。從這個角度來說,即使一個 PR 沒有被 merge 進 master ,那它里面的代碼和討論的內容也會是非常有意義的嘗試,也可能在未來會有很大的參考價值。

  • 第五步,合并分支。一旦大家審核了你的 Pull Request 并且所有代碼通過了測試,就是可以把你的代碼合并到主分支了。一旦合并之后,Pull Request 會保留代碼的歷史修改記錄。因為它們是可搜索的,它們讓人可以回到過去,去理解為什么做這個決定以及怎樣做的決定。

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】按鈕刪除分支。


]]>
0 http://www.346p.cn/index.php/archives/3568/#comments http://www.346p.cn/index.php/feed/archives/3568/
Reveal:1-Reveal使用簡介 http://www.346p.cn/index.php/archives/3567/ http://www.346p.cn/index.php/archives/3567/ Fri, 11 Aug 2017 04:10:00 +0000 99ios

Reveal是一款可以在iOS開發過程中用于界面控件分析的開發輔助工具。借助Reveal,我們可以對App界面上的所有可見元素進行分析。在開發過程中,經常會出現界面展示的樣式與預期不符的情況,Reveal可以輔助我們進行故障定位。

Reveal的下載

我們可以到Reveal的官方網站(https://revealapp.com/)下載最新的版本。Reveal為我們提供了14天免費試用的版本,需要在注冊界面提供我們的郵箱地址,即可收到一封包含試用激活碼的郵件,試用期結束后可以購買正式版本。

Reveal的安裝

Reveal的安裝推薦使用CocoaPods,當然我們也可以使用手工方式安裝,但手工安裝的步驟非常繁雜,涉及到多步操作,因此推薦使用CocoaPods。

  • 首先在工程的Podfile中添加如下設置。由于Reveal的使用都是在程序調試階段使用的,因此,在pod配置中需要加上Debug選項;
 target 'YourMainAppTargetName' do
     pod 'Reveal-SDK', :configurations => ['Debug']
 end
  • 在終端中執行如下命令,安裝Reveal,運行成功后終端可以看到如下提示。
cd [Podfile所在目錄]
pod install

Reveal的使用

Reveal安裝完畢后,點擊.xcworkspace文件打開工程,運行程序后,我們可以在Xcode的日志窗口中看到如下提示,說明Reveal已經部署成功。

此時,打開Reveal應用,Reveal可以自動查詢可以分析的App應用。

選中需要分析的App即可打開分析窗口。在分析窗口中,我們可以查看當前App界面中顯示的所有控件信息。


]]>
0 http://www.346p.cn/index.php/archives/3567/#comments http://www.346p.cn/index.php/feed/archives/3567/
網絡圖片下載SDK:SDWebImage http://www.346p.cn/index.php/archives/3566/ http://www.346p.cn/index.php/archives/3566/ Fri, 11 Aug 2017 04:05:00 +0000 99ios

在實際的App開發中,界面顯示的圖片除了少量的本地圖片外,絕大多數圖片都需要通過網絡從服務器下載。對于網絡圖片下載的處理邏輯需要考慮諸多因素,例如網絡傳輸因素、圖片緩存等,通常情況下我們都會使用SDWebImage來完成網絡圖片的下載。本節簡單介紹一下SDWebImage的基本使用,全球超過90%的App都會存在SDWebImage的身影。

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中的核心方法

SDWebImage提供了極其簡單的方法用于下載網絡圖片,最簡單的情況下,只要提供圖片素材的URL即可。SDWebImage提供的常見下載圖片方法如下:

  • 最簡單的方法,只需要提供圖片的網絡地址以及占位圖即可
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
  • 指定圖片下載的相關操作。在該方法中,需要傳入一個SDWebImageOptions類型的參數,該參數中定義了有關圖片下載的操作,例如,失敗后是否重試、是否緩存、優先級等等。
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
  • 在block中定義圖片下載成功后的后續操作
-(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;

]]>
0 http://www.346p.cn/index.php/archives/3566/#comments http://www.346p.cn/index.php/feed/archives/3566/
高德地圖SDK:5-定位SDK http://www.346p.cn/index.php/archives/3565/ http://www.346p.cn/index.php/archives/3565/ Fri, 11 Aug 2017 04:01:00 +0000 99ios

高德定位SDK提供了不依賴于地圖定位的定位功能,開發者可以無地圖顯示的場景中便捷地為應用程序添加定位功能。定位SDK提供了單次定位、連續定位、逆地理信息、地理圍欄等功能。

本節以單次定位為例介紹一下高德定位SDK的使用方法。定位SDK提供的單次定位方法基于蘋果定位核心,蘋果定位核心會在設備移動時連續返回定位結果,高德在此基礎上封裝了單次定位。當設備可以正常聯網時,還可以返回該定位點的對應的中國境內位置信息(包括:省、市、區/縣以及詳細地址)。

  • 引入頭文件。在調用定位功能的類中引入AMapFoundationKit.h和AMapLocationKit.h這兩個頭文件。
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
  • 配置Key。在AppDelegate.m文件中,登記提前申請的Key。
[AMapServices sharedServices].apiKey =@"您的key";
  • 設置期望定位精度。由于蘋果系統的首次定位結果為粗定位,其可能無法滿足需要高精度定位的場景。所以,高德提供了 kCLLocationAccuracyBest 參數,設置該參數可以獲取到精度在10m左右的定位結果,但是相應的需要付出比較長的時間(10s左右),越高的精度需要持續定位時間越長。推薦使用kCLLocationAccuracyHundredMeters,偏差在百米左右,基本滿足絕大多數應用的精度要求,超時時間設置在2s-3s左右即可。
-(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);
        }
    }];
}

]]>
0 http://www.346p.cn/index.php/archives/3565/#comments http://www.346p.cn/index.php/feed/archives/3565/
高德地圖SDK:4-繪制地圖標注 http://www.346p.cn/index.php/archives/3564/ http://www.346p.cn/index.php/archives/3564/ Fri, 11 Aug 2017 04:01:00 +0000 99ios

同MapKit框架類似,使用高德地圖SDK也可以在地圖上添加標注。標注可以精確表示用戶需要展示的位置信息,高德地圖SDK提供的標注功能允許用戶自定義圖標和信息窗,同時提供了標注的點擊、拖動事件的回調。高德地圖SDK提供的地圖標注為MAAnnotation類,不同的標記可以根據圖標和改變信息窗的樣式和內容加以區分。

添加默認樣式點標記

高德地圖SDK提供的大頭針標注MAPinAnnotationView,通過它可以設置大頭針顏色、是否顯示動畫、是否支持長按后拖拽大頭針改變坐標等。在地圖上添加大頭針標注的步驟如下:

  • 修改ViewController.m文件,在viewDidAppear方法中添加如下所示代碼添加標注數據對象
-(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;
}
  • 實現MAMapViewDelegate協議中的 mapView:viewForAnnotation:回調函數,設置標注樣式。
- (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;
}

運行后,可以在地圖上展示地圖標注。


]]>
0 http://www.346p.cn/index.php/archives/3564/#comments http://www.346p.cn/index.php/feed/archives/3564/
高德地圖SDK:3-地圖SDK簡介 http://www.346p.cn/index.php/archives/3563/ http://www.346p.cn/index.php/archives/3563/ Fri, 11 Aug 2017 04:00:00 +0000 99ios

高德地圖所提供的SDK中,地圖SDK是用于提供地圖展示相關功能的SDK,其可以提供地圖顯示(含室內、室外地圖)、與地圖交互、在地圖上繪制、興趣點搜索、地理編碼、離線地圖等功能。

MAMapView類簡介

MAMapView類是高德地圖提供的用于展示地圖的類,其與MapKit框架中的MKMapView功能是類似的,但其提供的功能更加強大。在MAMapView類中,提供了如下一些比較常用的屬性和方法。

  • 地圖類型。除了普通地圖以及衛星圖之外,高德地圖還提供夜間視圖、導航視圖以及公交視圖等多種類型的地圖
@property (nonatomic) MAMapType mapType;
  • 當前地圖的中心點,改變該值時,地圖的比例尺級別不會發生變化
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
  • 當前地圖的經緯度范圍,設定的該范圍可能會被調整為適合地圖窗口顯示的范圍
@property (nonatomic) MACoordinateRegion region;
  • 是否顯示用戶位置
@property (nonatomic) BOOL showsUserLocation;
  • 向地圖窗口添加標注,需要實現MAMapViewDelegate的-mapView:viewForAnnotation:函數來生成標注對應的View
- (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];
}

運行結果如下:


]]>
0 http://www.346p.cn/index.php/archives/3563/#comments http://www.346p.cn/index.php/feed/archives/3563/
CocoaPods:2-使用CocoaPods安裝SDK http://www.346p.cn/index.php/archives/3562/ http://www.346p.cn/index.php/archives/3562/ Fri, 11 Aug 2017 03:58:00 +0000 99ios

CocoaPods安裝完畢后,我們就可以通過CocoaPods來安裝第三方庫了。使用CocoaPods為一個工程安裝第三方庫,需要按照如下步驟進行。

使用CocoaPods安裝SDK

在工程目錄中,創建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文件不再使用。

使用CocoaPods升級SDK

若希望升級已安裝的第三方庫到最新版本,可以在Podfile文件的目錄中執行如下命令:

pod repo update 
pod update

指定SDK的版本

使用指定版本 SDK,需要修改 Podfile 文件,添加版本相關信息,其文件內容如下:

platform :ios, '7.0' 
target 'Location' do  
   pod 'AMap3DMap', '~>4.4.1' #此處指定版本號
end

然后再執行如下命令:

pod repo update
pod install

]]>
0 http://www.346p.cn/index.php/archives/3562/#comments http://www.346p.cn/index.php/feed/archives/3562/
CocoaPods:1-安裝 http://www.346p.cn/index.php/archives/3561/ http://www.346p.cn/index.php/archives/3561/ Fri, 11 Aug 2017 03:58:00 +0000 99ios

CocoaPods是iOS開發中最常使用的第三方開源庫管理工具。如果不使用CocoaPods,我們在iOS開發過程中使用的第三方庫需要手工進行安裝以及更新,并且需要手工來設置各個第三方庫所需的系統依賴。在我們有了CocoaPods這個工具之后,只需要將用到的第三方開源庫放到一個名為Podfile的文件中,然后在命令行執行安裝命令,CocoaPods就會自動將這些第三方開源庫的源碼下載下來,并且為我們的工程設置好相應的系統依賴和編譯參數。

CocoaPods的安裝方法

在Mac電腦上安裝CocoaPods,需要按照如下步驟進行。

  • 更新Ruby的版本。CocoaPods是用Ruby實現的,要想使用它首先需要有Ruby環境。幸運的是OS X 10.5以上的系統默認的已經可以運行Ruby了,但建議更新Ruby到最新的版本(目前最新版本為2.3.0)。更新Ruby可以使用如下命令,但由于網絡原因會耗時較長。
rvm install ruby-2.3.0

  • 查看Ruby的生效版本。Ruby更新到最新版本后,我們還需要設置生效的Ruby版本,執行rvm list命令后,我們可以查看所有已安裝的版本,包括我們上一步安裝的2.3.0版本以及2.0.0版本,但當前生效的版本為2.0.0版本。更改Ruby的生效版本為2.3.0。

rvm 2.3.0 --default
  • 設置 Ruby 的軟件源。

使用默認的 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
  • 升級 gem。gem 版本較低也可能導致安裝或者升級失敗,所以需要升級 gem(最新版本為2.6.7)。使用以下命令:
sudo gem update --system

  • gem升級成功后,可以使用如下命令查看gem的當前版本
gem -v
  • 安裝 CocoaPods。使用如下命令安裝(OSX的版本高于10.11)。安裝過程可能會耗時比較長,也有可能受網絡狀況影響造成失敗,需要多次嘗試直到成功。
sudo gem install -n /usr/local/bin cocoapods
pod setup

  • 安裝成功后,可以查看CocoaPods的版本。
pod --version


]]>
0 http://www.346p.cn/index.php/archives/3561/#comments http://www.346p.cn/index.php/feed/archives/3561/
MapKit框架:6-復雜地圖標注示例 http://www.346p.cn/index.php/archives/3560/ http://www.346p.cn/index.php/archives/3560/ Tue, 08 Aug 2017 09:49:00 +0000 99ios

本節的示例代碼,在MKMapView上實現了添加自定義樣式的地圖標注,該地圖標注的圖標使用自定義圖片,點擊圖標后,可以在附加視圖的左右兩側各添加一個按鈕。

準備工作

在進行地圖標注樣式定制之前,需要提前完成如下代碼的編寫:

  • 初始化一個MKMapView類的對象,并設置屬性;
  • 初始化一個MKPointAnnotation類的對象,設置其屬性,并添加到MKMapView對象上;
  • 設置MKMapView對象的代理對象,通常為控制器對象,然后設置控制器對象遵守MKMapViewDelegate協議
  • 添加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


]]>
0 http://www.346p.cn/index.php/archives/3560/#comments http://www.346p.cn/index.php/feed/archives/3560/
定位服務:5-CLGeocoder應用案例2 http://www.346p.cn/index.php/archives/3559/ http://www.346p.cn/index.php/archives/3559/ Tue, 08 Aug 2017 09:47:00 +0000 99ios

上一節的示例代碼演示了使用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


]]>
0 http://www.346p.cn/index.php/archives/3559/#comments http://www.346p.cn/index.php/feed/archives/3559/
97人人超人人超碰超中文|免看一级a一级久久|国产熟睡乱子伦午夜|卡通动漫久久五月天 亚洲国产免费综合网日韩 亚洲日本中文字幕乱码在线 伊人久久大香线蕉av蜜芽 久久综合一香蕉老鬼色一个 91 中文字幕 国产 日韩 全彩3d啪啪无码本子全彩千乐网 亚洲中文字幕无码永久 三级三级久久三级 国产日产在线不卡省流观看