☆地図ライブラリ
地図表示;MKMapView/MKUserLocation
MKMapViewは、その名の通り地図を表示するビューである。 地図表示には非常に多くの機能が設定できるため、自身の設定の他、多くのプロトコルや関連クラスを持っている。

地図を所定の座標を中心に、指定サイズで表示でき、また、注釈も付けることが出来る。 このビューはGoogleマップを使って実装されていたが、今はアップル独自のマップである。 が、その出来がどうであるかはここで語るまでも無かろう。

MKMapViewを初期化するときは、最初の表示地域をプロパティで指定する。 領域は、中央点と「スパン」と呼ばれる水平・垂直距離で定義される。 スパンは、与えられた点のどれだけが地図上で見えるかと拡大率を定める。 大きなスパンを指定することは広い範囲を低い拡大率で見ることを意味する。 小さなスパンは、狭い範囲をより高い拡大率で見ることを意味する。 MKMapViewクラスは、スパンを設定することに加え、地図位置と拡大率について多くの標準的な機能を与える。
 ここでは、「フリック」(flick)と「ピンチ」(pinch)というジェスチャーがサポートされ、 地図のスクロールと拡大・縮小が出来る これらの操作はデフォルトで許可されているが、scrollEnabled/zoomEnabledプロパティでON/OFFできる。

いくつかの値を変更した特別の地図を使うことも出来る。 地球の曲面を平面に映すとき、経度線が平行であるように見える地図の二次元のバージョンを得る。 この地図の場所と距離はMKMapPoint、MKMapSizeとMKMapRectデータ型を使って指定される。 これらは、地図の見える地域とオーバーレイの位置を指定するために使う。

MKMapViewは子クラス化すべきではない。地図ビューの挙動についてはデリゲートから情報を得ることが出来る。

地図に注釈を付けること
MKMapViewクラスは、カスタムの情報で地図に注釈(annotation)をつける機能を持つ。 地図は多数の注釈をもつかもしれないので、地図ビューは注釈データとビュー・オブジェクトを区別する。
注釈オブジェクトは、MKAnnotationプロトコルに従う任意のオブジェクトである。 既存のクラスを利用して実装できる。これは注釈データを直接操作できることを意味する。 各々の注釈オブジェクトは、吹き出しで表示される図形情報とともに、地図の上で注釈の場所に関する情報を含む。 注釈オブジェクトの画面上への表示は注釈ビューによって取り扱われる。それはMKAnnotationViewクラスのインスタンスである。
注釈ビューは、意味をなす方向で注釈データを提示する役割を果たす。 例えば、地図アプリケーションは、地図上の特定の地点を示すためにピンアイコンを使う (MKPinAnnotationViewクラスを利用すればいい)。 地図のより広い部分をカバーする注釈ビューをつくることもできる。
注釈ビューは表示中のみ必要なので、MKMapViewクラスは使用中でないビューをキューイングする機構を提供する。 それらが画面から消えるとき、再利用識別子によって分離され、キューイングされる。 この機能は、少数の注釈ビューのみをメモリに置きビューを再使用することでメモリの利用率を改善する。 これはまた、地図のスクロール中は新規ビューの生成の必要性を軽減することで、スクロールの性能を改善する。

地図インターフェースを構成するときは、注釈オブジェクトの全てをすぐに追加しなければならない。 地図ビューは、対応する注釈ビューがいつ画面に現れる必要があるかについて決定するために、 各々の注釈オブジェクトで座標データを使う。注釈ビューが画面上に来るとき、 地図ビューはデリゲートに注釈ビューを生成するよう頼む。 アプリケーションが異なった種類の注釈を持つことは、異なる注釈を定義する事で可能である。

オーバーレイを地図に加える
地図の広い部分の上に内容を表示するために、「オーバーレイ」を使うことが出来る。 オーバーレイは、MKOverlayプロトコルに従う任意のオブジェクトである。
オーバレイ・オブジェクトは、その形状、大きさと地図上の位置を指定するために必要な点を含むデータオブジェクトである。 オーバレイは、円、長方形、複数領域線分、単純または複雑な多角形で表すことができる。 他の形状を作るためにカスタムオーバーレイを作ることも出来る。

