CS193P第十二堂课摘要及心得笔记

2020-06-06 作者: 围观:664 87 评论

在这一次的 CS193P 课程中,我们将学习如何使用 Web View 来在 iPhone 应用程式上显示网页内容,并且透过 Core Location 和 Map Kit 来取得使用者的地理位置和显示地图,就让我们一起来看看吧!

UIWebView

UIWebView 是 UIKit 所提供来显示网页内容的 View,背后使用的浏览技术就如同 iPhone 的 Safari 一样,换而言之,就如同 Safari 能够开启 PDF/DOC 等档案格式,透过 UIWebView 这些内容也理所当然的能够在我们的应用程式中显示。

UIWebView 的资料来源主要有三者:

  1. 本机上的 HTML 字串
  2. 本机上的资料 + MIME type
  3. 远端的 URL

需要注意的是,UIWebView 对于网页的一些功能有所限制,像是 JavaScript 最多只能执行 5 秒,而最多也只能使用 10MB 的记忆体空间。

而我们要如何建立 UIWebView 呢?我们当然可以透过 Interface Builder 来建立,也可以使用程式码。而当我们建立好 View 之后,可以使用以下 API 来提供显示资料给 View:

- loadHTMLString:string baseURL:baseURL; - loadData:data MIMEType:MIMEType textEncodingName:encodingName baseURL:baseURL; - loadRequest:request;

而这三种 API 也就是上面所说的三种不同的资料来源,分别是 HTML 字串、资料和 URL。这边的 NSURLRequest 是一个包装过后的物件,负责纪录所要撷取的 URL 和快取原则。此外,UIWebView 也有以下 Properties 和方法:

@property BOOL loading; // 是否在读取中? @property BOOL canGoBack;  // 是否有上一页? @property BOOL canGoForward; // 是否有下一页? - reload; // 重新读取- stopLoading; // 停止读取- goBack; // 回到上一页- goForward; // 回到下一页// 以下是设定值 @property BOOL scalesPageToFit // 是否自动缩放页面 @property BOOL detectsPhoneNumbers; // 是否自动侦测电话号码并转成可点的连结

就如同大多数複杂的类别一样,UIWebView 当然也会有对应的 delegate 方法:

- webViewDidStartLoad:webView; - webViewDidFinishLoad:webView; // 开始读取页面 - webView:webView didFailLoadWithError:error; // 读取失败 - webView:webView shouldStartLoadWithRequest:request navigationType:navigationType; // 判断是否要读取新的页面Core Location

Core Location 是在 Cocoa Touch 中所提供用来处理地理讯息的 framework,包含了以下类别:

要注意的是,Core Location 并不包含任何 UI 元件,而是只负责单纯的位置管理而已。而 Core Location 在运作上,会透过 iPhone 上得三种方式来定位:

而我们要如何确定 iPhone 使用的是哪一种定位方式呢?我们可以透过设定不同的準确度来达成,假设我们设定误差只能在 1 公尺以内,那 iPhone 自然会使用 GPS 来取得位置。而当我们需要获得当前的座标时,我们需要建立新的 CLLocationManager,如下方程式码:

@property CLLocation *location; // 取得的位置 @property id  delegate; // 设定 delegate @property CLLocationDistance distanceFilter; // 当使用者移动多远之后才会更新座标@property CLLocationAccuracy verticalAccuracy; // 设定準确度 - startUpdatingLocation // 开始更新座标 - stopUpdatingLocation // 停止更新座标 - startUpdatingHeading // 开始更新罗盘方向 - stopUpdatingHeading // 停止更新罗盘方向

此外,为了能够接收得到的资料,我们也需要设定 delegate,并且实做以下方法:

- locationManager:manager didUpdateToLocation:newLocation fromLocation:oldLocation; // 取得座标 - locationManager:manager didUpdateHeading:newHeading; // 取得罗盘方向 - locationManager:manager didFailLoadWithError:error; // 处理错误Map Kit

最后我们要谈的就是 Map Kit,也就是 iPhone 上用来显示地图的元件。而想当然尔,背后的技术是透过 Google 地图,所以地图资讯算是相当完整,也因此支援卫星云图的功能。除此之外,Map Kit 也可以用来转换 CLLocation,将其座标位置转成平常使用的地址。

CS193P第十二堂课摘要及心得笔记

而在 Map Kit 的 API 中,MKMapView 顾名思义就是用来显示地图的 View 元素,除了显示地图之外,MKMapView 也提供了地图上的标记跟显示使用者当下位置的功能,拥有以下 Properties:

@property MKCoordinateRegion region; // 显示区域 @property CLLocationCoordinate2D centerCoordinate; // 中央座标 @property MKMapType mapType; // 地图类型 @property NSArray *annotations; // 地图上的标记 @property MKUserLocation userLocation; // 使用者的位置

除了这些 Property 之外,也有许许多多的 delegate 方法,有兴趣的读者还请参考投影片 21、22 两页,或者是 MKMapView 的 Class Reference。

而我们刚刚有看到 MKMapView 有提供地图标记的功能,而这些地图标记并非独立的类别,而是实做 ProtocolMKAnnotation 来完成。或者是也可以直接使用 MKPlacemark:

- initWithCoordinate:coordinate addressDictionary:dictionary;

至于使用者的当前位置,则是透过 MKUserLocation,具有以下 properties:

@property BOOL updating ; // 是否在更新中 @property CLLocation *location; // 目前的位置 @property NSString *title; // 标题@property NSString *subtitle; // 次标题

最后,Map Kit 也提供了从地理座标找地址的功能,透过 MKReverseGeocoder:

- initWithCoordinate:coordinate; @property id  delegate; - start; - cancel;

当然也有 delegate:

- reverseGeocoder:geocoder didFindPlacemark:placemark; - reverseGeocoder:geocoder didFailWithError:error;结论

这次的课程内容包含了 UIWebView 和 Map Kit 的相关介绍,这两者在 iPhone 应用程式中常常出现,实用度也是相当的高!在下一次的课程中,我们将一同探讨如何在 iPhone 中整合手机中的通讯录设计一些应用程式,还请期待!

参考资源
相关浏览推荐