画面上へのオーバーレイの表示は、MKOverlayViewクラスのインスタンスである、オーバーレイビューによって扱われる。 オーバレイ・ビューの仕事は、地図内容の上でオーバレイの形を描くことである。 たとえば、バス・ルートを表すオーバレイは、そのルートに沿って停留所を表しているアイコンに加えて ルートの通り道を引くオーバレイ・ビューを持つかもしれない。 Mapキット・フレームワークはオーバレイ・オブジェクトの標準的なオーバレイ・ビューの形状を定める。 必要なら、更なるオーバレイ・ビューを定めることができる。

 地図インターフェースを構成するとき、オーバーレイオブジェクトはいつでも追加できる (注釈ビューが即時追加が必要だったのとは異なる)。 地図ビューは、対応するオーバレイ・ビューがいつ画面に現れる必要があるかについて決定するために、 各々のオーバレイ・オブジェクトのデータを使う。
オーバーレイが画面上で動くとき、マップビューはデリゲートにオーバーレイビューを生成するよう頼む。

MKMapView
プロパティ名属性内容
NSArray *annotations Rレシーバーに設定されている注釈の完全なリストを返す
CGRect annotationVisibleRect R注釈ビューが現在示されている長方形
CLLocationCoordinate2D centerCoordinateR地図ビューの中心の地図座標
id <MKMapViewDelegate> delegateSデリゲートを設定する
MKMapType mapType 地図ビューで表示されるデータ種類
MKMapType(enum値)
MKMapTypeStandard 全ての道路位置といくつかの道路名を表示する
MKMapTypeSatellite 衛星写真
MKMapTypeHybrid 上記2つの合成
NSArray *overlays R地図ビューに現在割り付けられているオーバーレイ
MKCoordinateRegion region  地図ビューに現在表示されている領域
BOOL scrollEnabled G=isScrollEnabled地図をスクロールさせるかどうか
NSArray *selectedAnnotationsC現在選択されている注釈
BOOL showsUserLocation  ユーザー位置を表示するかどうか
MKUserLocation *userLocationRユーザーの現在の場所を表している注釈オブジェクト
BOOL userLocationVisible RG=isUserLocationVisibleデバイスの現在位置が地図ビュー内で表示可能かどうか
MKMapRect visibleMapRect  地図ビューで現在表示されている領域
BOOL zoomEnabled G=isZoomEnabledピンチによる拡大を可能にするかどうか
メソッド名動作
-(void)addAnnotation:(id < MKAnnotation >)annotation注釈を追加する
-(void)addAnnotations:(NSArray *)annotations配列で注釈を追加する
-(void)addOverlay:(id < MKOverlay >)overlay1つのオーバーレイを追加する
-(NSSet *)annotationsInMapRect:(MKMapRect)mapRect配列でオーバーレイを追加する
-(CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate
 toPointToView:(UIView*)view
指定された地図長方形に位置する注釈オブジェクトを返す
-(CLLocationCoordinate2D)convertPoint:(CGPoint)point
 toCoordinateFromView:(UIView*)view
指定されたビューで、地図座標を点に変える
-(MKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view 指定されたビューの座標系での点をシステムの地図座標に変換する
-(CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view 指定されたビューの座標系での長方形をシステムの地図座標に変換する
-(MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString*)identifier IDで示される再利用可能注釈を返す
-(void)deselectAnnotation:(id < MKAnnotation >)annotation animated:(BOOL)animated 指定された注釈をはずして、その吹き出しビューを隠す。
-(void)exchangeOverlayAtIndex:(NSUInteger)index1 withOverlayAtIndex:(NSUInteger)index2 2つのオーバーレイの位置を交換する
-(void)insertOverlay:(id < MKOverlay >)overlay
aboveOverlay:(id <MKOverlay>)sibling
atIndex:(NSUInteger)index
belowOverlay:(id <MKOverlay>)sibling
地図ビューにオーバレイを加え、指定されたsiblingオブジェクトの上に置く
地図上のオーバーレイオブジェクトの指定位置にオーバーレイを挿入する
地図ビューにオーバレイを加え、指定されたsiblingオブジェクトの下に置く
-(MKMapRect)mapRectThatFits:(MKMapRect)mapRect
なし
edgePadding:(UIEdgeInsets)insets

指定された地図長方形のアスペクト比を、地図ビューのフレームにはまるように調整する
指定されたインセット値で指定された地図長方形のアスペクト比を調節する
-(MKCoordinateRegion)regionThatFits:(MKCoordinateRegion)region 指定された領域のアスペクト比が、地図ビューのフレームをはまるよう調整する
-(void)removeAnnotation:(id < MKAnnotation >)annotation地図ビューから指定注釈を取り除く
-(void)removeAnnotations:(NSArray *)annotations配列で指定した注釈を地図ビューから取り除く
-(void)removeOverlay:(id < MKOverlay >)overlay1つのオーバーレイを地図から取り除く
-(void)removeOverlays:(NSArray *)overlays配列で指定したオーバーレイを地図から取り除く
-(void)selectAnnotation:(id < MKAnnotation >)annotation animated:(BOOL)animated 指定した注釈と吹き出しビュー表示を選択する(アニメーション付き)
-(void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated 地図の中心座標を変更する(アニメーション付き)
-(void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated現在の表示可能領域を変更する(アニメーション付き)
-(void)setVisibleMapRect:(MKMapRect)mapRect
animated:(BOOL)animate
edgePadding:(UIEdgeInsets)insets animated:(BOOL)animate
共にアニメーション付き
地図の現在見える部分を変更する
地図の現在見える部分を変更する;端の周辺のさらなるスペースを指定できる
-(MKAnnotationView *)viewForAnnotation:(id < MKAnnotation >)annotation 指定された注釈オブジェクトに関連した注釈ビューがあればそれを返す。
-(MKOverlayView *)viewForOverlay:(id < MKOverlay >)overlay オーバーレイオブジェクトに割り付けられたビューを返す

デリゲートは MKMapViewDelegateプロトコルで実装する。
メソッド名動作
-(void)mapView:(MKMapView *)mapView
annotationView:(MKAnnotationView *)view
 calloutAccessoryControlTapped:(UIControl *)control
nnotationView:(MKAnnotationView*)annotationView
 didChangeDragState:(MKAnnotationViewDragState)newState
 fromOldState:(MKAnnotationViewDragState)oldState
didAddAnnotationViews:(NSArray *)views
didAddOverlayViews:(NSArray *)overlayViews
didDeselectAnnotationView:(MKAnnotationView*)view
didFailToLocateUserWithError:(NSError *)error
didSelectAnnotationView:(MKAnnotationView*)view
didUpdateUserLocation:(MKUserLocation*)userLocation
regionDidChangeAnimated:(BOOL)animated
regionWillChangeAnimated:(BOOL)animated

注釈ビューのアクセサリボタンの1つをユーザーがタップした時
 
ドラッグで注釈ビューの1つが変化した
 
 
1つ以上の注釈ビューが地図上に追加された
1つ以上のオーバーレイが地図上に追加された
注釈ビューの1つが非選択になった
ユーザーの位置が見つけられなかった
注釈ビューの1つが選択された
ユーザー位置が更新された
マップビューで表示された領域が更新されたちょうどその時
マップビューで表示された領域が更新される時
-(MKAnnotationView *)mapView:(MKMapView *)mapView
 viewForAnnotation:(id <MKAnnotation>)annotation
指定注釈オブジェクトに割り付けられたビューを返す
-(MKOverlayView *)mapView:(MKMapView *)mapView
 viewForOverlay:(id <MKOverlay>)overlay
指定されたオーバーレイオブジェクトが表示されたとき
-(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error 指定されたビューが地図データを読み込めなかった
-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 指定された地図ビューが地図データを読み込めた
-(void)mapViewDidStopLocatingUser:(MKMapView *)mapView マップビューがユーザー位置の追跡を止めた
-(void)mapViewWillStartLoadingMap:(MKMapView *)mapView 指定された地図ビューが若干の地図データを検索しようとしている
-(void)mapViewWillStartLocatingUser:(MKMapView *)mapView 地図ビューがユーザー位置の追跡を始める

従うべきプロトコルは以下の通り。
MKAnnotation
プロパティ名属性内容
CLLocationCoordinate2D coordinateR注釈の中心の点(地図座標として指定される)
メソッド名動作
-(void)setCoordinate:(CLLocationCoordinate2D)newCoordinate注釈の中心点を設定する
-(NSString *)subtitle注釈のサブタイトル文字列
-(NSString *)title注釈のタイトル文字列

MKOverlay
プロパティ名属性内容
MKMapRect boundingMapRectRオーバレイを含む計画された長方形
CLLocationCoordinate2D coordinateRオーバレイ域のおよその中心の点
メソッド名動作
-(BOOL)intersectsMapRect:(MKMapRect)mapRect指定された長方形がレシーバーの形と交差するかどうか

MKUserLocationクラスは、ユーザーの現在の場所を特定する、特異的な種類の注釈を定める。 このクラスのインスタンスを直接作ることはない。 その代わりに、既存のMKUserLocationオブジェクトを、あなたのアプリケーションで表示されている地図ビューのuserLocationプロパティ表示 から取り戻す。
MKUserLocation
プロパティ名属性内容
CLLocation *location Rデバイスの現在位置
NSString *subtitle Tユーザー位置注釈に表示するサブタイトル
NSString *title Tユーザー位置注釈に表示するタイトル
BOOL updating RG=isUpdatingユーザー位置情報が現在更新されているかどうか

地図系で使うデータ型は以下のように定義されている。
型名実定義内容
MKCoordinateSpan構造体地図領域によるスパンの定義
MKCoordinateRegion構造体地図のどの部分を示すべきかについて定める構造体
MKMapPoint構造体二次元の投影法の点
MKMapSize構造体二次元の投影法で測定されるサイズ情報
MKMapRect構造体二次元の投影法で測定される長方形の地域
MKZoomScaleCGFloat地図の縮尺


地図注釈;MKAnnotationView/MKPinAnnotationView/MKShape
MKAnnotationViewクラスは、地図表示で視覚的に注釈を提示する役割を果たす。 注釈表示は対応する注釈オブジェクトにゆるく結合する。そして、それはMKAnnotationプロトコルと一致する物である。 注釈の座標点が見える地域にあるとき、地図表示はその代表に対応する注釈表示を提供するよう頼む。 注釈ビューは後でリサイクルされるかもしれなくて、地図表示によって維持される再利用キューに入れられるかも知れない。

内容を注釈表示に提供する最も効率的な方法は、そのimageプロパティに設定することである。 注釈ビューのサイズは自動的に、指定するイメージの大きさに合わせ、その内容を描画する。 それがビューであるが、しかしながら、drawRect:メソッドをオーバーライドすることで、 ビュー内容の表示をマニュアルで行うことも出来る。 drawRect:メソッドのオーバーライドを直接行い、imageプロパティでカスタムの画像を指定しないときは、 注釈ビューのフレームの幅と高さがデフォルトで0をつけられるので注意。

あなたのカスタムの内容が描画できる前に、ビューのframeプロパティで、幅と高さを0以外に設定しなければならい。 一般に、あなたの内容が完全に性的画像からなるならば、画像を自身で描画するより、imageプロパティを設定して、 必要に応じてそれを変更することが効率的である。

 注釈ビューは彼らの関連する注釈オブジェクトで特定された地図の点に固定される。 それらが地図内容とともにスクロールするが、注釈ビューは分離された表示レイヤーにあって、表示可能な地図領域の大きさが変わっても 縮尺を変えない。

 注釈ビューは、選択状態の概念を支える。それは、ビューが非選択、選択中、または選択されて吹き出しビューが表示されていることを決定する。 ユーザーは、注釈ビューとの相互作用を通して、選択状態を切り替える。 非選択状態では、注釈ビューは表示されても強調表示化はされない。 選択中状態では、注釈は強調表示化されるが、吹き出しは表示しない。 そして最後に、最後に、注釈は強調表示と吹き出しで表示されることができる。 タイトル情報は注釈オブジェクトから提供される。しかし、注釈ビューはどんなカスタムの制御も提供する役割を果たす。

注釈表示の再利用
注釈ビューは、ユーザーまたはアプリケーションが見える地図領域を変更したとき、再利用出来るように設計されている。 注釈ビューの再利用は、クリティカルな処理の間新しいビューオブジェクトの生成を抑えることは、スクロール性能の飛躍的な改善をもたらす。 このため、注釈ビューはその関連した注釈の内容に、きつく結合してはいけない。 その代わり、注釈ビューのプロパティー(またはsetterメソッド)が、新しい注釈オブジェクトの構成を可能にする。

新しい注釈ビューを初期化するときは、そのビューに再利用IDを常に指定しなければならない。 注釈ビューがもはや必要ないなら、地図ビューはそれを再利用キューに入れるかもしれない。 新しい注釈が地図ビューに加えられるとき、デリゲートは再利用キューから取り除き、 (新しい物を作るよりかは)存在するビューを再構成する。それにはMKMapViewのdequeueReusableAnnotationViewWithIdentifier:メソッドを使う。

子クラス化での注意
このままMKAnnotationViewクラスを使うだけでなく、必要に応じてカスタムのふるまいを提供するために、子クラスにできる。 imageプロパティーは、注釈ビューの外観を子クラス化することなく設定できる。 MKPinAnnotationView子クラスは、ピン画像で注釈ビューの内容を初期化する。 MKAnnotationViewを子クラス化するに特別な要求条件はない。 しかしながら、以下のリストは子クラス化するいくつかの理由を含み、また望む振る舞いのためにメソッドのオーバーライドが必要かもしれない 後でドラッグ可能な注釈ビューをサポートするならば、子クラスはdragStateプロパティーで変更される値に責任を負う必要がある。 それは、ドラッグ操作の重要な転移点に相当する値である。

MKAnnotationView
プロパティ名属性内容
id <MKAnnotation> annotation T現在のビューに割り付けらている注釈オブジェクト
CGPoint calloutOffset  callout吹き出しを配置するオフセット(ピクセル単位)
BOOL canShowCallout  注釈ビューが拡張情報を吹き出しビューで表示できるかどうか
CGPoint centerOffset  ビューを表示する時のオフセット(ピクセル単位)
BOOL draggable G=isDraggable注釈ビューがドラッグ可能かどうか
MKAnnotationViewDragState dragState  注釈ビューの現在のドラッグ状態
MKAnnotationViewDragState(enum値)
MKAnnotationViewDragStateNone ドラッグ動作不可
MKAnnotationViewDragStateStarting ドラッグが始まった
MKAnnotationViewDragStateDragging ドラッグ中で、追跡中
MKAnnotationViewDragStateCanceling ドラッグがキャンセルされた
MKAnnotationViewDragStateEnding ビューがユーザーによりドロップされた
BOOL enabled G=isEnabled注釈が有効かどうか
BOOL highlighted G=isHighlighted注釈ビューが強調表示表示されるかどうか
UIImage *image T注釈ビューで表示される画像
UIView *leftCalloutAccessoryViewT標準的な吹き出しの左上への表示するビュー
UIView *rightCalloutAccessoryViewT標準的な吹き出しの右上への表示するビュー
NSString *reuseIdentifier R注釈ビューの再利用ID
BOOL selected G=isSelected注釈ビューが現在選択されているかどうか
メソッド名動作
-(id)initWithAnnotation:(id <MKAnnotation>)annotation
 reuseIdentifier:(NSString*)reuseIdentifier
新しい注釈ビューを初期化する
-(void)prepareForReuseビューが再利用キューから取り除かれたときに呼び出される
-(void)setDragState:(MKAnnotationViewDragState)newDragState
 animated:(BOOL)animated
現在の注釈ビューに現在のドラッグ状態を設定する
-(void)setSelected:(BOOL)selected animated:(BOOL)animated注釈ビューの選択状態を設定する

MKPinAnnotationViewクラスは、具体的な注釈ビューの1つであり、 地図アプリケーションにあるピン・アイコンを表示するものである。 このクラスを使うことで、アニメーション付きで、ピンを刺すような設計をすることが出来る。
MKPinAnnotationView
プロパティ名属性内容
BOOL animatesDrop 注釈ビューが画面上でアニメーションするかどうか
MKPinAnnotationColor pinColor ピン頭の色
MKPinAnnotationColor(enum値)
MKPinAnnotationColorRed
MKPinAnnotationColorGreen
MKPinAnnotationColorPurple

MKShapeクラスは、すべての形ベースの注釈オブジェクトのために基本的な特性を定める抽象クラスである。 このクラスは子クラスで使う物であり、このまま使われることはない。 子クラスは、幾何学的形状を定め、適当な値をMKAnnotationプロトコルから継承するcoordinateプロパティに提供する役割を果たす。
MKShape
プロパティ名属性内容
NSString *subtitle C形状注釈のサブタイトル
NSString *title C形状注釈のタイトル


地図オーバーレイ;MKOverlayView
MKOverlayViewクラスは、すべてのオーバレイビューと関連した基本的なふるまいを定義する。 オーバレイビュー、オーバレイオブジェクト(つまりMKOverlayプロトコルに従うオブジェクト)の視覚の表現を提供する。 このクラスは地図ビューによって使われる描画基盤を定義するが、実描画は行わない。 子クラスは、オーバーレイビューの内容の描画のためにdrawMapRect:zoomScale:inContext:メソッドをオーバーライドする。 地図キット・フレームワークは、オーバレイビューのいくつかの具体的事例を提供する。 具体的には、それはオーバレイビューを具体的なオーバレイオブジェクトの各々として提供する。 これらの既存のオーバレイビューのうちの1つを使うことができるが、異なった内容のオーバーレイを描画したいなら、 独自に子クラスを定めることもできる。

子クラス化での注意
カスタムの形状と内容を持ったオーバーレイを、MKOverlayViewの子クラスとして作ることが出来る。 子クラスがオーバーライドすることになっている唯一のメソッドは、drawMapRect:zoomScale:inContext:メソッドである。 しかし、あなたのクラスはが描画をすぐに始められないかもしれない。 その時はcanDrawMapRect:zoomScale: メソッドもオーバーライドし、 描画する準備ができていてできると報告するために、それを使いなさい。 drawMapRect:zoomScale:inContext: メソッドの実装は、同時に複数のスレッドで走ることが出来る様にしなければならない。 パフォーマンスの改善のために、地図ビューは十分に大きいオーバーレイにタイルを貼るかもしれない。 そして、それぞれのタイルに分割されたスレッドを割り当てるかもしれない。
MKOverlayView
プロパティ名属性内容
id <MKOverlay> overlayR描画データを含んでいるオーバーレイオブジェクト
メソッド名動作
-(BOOL)canDrawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale オーバーレイが内容を描画する準備が出来ているかどうか
-(void)drawMapRect:(MKMapRect)mapRect
 zoomScale:(MKZoomScale)zoomScale
 inContext:(CGContextRef)context
オーバーレイビューの内容を描画する
-(id)initWithOverlay:(id <MKOverlay>)overlayオーバレイビューを初期化して、それを指定されたオーバレイオブジェクトと結びつける
-(MKMapPoint)mapPointForPoint:(CGPoint)pointオーバレイビューで指定された点と一致する地図点を返す
-(MKMapRect)mapRectForRect:(CGRect)rectオーバレイ・ビューの座標系で長方形と一致する地図長方形を返す
-(CGPoint)pointForMapPoint:(MKMapPoint)mapPoint地図の上で指定された点と一致するオーバレイビュー内の点を返す
-(CGRect)rectForMapRect:(MKMapRect)mapRect地図の上で指定された長方形と一致するオーバレイビュー内の長方形を返す
-(void)setNeedsDisplayInMapRect:(MKMapRect)mapRect
なし
zoomScale:(MKZoomScale)zoomScale

全ての地図縮尺で与えられた地図長方形内のビューを無効にする
特定の地図縮尺でのみ、与えられた地図長方形内のビューを無効にする