diff --git a/DaumMap.embeddedframework/DaumMap.framework/DaumMap b/DaumMap.embeddedframework/DaumMap.framework/DaumMap new file mode 100644 index 0000000..991320f Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/DaumMap differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapCameraUpdate.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapCameraUpdate.h new file mode 100644 index 0000000..2b73774 --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapCameraUpdate.h @@ -0,0 +1,119 @@ +/** + * @brief Map CameraUpdate Class + * @file MTMapCameraUpdate.h + * @author Soo-Hyun Park (goaeng0824@daumcorp.com) + * @date 2014/7/16 + * @copyright + * Copyright 2014 Daum Communications Corp. All rights reserved. + */ + +#import +#import +#import + + +/** + * @brief 지도 화면 처리를 담당하는 Class + * 지도 화면 이동/확대/축소 등의 기능이 제공된다. + * @see MTMapView + */ + +@interface MTMapCameraUpdate : NSObject + +/** + * 지도 화면을 현재의 확대/축소 레벨을 유지한 상태로 + * 설정한 중심점으로 이동한다. + * @param mapPoint 이동하는 지도 화면의 중심점 + */ + ++ (MTMapCameraUpdate *)move:(MTMapPoint *)mapPoint; + +/** + * 지도 화면을 설정한 확대/축소 레벨로 조정 및 + * 설정한 중심점으로 이동한다. + * @param mapPoint 이동하는 지도 화면의 중심점 + * @param zoomLevel 변경된 지도 확대/축소 레벨 + */ + ++ (MTMapCameraUpdate *)move:(MTMapPoint *)mapPoint withZoomLevel:(MTMapZoomLevel)zoomLevel; + +/** + * 설정한 중심점으로 이동하면서 지정한 직경(meter) 영역이 보이도록 줌레벨이 조정된다. + * 지정한 영역의 padding 값은 0 + * @param mapPoint 이동하는 지도 화면의 중심점 + * @param meter 직경(지름) + */ + ++ (MTMapCameraUpdate *)move:(MTMapPoint *)mapPoint withDiameter:(CGFloat)meter; + +/** + * 설정한 중심점으로 이동하면서 지정한 직경(meter) 영역이 보이도록 줌레벨이 조정된다. + * @param mapPoint 이동하는 지도 화면의 중심점 + * @param meter 직경(지름) + * @param padding 지정한 영역의 padding 값 + */ + ++ (MTMapCameraUpdate *)move:(MTMapPoint *)mapPoint withDiameter:(CGFloat)meter withPadding:(CGFloat)padding; + +/** + * 지정한 영역이 화면에 나타나도록 지도화면 중심과 확대/축소 레벨을 자동조절한다. + * 지정한 영역의 padding 값은 0 + * @deprecated 제거될 예정. fitMapViewWithMapBounds: 를 사용하세요. + * @param bounds 화면에 보여주고자 하는 영역 (MTMapPoint 타입의 좌하단 지점과 우상단 지점을 인자로 갖는 구조체) + */ + ++ (MTMapCameraUpdate *)fitMapView:(MTMapBounds)bounds; + +/** + * padding 값을 반영한 지정한 영역이 화면에 지정된 나타나도록 지도화면 중심과 확대/축소 레벨을 자동조절한다. + * @deprecated 제거될 예정. fitMapViewWithMapBounds:withPadding: 를 사용하세요. + * @param bounds 화면에 보여주고자 하는 영역 (MTMapPoint 타입의 좌하단 지점과 우상단 지점을 인자로 갖는 구조체) + * @param padding 지정한 영역의 padding 값 + */ + ++ (MTMapCameraUpdate *)fitMapView:(MTMapBounds)bounds withPadding:(CGFloat)padding; + +/** + * padding 값을 반영한 지정한 영역이 화면에 지정된 나타나도록 하되 + * 지정한 최소 레벨과 최대 레벨 범위 안의 지도화면 중심과 확대/축소 레벨을 자동조절 한다. + * @deprecated 제거될 예정. fitMapViewWithMapBounds:withPadding:withMinZoomLevel:withMaxZoomLevel: 를 사용하세요. + * @param bounds 화면에 보여주고자 하는 영역 (MTMapPoint 타입의 좌하단 지점과 우상단 지점을 인자로 갖는 구조체) + * @param padding 지정한 영역의 padding 값 + * @param minZoomLevel 지도 화면 최대 확대 레벨 값 (-2~12, 값이 작을수록 더 좁은 영역이 화면이 보임. 지도 화면이 확대됨) + * @param maxZoomLevel 지도 화면 최대 축소 레벨 값 (-2~12, 값이 클수록 더 넓은 영역이 화면이 보임. 지도 화면이 축소됨) + */ + ++ (MTMapCameraUpdate *)fitMapView:(MTMapBounds)bounds withPadding:(CGFloat)padding withMinZoomLevel:(MTMapZoomLevel)minZoomLevel withMaxZoomLevel:(MTMapZoomLevel)maxZoomLevel; + +/** + * 지정한 영역이 화면에 나타나도록 지도화면 중심과 확대/축소 레벨을 자동조절한다. + * 지정한 영역의 padding 값은 0 + * @param bounds 화면에 보여주고자 하는 영역 (MTMapPoint 타입의 좌하단 지점과 우상단 지점을 인자로 갖는 구조체) + */ + ++ (MTMapCameraUpdate *)fitMapViewWithMapBounds:(MTMapBoundsRect *)bounds; + +/** + * padding 값을 반영한 지정한 영역이 화면에 지정된 나타나도록 지도화면 중심과 확대/축소 레벨을 자동조절한다. + * @param bounds 화면에 보여주고자 하는 영역 (MTMapPoint 타입의 좌하단 지점과 우상단 지점을 인자로 갖는 구조체) + * @param padding 지정한 영역의 padding 값 + */ + ++ (MTMapCameraUpdate *)fitMapViewWithMapBounds:(MTMapBoundsRect *)bounds withPadding:(CGFloat)padding; + +/** + * padding 값을 반영한 지정한 영역이 화면에 지정된 나타나도록 하되 + * 지정한 최소 레벨과 최대 레벨 범위 안의 지도화면 중심과 확대/축소 레벨을 자동조절 한다. + * @param bounds 화면에 보여주고자 하는 영역 (MTMapPoint 타입의 좌하단 지점과 우상단 지점을 인자로 갖는 구조체) + * @param padding 지정한 영역의 padding 값 + * @param minZoomLevel 지도 화면 최대 확대 레벨 값 (-2~12, 값이 작을수록 더 좁은 영역이 화면이 보임. 지도 화면이 확대됨) + * @param maxZoomLevel 지도 화면 최대 축소 레벨 값 (-2~12, 값이 클수록 더 넓은 영역이 화면이 보임. 지도 화면이 축소됨) + */ + ++ (MTMapCameraUpdate *)fitMapViewWithMapBounds:(MTMapBoundsRect *)bounds withPadding:(CGFloat)padding withMinZoomLevel:(MTMapZoomLevel)minZoomLevel withMaxZoomLevel:(MTMapZoomLevel)maxZoomLevel; + +@end + + + + diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapCircle.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapCircle.h new file mode 100644 index 0000000..22dd0ce --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapCircle.h @@ -0,0 +1,70 @@ +/** + * @brief Map Circle Class + * @file MTMapCircle.h + * @author Soo-Hyun Park (goaeng0824@daumcorp.com) + * @date 2014/6/11 + * @copyright + * Copyright 2014 Daum Communications Corp. All rights reserved. + */ + +#import +#import +#import + +/** + * @brief 지도도화면 위에 추가되는 Circle에 해당하는 Class. + * 지도화면 위에 Circle을 추가하기 위해서는 + * MTMapCircle 객체를 생성하여 MTMapView객체에 등록해 주어야 한다. + * (MTMapView.addCircle:) + * Circle의 중심점을 설정하고 선 색상, 선 두께, 영역 색깔, 반경을 지정할 수 있다. + * @see MTMapView + */ +@interface MTMapCircle : NSObject { +@private + MTMapPoint* _circleCenterPoint; + float _circleLineWidth; + UIColor* _circleLineColor; + UIColor* _circleFillColor; + float _circleRadius; + NSInteger _tag; +} + +/** + * MTMapCircle 객체를 생성한다. autorelease 상태로 MTMapCircle 객체를 생성하여 리턴한다. + */ ++ (instancetype)circle; + +/** + * Circle의 중심점을 지정한다. + */ +@property (nonatomic, retain) MTMapPoint* circleCenterPoint; + +/** + * Circle의 선 두께를 지정한다. + */ +@property (nonatomic, assign) float circleLineWidth; + +/** + * Circle의 선 색상을 지정한다. + */ +@property (nonatomic, retain) UIColor* circleLineColor; + +/** + * Circle의 영역 색상을 지정한다. + */ +@property (nonatomic, retain) UIColor* circleFillColor; + +/** + * Circle의 반경 값을 지정한다. + */ +@property (nonatomic, assign) float circleRadius; + +/** + * Circle 객체에 임의의 정수값(tag)을 지정할 수 있다. + * MTMapView에 등록된 Circle들 중 특정 Circle을 찾기 위한 식별자로 사용할 수 있다. + * tag값을 반드시 지정해야 하는 것은 아니다. + * @see MTMapView.findCircleByTag: + */ +@property (nonatomic, assign) NSInteger tag; + +@end diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapGeometry.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapGeometry.h new file mode 100644 index 0000000..ab64318 --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapGeometry.h @@ -0,0 +1,222 @@ +/** + * @brief Daum Map Geometry Data Types + * @file MTMapGeometry.h + * @author Byung-Wan Lim (bwlim@daumcorp.com) + * @date 2011/11/04 + * @copyright + * Copyright 2012 Daum Communications Corp. All rights reserved. + */ + +#import + +/** + * Geoid 타원체 상의 한 점을 표현하는 지도 좌표 타입 (WGS84) + * 위도(latitude)와 경도(longitude)값으로 구성된다. + */ +typedef struct { + double latitude; /**< 위도 값 */ + double longitude; /**< 경도 값 */ +} MTMapPointGeo; + +/** + * 위도 경도 값으로 MTMapPointGeo 데이터 구조를 생성하는 매크로 + * @param latitude 위도 값 + * @param longitude 경도 값 + * @return MTMapPointGeo 데이터 구조 + */ +#define MTMapPointGeoMake(latitude,longitude) (MTMapPointGeo){(double)latitude, (double)longitude} + +/** + * Geoid 상의 구면 좌표를 평면으로 프로젝션한 지도 좌표 정보를 저장하는 데이터 구조 + * 평면 좌표 체계로는 WCONG(Daum), CONG(Daum), WTM 등이 있다. + */ +typedef struct { + double x; /**< x 좌표값 */ + double y; /**< y 좌표값 */ +} MTMapPointPlain; + +/** + * x, y 좌표 값으로 MTMapPointPlain 데이터 구조를 생성하는 매크로 + * @param x x 좌표값 + * @param y y 좌표값 + * @return MTMapPointGeo 데이터 구조 + */ +#define MTMapPointPlainMake(x,y) (MTMapPointPlain){(double)x, (double)y} + +@class InternalCoord; // internal class processing map coordinates + +/** + * @brief 지도 화면위 한 지점을 표현할 수 있는 Point Class. + * 지도 화면 위의 위치와 관련된 작업을 처리할 때 항상 MTMapPoint 객체를 사용한다. + * MTMapPoint 객체는 위경도값(WGS84)을 이용하여 생성하거나, + * 평면 좌표값(WCONG(Daum), WTM)을 이용하여 생성할 수 있다. + * 특정 좌표시스템의 좌표를 이용하여 MTMapPoint객체를 생성한 후에 + * mapPointGeo:, mapPointWCONG, mapPointWTM등의 메소드를 통해 + * 다른 좌표 시스템의 좌표값으로 손쉽게 조회해 볼 수 있다. + */ +@interface MTMapPoint : NSObject { +@private + InternalCoord* _internalCoord; +} + +/** + * 위경도 좌표 시스템(WGS84)의 좌표값으로 MTMapPoint 객체를 생성한다. + * @param mapPointGeo 위경도 좌표 시스템(WGS84)의 좌표값 + * @return MTMapPoint 객체 + */ ++ (instancetype)mapPointWithGeoCoord:(MTMapPointGeo)mapPointGeo; + +/** + * WCONG(Daum) 평면 좌표시스템의 좌표값으로 MTMapPoint 객체를 생성한다. + * @param mapPointWCONG WCONG(Daum) 평면 좌표시스템의 좌표값 + * @return MTMapPoint 객체 + */ ++ (instancetype)mapPointWithWCONG:(MTMapPointPlain)mapPointWCONG; + +/** + * CONG(Daum) 평면 좌표시스템의 좌표값으로 MTMapPoint 객체를 생성한다. + * @param mapPointCONG CONG(Daum) 평면 좌표시스템의 좌표값 + * @return MTMapPoint 객체 + */ ++ (instancetype)mapPointWithCONG:(MTMapPointPlain)mapPointCONG; + +/** + * WTM 평면 좌표시스템의 좌표값으로 MTMapPoint 객체를 생성한다. + * @param mapPointWTM WCONG(Daum) WTM 평면 좌표시스템의 좌표값 + * @return MTMapPoint 객체 + */ ++ (instancetype)mapPointWithWTM:(MTMapPointPlain)mapPointWTM; + +/** + * MapView의 좌상단 기준 Pixel 좌표값으로 MTMapPoint 객체를 생성한다. + * @param mapPointScreenLocation Pixel 좌표시스템의 좌표값 + * @return MTMapPoint 객체 + */ ++ (instancetype)mapPointWithScreenLocation:(MTMapPointPlain)mapPointScreenLocation; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 위경도 좌표시스템(WGS84)의 좌표값으로 조회한다. + * @return 위경도 좌표시스템(WGS84)의 좌표값 + */ +- (MTMapPointGeo)mapPointGeo; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 위경도 좌표시스템(WGS84)의 좌표값을 이용하여 재설정한다. + * @param mapPointGeo 위경도 좌표시스템(WGS84)의 좌표값 + */ +- (void)setMapPointGeo:(MTMapPointGeo)mapPointGeo; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 WCONG(Daum) 평면좌표계의 좌표값으로 조회한다. + * @return WCONG(Daum) 평면좌표계의 좌표값 + */ +- (MTMapPointPlain)mapPointWCONG; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 WCONG(Daum) 평면좌표계의 좌표값을 이용하여 재설정한다. + * @param mapPointWCONG WCONG(Daum) 평면좌표계의 좌표값 + */ +- (void)setMapPointWCONG:(MTMapPointPlain)mapPointWCONG; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 CONG(Daum) 평면좌표계의 좌표값으로 조회한다. + * @return CONG(Daum) 평면좌표계의 좌표값 + */ +- (MTMapPointPlain)mapPointCONG; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 CONG(Daum) 평면좌표계의 좌표값을 이용하여 재설정한다. + * @param mapPointCONG CONG(Daum) 평면좌표계의 좌표값 + */ +- (void)setMapPointCONG:(MTMapPointPlain)mapPointCONG; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 WTM 평면좌표계의 좌표값으로 조회한다. + * @return WCONG(Daum) WTM 평면좌표계의 좌표값 + */ +- (MTMapPointPlain)mapPointWTM; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 WTM 평면좌표계의 좌표값을 이용하여 재설정한다. + * @param mapPointWTM WTM 평면좌표계의 좌표값 + */ +- (void)setMapPointWTM:(MTMapPointPlain)mapPointWTM; + +/** + * MTMapPoint 객체가 나타내는 지점의 좌표값을 WTM 평면좌표계의 좌표값으로 조회한다. + * @return MapView 좌상단 기준 Pixel 좌표값 + */ +- (MTMapPointPlain)mapPointScreenLocation; + +@end + +/** + * 지도 화면의 영역을 표현하는 데이터 구조 + * 영역의 좌하단 지점과 우상단 지점을 각각 MTMapPoint 타입의 인자로 갖는다. + * @deprecated 제거될 예정. MTMapBoundsRect 클래스를 사용하세요. + */ +typedef struct { + __unsafe_unretained MTMapPoint* bottoomLeft; /**< 영역의 좌하단 좌표 */ + __unsafe_unretained MTMapPoint* topRight; /**< 영역의 우상단 좌표 */ +} MTMapBounds; + +/** + * 영역의 좌하단 좌표값과 우상단 좌표값으로 MTMapBounds 데이터 구조를 생성하는 매크로 + * @deprecated 제거될 예정. MTMapBoundsRect 클래스를 사용하세요. + * @param bottoomLeft 영역의 좌하단 좌표 + * @param topRight 영역의 우상단 좌표 + * @return MTMapBounds 데이터 구조 + */ +#define MTMapBoundsMake(bottoomLeft,topRight) (MTMapBounds){(MTMapPoint *)bottoomLeft, (MTMapPoint *)topRight} + +/** + * @brief 지도 화면의 영역을 표현하는 BoundsRect Class. + * 영역의 좌하단 지점과 우상단 지점을 각각 MTMapPoint 타입의 인자로 갖는다. + */ +@interface MTMapBoundsRect : NSObject + +/** + * MTMapBoundsRect 객체를 생성한다. autorelease 상태로 MTMapBoundsRect 객체를 생성하여 리턴한다. + */ + ++ (instancetype)boundsRect; + +/** + * 영역의 좌하단 좌표 + */ +@property (nonatomic, retain) MTMapPoint *bottomLeft; + +/** + * 영역의 우상단 좌표 + */ +@property (nonatomic, retain) MTMapPoint *topRight; + +@end + +/** + * 이미지 상의 한 픽셀의 위치를 표현하는 데이터 구조 + * 이미지의 좌하단이 offset (0,0)이 되고 오른쪽 방향이 x+ 위쪽 방향이 y+ 가 된다. + * @see MTMapPOIItem.customImageAnchorPointOffset + */ +typedef struct { + int offsetX; /**< x 픽셀 좌표 */ + int offsetY; /**< y 픽셀 좌표 */ +} MTMapImageOffset; + +/** + * 현위치 정확도를 나타내는 데이터 타입 (단위:meter) + */ +typedef double MTMapLocationAccuracy; + +/** + * 지도 회전 각도를 나타내는 데이터 타입 (단위:degree) + */ +typedef float MTMapRotationAngle; + +/** + * x/y offset 값으로 MTMapImageOffset 데이터 구조를 생성하는 매크로 + * @param offsetX x offset 값 + * @param offsetY y offset 값 + * @return MTMapImageOffset 데이터 구조 + */ +#define MTMapImageOffsetMake(offsetX, offsetY) (MTMapImageOffset){(int)offsetX, (int)offsetY} diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapLocationMarkerItem.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapLocationMarkerItem.h new file mode 100644 index 0000000..d289ca3 --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapLocationMarkerItem.h @@ -0,0 +1,122 @@ +/** + * @brief Map Location Marker Item Class + * @file MTMapLocationMarkerItem.h + * @author Soo-hyun Park (goaeng0824@daumcorp.com) + * @date 2014/6/16 + * @copyright + * Copyright 2014 Daum Communications Corp. All rights reserved. + */ + +#import +#import + +/** + * @brief 지도화면 위에 추가되는 현위치 마커 Item에 해당하는 Class. + * 지도화면 위의 현위치 마커를 개발자가 원하는 UI로 바꿔주기 위해서는 + * MTMapLocationMarkerItem 객체를 생성하여 MTMapView 객체에 등록해 주어야 한다. (updateCurrentLocationMarker:) + * Default로 제공되는 현위치 마커를 사용하기 위해서는 + * MTMapLocationMarkerItem 객체의 값을 nil로 넘겨준다. + * @see MTMapView + */ + +@interface MTMapLocationMarkerItem : NSObject { +@private + NSString* _customImageName; + NSString* _customTrackingImageName; + NSArray* _customTrackingAnimationImageNames; + float _customTrackingAnimationDuration; + NSString* _customDirectionImageName; + MTMapImageOffset _customImageAnchorPointOffset; + MTMapImageOffset _customTrackingImageAnchorPointOffset; + MTMapImageOffset _customDirectionImageAnchorPointOffset; + float _radius; + UIColor *_strokeColor; + UIColor *_fillColor; +} + +/** + * MTMapLocationMarkerItem 객체를 생성한다. autorelease 상태로 MTMapLocationMarkerItem 객체를 생성하여 리턴한다. + */ + ++ (instancetype)mapLocationMarkerItem; + +/** + * 기본 제공되는 Map Location Marker 아이콘 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지를 사용하고자 하는 경우에 + * 사용하고자 하는 Image 이름을 지정한다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + */ +@property (nonatomic, copy) NSString* customImageName; + +/** + * 기본 제공되는 Map Location Marker의 Tracking 중인 아이콘 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지를 사용하고자 하는 경우에 + * 사용하고자 하는 Image 이름을 지정한다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + */ +@property (nonatomic, copy) NSString* customTrackingImageName; + +/** + * 기본 제공되는 Map Location Marker의 Tracking 중인 아이콘 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지들로 애니매이션을 보여주고 싶은 경우 + * 애니매이션에 사용하고자 하는 Image 이름들을 순서대로 지정한다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + */ +@property (nonatomic, copy) NSArray* customTrackingAnimationImageNames; + +/** + * 기본 제공되는 Map Location Marker의 Tracking 중인 아이콘 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지들로 애니매이션을 보여주고 싶은 경우 + * 애니매이션의 duration을 지정한다. default = 1.0 초 + */ +@property (nonatomic, assign) float customTrackingAnimationDuration; + +/** + * 기본 제공되는 Map Location Marker의 방향 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지를 사용하고자 하는 경우에 + * 사용하고자 하는 Image 이름을 지정한다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + */ +@property (nonatomic, copy) NSString* customDirectionImageName; + +/** + * customImageName에 지정한 이미지 상의 어느 지점이 현위치 지점에 해당하는 지를 설정한다. + * 이미지 상의 Pixel 좌표를 지정한다. 이미지의 좌하단이 원점(0,0)이고 오른쪽 방향이 x+축, 위쪽 방향이 y+축이 된다. + * 예를들어, 이미지의 pixel 크기가 60x60인 Custom Image의 + * 정중앙이 현위치 좌표 지점에 해당된다면 + * mapView.customImageAnchorPointOffset = MTMapImageOffsetMake(30,30) 와 같이 지정할 수 있다. + * 값을 지정하지 않는 경우 이미지의 중앙이 Anchor Point로 설정된다. + */ +@property (nonatomic, assign) MTMapImageOffset customImageAnchorPointOffset; + +/** + * customImageName에 지정한 이미지 상의 어느 지점이 현위치 지점에 해당하는 지를 설정한다. + * 이미지 상의 Pixel 좌표를 지정한다. 이미지의 좌하단이 원점(0,0)이고 오른쪽 방향이 x+축, 위쪽 방향이 y+축이 된다. + * 예를들어, 이미지의 pixel 크기가 60x60인 Custom Image의 + * 정중앙이 현위치 좌표 지점에 해당된다면 + * mapView.customTrackingImageAnchorPointOffset = MTMapImageOffsetMake(30,30) 와 같이 지정할 수 있다. + * 값을 지정하지 않는 경우 이미지의 중앙이 Anchor Point로 설정된다. + */ +@property (nonatomic, assign) MTMapImageOffset customTrackingImageAnchorPointOffset; + +/** + * customImageName에 지정한 이미지 상의 어느 지점이 현위치 지점에 해당하는 지를 설정한다. + * 이미지 상의 Pixel 좌표를 지정한다. 이미지의 좌하단이 원점(0,0)이고 오른쪽 방향이 x+축, 위쪽 방향이 y+축이 된다. + * 예를들어, 이미지의 pixel 크기가 60x60인 Custom Image의 + * 하단 변(edge)의 정중앙이 좌표 지점에 해당된다면 + * mapView.customTrackingImageAnchorPointOffset = MTMapImageOffsetMake(30,0) 와 같이 지정할 수 있다. + * 값을 지정하지 않는 경우 이미지의 하단 중앙이 Anchor Point로 설정된다. + */ +@property (nonatomic, assign) MTMapImageOffset customDirectionImageAnchorPointOffset; + +/** + * 기본 제공되는 Map Location Marker의 Circle 반경 값을 지정한다. + */ +@property (nonatomic, assign) float radius; + +/** + * 기본 제공되는 Map Location Marker의 Circle 선 색상을 지정한다. + */ +@property (nonatomic, retain) UIColor* strokeColor; + +/** + * 기본 제공되는 Map Location Marker의 Circle 영역 색상을 지정한다. + */ +@property (nonatomic, retain) UIColor* fillColor; + +@end diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapPOIItem.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapPOIItem.h new file mode 100644 index 0000000..087d4ca --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapPOIItem.h @@ -0,0 +1,252 @@ +/** + * @brief Map POI Item Class + * @file MTMapPOIItem.h + * @author Byung-Wan Lim (bwlim@daumcorp.com) + * @date 2011/11/10 + * @copyright + * Copyright 2012 Daum Communications Corp. All rights reserved. + */ + +#import +#import + +/** + * POI Item 아이콘(마커) 타입 enumeration + * @see MTMapPOIItem.markerType property + */ +typedef NS_ENUM(NSInteger, MTMapPOIItemMarkerType) { + MTMapPOIItemMarkerTypeBluePin, /**< 파란색 핀 */ + MTMapPOIItemMarkerTypeRedPin, /**< 빨간색 핀 */ + MTMapPOIItemMarkerTypeYellowPin, /**< 노란색 핀 */ + MTMapPOIItemMarkerTypeCustomImage /**< 개발자가 지정한 POI Item 아이콘 이미지 사용 */ +}; + +/** + * POI Item 아이콘(마커)가 선택되어진 상태 타입 enumeration + * @see MTMapPOIItem.markerSelectedType property + */ +typedef NS_ENUM(NSInteger, MTMapPOIItemMarkerSelectedType) { + MTMapPOIItemMarkerSelectedTypeNone, /**< 선택 효과를 사용하지 않음 */ + MTMapPOIItemMarkerSelectedTypeBluePin, /**< 파란색 핀 */ + MTMapPOIItemMarkerSelectedTypeRedPin, /**< 빨간색 핀 */ + MTMapPOIItemMarkerSelectedTypeYellowPin, /**< 노란색 핀 */ + MTMapPOIItemMarkerSelectedTypeCustomImage /**< 개발자가 지정한 POI Item 아이콘 이미지 사용 */ +}; + +/** + * POI Item이 화면에 추가될때 애니매이션 타입 enumeration + * @see MTMapPOIItem.showAnimationType property + */ +typedef NS_ENUM(NSInteger, MTMapPOIItemShowAnimationType) { + MTMapPOIItemShowAnimationTypeNoAnimation, /**< 애니매이션 없음 */ + MTMapPOIItemShowAnimationTypeDropFromHeaven, /**< POI Item 아이콘이 하늘에서 지도 위로 떨어지는 애니매이션 */ + MTMapPOIItemShowAnimationTypeSpringFromGround /**< POI Item 아이콘이 땅위에서 스프링처럼 튀어나오는 듯한 애니매이션 */ +}; + +/** + * @brief 지도화면 위에 추가되는 POI(Point Of Interest) Item에 해당하는 Class. + * 지도화면 위에 POI 아이콘(마커)를 추가하기 위해서는 + * MTMapPOIItem 객체를 생성하여 MTMapView객체에 등록해 주어야 한다. (MTMapView.addPOIItem:, MTMapView.addPOIItems:) + * 이미 제공되고 있는 POI Item 아이콘을 그대로 사용할 수도 있고, + * 개발자가 지정한 임의의 이미지를 POI Item 아이콘으로 사용할 수 있다. + * MTMapView에 등록된 POI Item을 사용자가 선택하면 + * POI Item 아이콘(마커)위에 말풍선(Callout Balloon)이 나타나게 되며 + * 말풍선에는 POI Item 이름이 보여지게 된다. + * 단말 사용자가 길게 누른후(long press) 끌어어(dragging) 위치를 이동시킬 수 있는 + * Draggable POI Item 도 생성하여 MTMapViewd에 등록할 수 있다. + * @see MTMapView + */ +@interface MTMapPOIItem : NSObject { +@private + NSString* _itemName; + MTMapPoint* _mapPoint; + MTMapPOIItemMarkerType _markerType; + MTMapPOIItemMarkerSelectedType _markerSelectedType; + MTMapPOIItemShowAnimationType _showAnimationType; + BOOL _showDisclosureButtonOnCalloutBalloon; + BOOL _draggable; + NSInteger _tag; + NSObject* _userObject; + NSString* _customImageName; + NSString* _customSelectedImageName; + UIImage* _customImage; + UIImage* _customSelectedImage; + + NSString* _imageNameOfCalloutBalloonLeftSide; + NSString* _imageNameOfCalloutBalloonRightSide; + MTMapImageOffset _customImageAnchorPointOffset; + UIView* _customCalloutBalloonView; + UIView* _customHighlightedCalloutBalloonView; +} + +/** + * MTMapPOIItem 객체를 생성한다. autorelease 상태로 MTMapPOIItem 객체를 생성하여 리턴한다. + */ ++ (instancetype)poiItem; + +/** + * POI Item 이름을 지정한다. + * POI Item 아이콘이 선택되면 나타나는 말풍선(Callout Balloon)에 POI Item 이름이 보여지게 된다. + */ +@property (nonatomic, copy) NSString* itemName; + +/** + * POI Item의 지도상 좌표 + */ +@property (nonatomic, retain) MTMapPoint* mapPoint; + +/** + * POI Item 아이콘(마커) 타입 + * 기본 제공 POI Item 아이콘을 사용하거나, + * 개발자가 지정한 임의의 이미지를 POI Item 아이콘으로 사용할 수 있다. + * default = MTMapPOIItemMarkerTypeBluePin + * @see MTMapPOIItemMarkerType + */ +@property (nonatomic, assign) MTMapPOIItemMarkerType markerType; + +/** + * POI Item 아이콘(마커)가 선택되어진 상태 타입 + * 기본 제공 POI Item 아이콘을 사용하거나, + * 개발자가 지정한 임의의 이미지를 POI Item 아이콘으로 사용할 수 있다. + * default = MTMapPOIItemMarkerTypeNone + * @see MTMapPOIItemMarkerSelectedType + */ +@property (nonatomic, assign) MTMapPOIItemMarkerSelectedType markerSelectedType; + +/** + * POI Item이 지도화면에 나타날때 애니매이션 종류를 지정한다. + * default = MTMapPOIItemShowAnimationTypeNoAnimation + * @see MTMapPOIItemShowAnimationType + */ +@property (nonatomic, assign) MTMapPOIItemShowAnimationType showAnimationType; + +/** + * POI Item이 사용자에 의해 선택된 경우 나타나는 말풍선에 나타나는 글자 마지막에 + * Disclosure Button 이미지(꺽쇠(>)모양 이미지)를 표시할지 여부를 지정한다. + * default = YES + */ +@property (nonatomic, assign) BOOL showDisclosureButtonOnCalloutBalloon; + +/** + * 사용자가 위치를 변경할 수 있는 POI Item을 생성하려면 + * draggable property를 YES로 지정한다. + * draggable = YES인 POI Item(Draggable POI Item)을 사용자가 터치하면 POI Item을 사용자가 이동할 수 있음을 알려주는 + * 안내문구가 지도화면에 나타난다. + * 사용자가 Draggable POI Item을 길게 누른 후(long press) 원하는 위치로 끌어서(dragging) + * POI Item의 위치를 변경할 수 있다. + * 변경된 POI Item의 위치는 MTMapViewDelegate.MTMapView:draggablePOIItem:movedToNewMapPoint: 메소드를 통해 + * 통보받을 수 있다. + * default = NO + * @see MTMapViewDelegate + */ +@property (nonatomic, assign) BOOL draggable; + +/** + * POI Item 객체에 임의의 정수값(tag)을 지정할 수 있다. + * MTMapView 객체에 등록된 POI Item들 중 특정 POI Item을 찾기 위한 식별자로 사용할 수 있다. + * tag값을 반드시 지정해야 하는 것은 아니다. + * @see MTMapView.findPOIItemByTag: + */ +@property (nonatomic, assign) NSInteger tag; + +/** + * 해당 POI Item과 관련된 정보를 저장하고 있는 임의의 객체를 저장하고자 할때 사용한다. + * 사용자가 POI Item을 선택하는 경우 등에 선택된 POI Item과 관련된 정보를 손쉽게 접근할 수 있다. + */ +@property (nonatomic, retain) NSObject* userObject; + +/** + * markerType이 MTMapPOIItemMarkerTypeCustomImage인 경우에만 지정한다. + * 기본 제공되는 POI Item 아이콘 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지를 사용하고자 하는 경우에 + * 사용하고자 하는 Image 이름을 지정한다. Application Bundle에 포함된 + * Image Resource 이름(ex. "MyPOIIconImage.png")을 지정할 수 있다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + * @see MTMapPOIItemMarkerTypeCustomImage + */ +@property (nonatomic, copy) NSString* customImageName; + +/** + * markerType이 MTMapPOIItemMarkerSelectedTypeCustomImage인 경우에만 지정한다. + * 개발자가 지정한 Custom 이미지를 사용하고 있는 POI Item 아이콘(마커)이 선택되었을 경우에 + * 사용하고자 하는 Image 이름을 지정한다. Application Bundle에 포함된 + * Image Resource 이름(ex. "MyPOIIconImage.png")을 지정할 수 있다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + * @see MTMapPOIItemMarkerTypeCustomImage + */ +@property (nonatomic, copy) NSString* customSelectedImageName; + +/** + * markerType이 MTMapPOIItemMarkerTypeCustomImage인 경우에만 지정한다. + * 기본 제공되는 POI Item 아이콘 이미지를 사용하지 않고, 개발자가 지정한 Custom 이미지를 사용하고자 하는 경우에 + * 사용하고자 하는 Runtime 시에 생성한 이미지의 UIImage 객체를 지정한다. + * customImageName에 값이 지정되어 있는 경우는 customImageName의 값이 우선 적용 된다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + * @see MTMapPOIItemMarkerTypeCustomImage + */ +@property (nonatomic, copy) UIImage* customImage; + +/** + * markerType이 MTMapPOIItemMarkerSelectedTypeCustomImage인 경우에만 지정한다. + * 개발자가 지정한 Custom 이미지를 사용하고 있는 POI Item 아이콘(마커)이 선택되었을 경우에 + * 사용하고자 하는 Runtime 시에 생성한 이미지의 UIImage 객체를 지정한다. + * customSelectedImageName에 값이 지정되어 있는 경우는 customSelectedImageName의 값이 우선 적용 된다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + * @see MTMapPOIItemMarkerTypeCustomImage + */ +@property (nonatomic, copy) UIImage* customSelectedImage; + +/** + * POI Item이 사용자에 의해 선택된 경우 나타나는 말풍선의 왼쪽 끝에 + * 사용하고자 하는 Image 이름을 지정한다. Application Bundle에 포함된 + * Image Resource 이름(ex. "MyPOIIconImage.png")을 지정할 수 있다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + */ +@property (nonatomic, copy) NSString* imageNameOfCalloutBalloonLeftSide; + +/** + * POI Item이 사용자에 의해 선택된 경우 나타나는 말풍선의 오른쪽 끝에 + * 사용하고자 하는 Image 이름을 지정한다. Application Bundle에 포함된 + * Image Resource 이름(ex. "MyPOIIconImage.png")을 지정할 수 있다. + * Custom Image는 Screen Scale = 2.0(Retina Display)에 대응하는 고해상도 이미지를 지정해야 한다. + */ +@property (nonatomic, copy) NSString* imageNameOfCalloutBalloonRightSide; + +/** + * markerType이 MTMapPOIItemMarkerTypeCustomImage인 경우에만 지정한다. + * customImageName에 지정한 이미지 상의 어느 지점이 POI Item의 좌표 지점에 해당하는 지를 설정한다. + * 이미지 상의 Pixel 좌표를 지정한다. 이미지의 좌하단이 원점(0,0)이고 오른쪽 방향이 x+축, 위쪽 방향이 y+축이 된다. + * 예를들어, 이미지의 pixel 크기가 60x60인 Custom Image의 + * 하단 변(edge)의 정중앙이 POI Item 좌표 지점에 해당된다면 + * mapView.customImageAnchorPointOffset = MTMapImageOffsetMake(30,0) 와 같이 지정할 수 있다. + * 값을 지정하지 않는 경우 이미지의 하단 중앙이 Anchor Point로 설정된다. + * @see MTMapPOIItemMarkerTypeCustomImage + */ +@property (nonatomic, assign) MTMapImageOffset customImageAnchorPointOffset; + +/** + * POI Item이 사용자에 의해 선택된 경우 나타나는 말풍선 대신 + * Custom View를 지정할 수 있다. + * @see customHighlightedCalloutBalloonView + */ +@property (nonatomic, retain) UIView* customCalloutBalloonView; + +/** + * POI Item이 사용자에 의해 선택된 경우 나타나는 말풍선 대신 + * Custom View를 사용할 경우에만 지정한다. + * Custom View가 선택되어진 상태일 때의 View를 + * 별도로 지정할 수 있다. + * @see customCalloutBalloonView + */ +@property (nonatomic, retain) UIView* customHighlightedCalloutBalloonView; + +/** + * POI Item이 나타내는 Marker의 회전 각을 지정 한다. + * 각도는 0~360의 값을 지정하면 된다. + */ +@property (nonatomic, assign) float rotation; + + +- (void) move:(MTMapPoint*)pt withAnimation:(BOOL)animate; + + +@end diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapPolyline.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapPolyline.h new file mode 100644 index 0000000..c90deba --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapPolyline.h @@ -0,0 +1,77 @@ +/** + * @brief Map Polyline Class + * @file MTMapPolyline.h + * @author Byung-Wan Lim (bwlim@daumcorp.com) + * @date 2011/11/10 + * @copyright + * Copyright 2012 Daum Communications Corp. All rights reserved. + */ + +#import +#import +#import + +/** + * @brief 지도도화면 위에 추가되는 Polyline에 해당하는 Class. + * Polyline은 여러 개의 점들을 순서대로 연결한 선들의 집합이다. + * 지도화면 위에 Polyline을 추가하여 경로나 영역등을 표현할 수 있다. + * 지도화면 위에 Polyline을 추가하기 위해서는 + * MTMapPolyline 객체를 생성하여 MTMapView객체에 등록해 주어야 한다. + * (MTMapView.addPolyline:) + * Polyline을 구성하는 좌표 리스트를 설정하고 선 색상을 지정할 수 있다. + * @see MTMapView + */ +@interface MTMapPolyline : NSObject { +@private + NSMutableArray* _mapPointList; + UIColor* _polylineColor; + NSInteger _tag; +} + +/** + * MTMapPolyline 객체를 생성한다. autorelease 상태로 MTMapPolyline 객체를 생성하여 리턴한다. + */ ++ (instancetype)polyLine; + +/** + * MTMapPolyline 객체를 생성하고 Polyline을 구성하는 점들을 저장하는 Array의 크기를 미리 지정한다. + * autorelease 상태로 MTMapPolyline 객체를 생성하여 리턴한다. + * Polyline을 구성하는 점들의 개수를 미리 알수 있는 경우 capacity값을 지정하면 메모리를 효율적으로 사용할 수 있다. + * @param capacity Polyline을 구성하는 점들의 좌표를 저장하는 Array의 메모리 할당 크기 (Polyline의 점 개수를 지정한다.) + */ ++ (instancetype)polyLineWithCapacity:(NSUInteger)capacity; // capacity : reserved map point array size + +/** + * Polyline을 구성하는 점들의 리스트를 조회할 수 있다. + */ +@property (nonatomic, readonly) NSArray* mapPointList; + +/** + * Polyline의 선 색상을 지정한다. + */ +@property (nonatomic, retain) UIColor* polylineColor; + +/** + * Polyline 객체에 임의의 정수값(tag)을 지정할 수 있다. + * MTMapView에 등록된 Polyline들 중 특정 Polyline을 찾기 위한 식별자로 사용할 수 있다. + * tag값을 반드시 지정해야 하는 것은 아니다. + * @see MTMapView.findPolylineByTag: + */ +@property (nonatomic, assign) NSInteger tag; + + +/** + * Polyline에 점 하나를 추가한다. + * Polyline 객체가 MTMapView에 등록된 후에는 점들을 추가해도 지도화면에 반영되지 않는다. + * @param mapPoint 추가하고자 하는 점의 좌표 객체 + */ +- (void)addPoint:(MTMapPoint*)mapPoint; + +/** + * Polyline에 점 리스트를 추가한다. + * Polyline 객체가 MTMapView 객체에 등록된 후에는 점들을 추가해도 지도화면에 반영되지 않는다. + * @param mapPointList 추가하고자 하는 점들의 좌표 객체 리스트 + */ +- (void)addPoints:(NSArray*)mapPointList; // Array of MTMapPoint + +@end diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapReverseGeoCoder.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapReverseGeoCoder.h new file mode 100644 index 0000000..affa553 --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapReverseGeoCoder.h @@ -0,0 +1,129 @@ +/** + * @brief Map POI Item Class + * @file MTMapReverseGeoCoder.h + * @author Byung-Wan Lim (bwlim@daumcorp.com) + * @date 2011/11/17 + * @copyright + * Copyright 2012 Daum Communications Corp. All rights reserved. + */ + +#import +#import + +@class MTMapReverseGeoCoderInternal; +@protocol MTMapReverseGeoCoderDelegate; + +/** + * @brief 지도 좌표를 주소 정보로 변환(Reverse Geo-Coding)하는 기능을 제공하는 Class + */ +@interface MTMapReverseGeoCoder : NSObject { +@private + MTMapReverseGeoCoderInternal* _internalImpl; +} + +enum AddressType { ShortAddress = 1, FullAddress }; + + +/** + * MTMapReverseGeoCoder 객체를 생성한다. + * 주소정보를 알고자 하는 지도 좌표와 Reverse Geo-coding 결과를 통보받을 수 있는 delegate 객체를 설정한다. + * 비동기(Asynchronous) 방식으로 Reverse Geo-coding을 수행하고자 하는 경우 MTMapReverseGeoCoder 객체를 생성한다. + * 동기(Synchronous, Blocking) 방식으로 Reverse Geo-coding을 실행하는 경우에는 findAddressForMapPoint:withAddressType: static 메소드를 사용한다. + * @deprecated 제거될 예정입니다. 비동기(Asynchronous) 방식으로 Reverse Geo-coding을 수행하고자 하는 경우 executeFindingAddressForMapPoint:openAPIKey:completionHandler: 를 사용하십시오. + * @param mapPoint 주소정보로 변화하고자하는 지도 좌표 + * @param delegate Reverse Geo-coding 결과를 통보받을 수 있는 delegate 객체 + * @param openAPIKey Open API Key + */ +- (instancetype)initWithMapPoint:(MTMapPoint*)mapPoint withDelegate:(id)delegate withOpenAPIKey:(NSString*)openAPIKey; + +/** + * Reverse Geo-coding(Asynchronous) 서비스를 요청한다. + * 주소 정보는 비동기 방식으로 delegate 객체에 전달된다. + * @deprecated executeFindingAddressForMapPoint:openAPIKey:completionHandler: 를 사용하십시오. + */ +- (void)startFindingAddress; + +/** + * @deprecated executeFindingAddressForMapPoint:openAPIKey:addressType:completionHandler: 를 사용하십시오. + * @param addressType 변환 받을 주소 정보의 타입 + */ +- (void)startFindingAddressWithAddressType:(enum AddressType)addressType; + +/** + * Reverse Geo-coding(Asynchronous) 서비스 요청을 취소한다. + */ +- (void)cancelFindingAddress; + +/** + * 동기(Synchronous, Blocking) 방식으로 Reverse Geo-coding 을 수행한다. + * 메소드를 호출한 thread는 Reverse Geo-Coding 서비스가 수행되는 동한 block된 후 + * 변환된 주소정보를 리턴받는다. + * @param mapPoint 주소정보로 변화하고자하는 지도 좌표 + * @param openAPIKey Open API Key + * @return 주소정보 문자열 + */ ++ (NSString *)findAddressForMapPoint:(MTMapPoint*)mapPoint withOpenAPIKey:(NSString*)openAPIKey; + +/** + * @param mapPoint 주소정보로 변화하고자하는 지도 좌표 + * @param openAPIKey Open API Key + * @param addressType 변환 받을 주소 정보의 타입 + * @return 주소정보 문자열 + */ ++ (NSString *)findAddressForMapPoint:(MTMapPoint*)mapPoint withOpenAPIKey:(NSString*)openAPIKey withAddressType:(enum AddressType)addressType; + +/** + * Reverse Geo-coding 서비스 호출 결과 block 타입 + */ +typedef void (^MTMapReverseGeoCoderCompletionHandler) (BOOL success, NSString *addressForMapPoint, NSError *error); + +/** + * 비동기(Asynchronous) 방식으로 Reverse Geo-coding을 수행한다. + * 변환 받을 주소 정보는 addressType의 default 값인 ShortAddress인 형태로 요청한다. + * @param mapPoint 주소 정보로 변화하고자하는 지도 좌표 + * @param openAPIKey Open API Key + * @param handler Reverse Geo-Coding 서비스 호출 결과의 block + */ ++ (void)executeFindingAddressForMapPoint:(MTMapPoint *)mapPoint + openAPIKey:(NSString *)openAPIKey + completionHandler:(MTMapReverseGeoCoderCompletionHandler)handler; + +/** + * 비동기(Asynchronous) 방식으로 Reverse Geo-coding을 수행한다. + * @param mapPoint 주소 정보로 변화하고자하는 지도 좌표 + * @param openAPIKey Open API Key + * @param addressType 변환 받을 주소 정보의 타입 + * @param handler Reverse Geo-Coding 서비스 호출 결과의 block + */ ++ (void)executeFindingAddressForMapPoint:(MTMapPoint *)mapPoint + openAPIKey:(NSString *)openAPIKey + addressType:(enum AddressType)addressType + completionHandler:(MTMapReverseGeoCoderCompletionHandler)handler; + +@end + + +/** + * Reverse Geo-Coding 결과를 비동기적으로 통보받는 객체가 구현해야하는 interface protocol + * @deprecated 제거될 예정입니다. + */ +@protocol MTMapReverseGeoCoderDelegate +@optional + +/** + * 주소를 찾은 경우 호출된다. + * @deprecated 제거될 예정입니다. + * @param rGeoCoder MTMapReverseGeoCoder 객체 + * @param addressString 결과 주소 문자열 + */ +- (void)MTMapReverseGeoCoder:(MTMapReverseGeoCoder*)rGeoCoder foundAddress:(NSString*)addressString; + +/** + * Reverse Geo-Coding 서비스 호출에 실패한 경우 호출된다. + * @deprecated 제거될 예정입니다. + * @param rGeoCoder MTMapReverseGeoCoder 객체 + * @param error NSError 객체 + */ +- (void)MTMapReverseGeoCoder:(MTMapReverseGeoCoder*)rGeoCoder failedToFindAddressWithError:(NSError*)error; + +@end diff --git a/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapView.h b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapView.h new file mode 100644 index 0000000..25009cc --- /dev/null +++ b/DaumMap.embeddedframework/DaumMap.framework/Headers/MTMapView.h @@ -0,0 +1,567 @@ +/** + * @brief Daum Map View Class + * @file MTMapView.h + * @author Byung-Wan Lim (bwlim@daumcorp.com) + * @date 2011/11/04 + * @copyright + * Copyright 2012 Daum Communications Corp. All rights reserved. + */ + +#import +#import +#import +#import +#import +#import + + +@class MTMapViewInternal; +@class MTMapCameraUpdate; + +@protocol MTMapViewDelegate; + +/** + * 지도 종류 enumeration + * @see MTMapView.baseMapType property + */ +typedef NS_ENUM(NSInteger, MTMapType) { + MTMapTypeStandard, /**< 기본 지도 */ + MTMapTypeSatellite, /**< 위성 지도 */ + MTMapTypeHybrid /**< 하이브리드 지도 */ +}; + +/** + * 현위치 트랙킹 타입 enumeration + * @see MTMapView.currentLocationTrackingMode property + */ +typedef NS_ENUM(NSInteger, MTMapCurrentLocationTrackingMode) { + MTMapCurrentLocationTrackingOff, /**< 현위치 트랙킹 모드 및 나침반 모드 Off */ + MTMapCurrentLocationTrackingOnWithoutHeading, /**< 현위치 트랙킹 모드 On, 단말의 위치에 따라 지도 중심이 이동한다. 나침반 모드는 꺼진 상태 */ + MTMapCurrentLocationTrackingOnWithHeading, /**< 현위치 트랙킹 모드 On + 나침반 모드 On, 단말의 위치에 따라 지도 중심이 이동하며 단말의 방향에 따라 지도가 회전한다.(나침반 모드 On) */ + MTMapCurrentLocationTrackingOnWithoutHeadingWithoutMapMoving, + MTMapCurrentLocationTrackingOnWithHeadingWithoutMapMoving, +}; + +/** + * Zoom Level 데이터 타입 (integer) + */ +typedef int MTMapZoomLevel; + +/** + * @brief Daum 지도 화면을 보여주는 View Class. + * MTMapView를 생성하여 Daum 지도 화면을 보여주는 View를 사용할 수 있다. + * 지도 종류 지정, 지도 화면 이동/확대/축소, + * 현위치 트래킹 및 나침반 모드, POI Item(MTMapPOIItem) 관리, Polyline(MTMapPolyline) 관리 등의 기능이 제공된다. + * MTMapViewDelegate protocol을 구현하는 delegate객체를 지정하여 + * 지도에서 발생하는 다양한 이벤트들을 통보받을 수 있다. + * 동시에 두개 이상의 MTMapView 객체를 생성하여 사용하는 것은 허용되지 않는다. + * @see MTMapPoint, MTMapPOIItem, MTMapPolyline, MTMapViewDelegate + */ +@interface MTMapView : UIView { +@private + MTMapViewInternal* _internalImpl; +} + +/** + * Daum Map Open API Key 발급 페이지에서 발급 받은 API Key를 설정한다. + * Open API Key 는 App. Bundle Id 당 하나씩 발급 된다. + * Open API Key는 지도화면이 화면에 보여지기 전에 반드시 설정되어야 한다. + * 설정된 Open API Key가 정상적으로 등록되지 않은 Key 이거나 + * 트래픽 제한에 걸린 경우에는 다음 지도 화면 사용이 제한될 수 있다. + */ +@property (nonatomic, retain) NSString *daumMapApiKey __deprecated_msg("Info.plist의 KAKAO_APP_KEY의 값을 읽어 오도록 수정되었습니다. daumMapApiKey는 더이상 작동 하지 않습니다."); + +/** + * 지도 객체에서 발생하는 이벤트를 처리할 delegate 객체를 설정한다. + * delegate 객체는 Open API Key 인증 결과 이벤트, 지도 이동/확대/축소, + * 지도 화면 터치(Single Tap / Double Tap / Long Press) 이벤트, + * 현위치 트래킹 이벤트, POI(Point Of Interest) 관련 이벤트를 통보받을 수 있다. + */ +@property (nonatomic, assign) id delegate; + +/** + * 지도 종류(기본 지도, 위성 지도, 하이브리드 지도)를 지정하거나 현재 보여주고 있는 지도 종류를 확인할 수 있다. + */ +@property (nonatomic) MTMapType baseMapType; + +/** + * 고해상도 지도 타일 사용 여부를 설정한다. + * Retina Display인 경우 기본값은 YES, 아닌경우 기본값은 NO + */ +@property (nonatomic) BOOL useHDMapTile; + +/** + * 지도 타일 이미지 Persistent Cache 기능 활성화 여부를 조회한다. + * @return Persistent Cache 기능 활성화 여부 + */ ++ (BOOL)isMapTilePersistentCacheEnabled; + +/** + * 지도 타일 이미지 Persistent Cache 기능은 + * 네트워크를 통해 다운로드한 지도 이미지 데이터를 + * 단말의 영구(persistent) 캐쉬 영역에 저장하는 기능이다. + * 같은 영역의 지도를 다시 로드할때 캐쉬에 저장된 지도 타일들은 + * 네트워크를 통해 다운로드 받지 않고 단말의 캐쉬에서 바로 로드하여 + * 네트워크 사용량을 줄이고 지도 로딩 시간을 단축할 수 있다. + * 사용되지 않는 지도 타일 이미지 캐쉬 데이터는 MapView 동작 중에 자동으로 + * 삭제되어 캐쉬 용량의 크기가 너무 커지지 않도록 조절된다. + * Application의 Cache 영역 사용량이 부담이 되면 Cache 기능을 비활성화 하는 것이 좋다. + * MTMapView가 동작하는 중에는 Cache 기능 활성화 설정 변경이 적용되지 않으며 + * MTMapView를 사용하기 전에 Cache 활성화 여부를 설정해야 한다. + * @param enableCache Persistent Cache 기능 활성화 여부 + */ ++ (void)setMapTilePersistentCacheEnabled:(BOOL)enableCache; + +/** + * Application의 Document Directory의 임시 디렉토리에 + * 저장된 지도 타일 캐쉬 데이터를 모두 삭제한다. + * MTMapView가 동작 중인 상태에서도 사용가능하다. + */ ++ (void)clearMapTilePersistentCache; + +/** + * 현위치를 표시하는 아이콘(마커)를 화면에 표시할지 여부를 설정한다. + * currentLocationTrackingMode property를 이용하여 현위치 트래킹 기능을 On 시키면 자동으로 현위치 마커가 보여지게 된다. + * 현위치 트래킹 기능을 Off한 후에 현위치 아이콘을 지도 화면에서 제거할 때 사용할 수 있다. + */ +@property (nonatomic) BOOL showCurrentLocationMarker; + +/** + * 화면상에 보이는 현위치 마커의 UI를 업데이트 한다. + * @param locationMarkerItem 현위치 마커 정보. nil일 경우, Default 현위치 마커로 노출된다. + */ +- (void)updateCurrentLocationMarker:(MTMapLocationMarkerItem *)locationMarkerItem; + +/** + * 현위치 트래킹 모드 및 나침반 모드를 설정한다. + * - 현위치 트래킹 모드 : 지도화면 중심을 단말의 현재 위치로 이동시켜줌 + * - 나침반 모드 : 단말의 방향에 따라 지도화면이 회전됨 + * 현위치 트래킹 모드만 On시키거나 현위치 트래킹 모드, 나침반 모드 둘다 On 시킬 수 있다. + * 현위치 트래킹/나침반 모드를 활성화 시키면 현위치 정보가 설정된 MTMapViewDelegate 객체에 전달된다. + * @see MTMapCurrentLocationTrackingMode + * @see MTMapViewDelegate + */ +@property (nonatomic) MTMapCurrentLocationTrackingMode currentLocationTrackingMode; + +/** + * 현재 지도 화면의 중심점을 확인할 수 있다. + */ +@property (nonatomic, readonly) MTMapPoint* mapCenterPoint; + +/** + * 현재 지도 화면의 좌하단, 우상단 영역을 확인할 수 있다. + */ +@property (nonatomic, readonly) MTMapBoundsRect* mapBounds; + + +/** + * 현재 지도 화면의 확대/축소 레벨을 확인할 수 있다. + */ +@property (nonatomic, readonly) MTMapZoomLevel zoomLevel; + +/** + * 현재 지도화면의 회전 각도(360 degree)를 확인할 수 있다. + */ +@property (nonatomic, readonly) MTMapRotationAngle mapRotationAngle; + +//@property (nonatomic) BOOL zoomEnabled; +//@property (nonatomic) BOOL panEnabled; + +/** + * 지도 화면의 중심점을 설정한다. + * @param mapPoint 지도화면 중심점을 나타내는 MTMapPoint 객체 + * @param animated 지도화면 중심점 이동시 애니매이션 효과를 적용할지 여부 + */ +- (void)setMapCenterPoint:(MTMapPoint*)mapPoint animated:(BOOL)animated; + +/** + * 지도 화면의 중심점과 확대/축소 레벨을 설정한다. + * @param mapPoint 지도화면 중심점을 나타내는 MTMapPoint 객체 + * @param zoomLevel 지도화면 확대 축소 레벨 값 (-2~12, 값이 클수록 더 넓은 영역이 화면이 보임) + * @param animated 지도화면 중심점 이동 및 확대/축소 레벨 변경시 애니매이션 효과를 적용할지 여부 + */ +- (void)setMapCenterPoint:(MTMapPoint*)mapPoint zoomLevel:(MTMapZoomLevel)zoomLevel animated:(BOOL)animated; + +/** + * 지도 화면의 확대/축소 레벨을 설정한다. + * @param zoomLevel 지도화면 확대 축소 레벨 값 (-2~12, 값이 클수록 더 넓은 영역이 화면이 보임) + * @param animated 지도화면의 확대/축소 레벨 변경시 애니매이션 효과를 적용할지 여부 + */ +- (void)setZoomLevel:(MTMapZoomLevel)zoomLevel animated:(BOOL)animated; + +/** + * 지도 화면을 한단계 확대한다. (더 좁은 영역이 크게 보임) + * 확대/축소 레벨 값이 1 감소됨 + * @param animated 지도화면의 확대 시 애니매이션 효과를 적용할지 여부 + */ +- (void)zoomInAnimated:(BOOL)animated; + +/** + * 지도 화면을 한단계 축소한다. (더 넓은 영역이 화면에 나타남) + * 확대/축소 레벨 값이 1 증가됨 + * @param animated 지도화면의 축소 시 애니매이션 효과를 적용할지 여부 + */ +- (void)zoomOutAnimated:(BOOL)animated; + +/** + * 지도 화면의 회전 각도를 설정한다. + * @param angle 회전 각도 (0~360도) + * @param animated 회전 각도 변경시 애니매이션 효과를 적용할지 여부 + */ +- (void)setMapRotationAngle:(MTMapRotationAngle)angle animated:(BOOL)animated; + +/** + * 지정한 지도 좌표들이 모두 화면에 나타나도록 지도화면 중심과 확대/축소 레벨을 자동조절 한다. + * @param mapPoints 화면에 모두 보여주고자 하는 지도 좌표 리스트 (Array of MTMapPoint) + */ +- (void)fitMapViewAreaToShowMapPoints:(NSArray*)mapPoints; + +/** + * 지도 화면 이동 혹은 확대/축소 시킨다. + * @param cameraUpdate 지도 화면 이동을 위한 중심점, 확대/축소 레벨 등을 지정한 MTMapCameraUpdate 객체 + */ +- (void)animateWithCameraUpdate:(MTMapCameraUpdate *)cameraUpdate; + +/** + * 지도 화면에 나타나는 지도 타일들을 지도 타일 서버에서 다시 받아와서 갱신한다. + */ +- (void)refreshMapTiles; + +/** + * MTMapView를 포함하고 있는 UIViewController 객체의 didReceiveMemoryWarning 메소드 구현에서 호출해 주어야 한다. + * iOS에서 Memory Warning 발생시 메모리에 저장하고 있는 + * 지도 타일 이미지 캐쉬 데이터 들을 삭제하여 메모리를 확보할 수 있다. + */ +- (void)didReceiveMemoryWarning; + +//- (CGPoint)viewPointFromMapPoint:(MTMapPoint*)mapPoint; +//- (MTMapPoint*)mapPointFromViewPoint:(CGPoint)viewPoint; + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// MTMapPOIItem + +/** + * 지도화면에 보여주고 있는 POI(Point Of Interest) 아이템 리스트를 조회할 수 있다. + */ +@property (nonatomic, readonly) NSArray* poiItems; + +/** + * 지도화면에 POI(Point Of Interest) Item 아이콘(마커)를 추가한다. + * @param poiItem 추가할 POI Item 객체 + */ +- (void)addPOIItem:(MTMapPOIItem*)poiItem; + +/** + * 지도화면에 POI(Point Of Interest) Item 아이콘(마커) 리스트를 추가한다. + * @param poiItems 추가할 POI Item 객체 리스트 (array of MTMapPOIItem(s)) + */ +- (void)addPOIItems:(NSArray *)poiItems; + +/** + * 특정 POI(Point Of Interest) Item 을 선택한다. + * 선택된 POI Item은 Callout Balloon(말풍선)이 아이콘(마커)위에 나타난다. + * @param poiItem 선택할 POI Item 객체 + * @param animated POI Item 선택시 말풍선이 나타날 때 애니매이션 효과가 적용될 지 여부 + */ +- (void)selectPOIItem:(MTMapPOIItem*)poiItem animated:(BOOL)animated; + +/** + * 특정 POI(Point Of Interest) Item 을 선택 해제한다. + * 선택 해제된 POI Item은 Callout Balloon(말풍선)이 POI 아이콘(마커)위에서 사라진다. + * @param poiItem 선택 해제할 POI Item 객체 + */ +- (void)deselectPOIItem:(MTMapPOIItem*)poiItem; + +/** + * 지도화면에 추가된 POI(Point Of Interest) Item 들 중에서 tag값이 일치하는 POI Item을 찾는다. + * @param tag 찾고자 하는 POI Item의 tag 값 + * @return tag가 일치하는 POI Item 객체, 일치하는 POI Item이 없는 경우 nil이 리턴된다. + */ +- (MTMapPOIItem*)findPOIItemByTag:(NSInteger)tag; + +/** + * 지도화면에 추가된 POI(Point Of Interest) Item 들 중에서 이름이 일치하는 POI Item 객체(리스트)를 찾는다. + * @param name 찾고자 하는 POI Item의 이름 문자열 + * @return 이름 문자열이 일치하는 POI Item 객체(리스트), 일치하는 POI Item이 없는 경우 nil이 리턴된다. + */ +- (NSArray*)findPOIItemByName:(NSString*)name; + +/** + * 특정 POI(Point Of Interest) Item을 지도화면에서 제거한다. + * @param poiItem 제거하고자 하는 POI Item 객체 + */ +- (void)removePOIItem:(MTMapPOIItem*)poiItem; + +/** + * POI(Point Of Interest) Item 리스트를 지도화면에서 제거한다. + * @param poiItems 제거하고자 하는 POI Item 객체 리스트 + */ +- (void)removePOIItems:(NSArray *)poiItems; // array of MTMapPOIItem(s) + +/** + * 지도 화면에 추가된 모든 POI(Point Of Interest) Item들을 제거한다. + */ +- (void)removeAllPOIItems; + +/** + * 지도 화면에 추가된 모든 POI(Point Of Interest) Item들이 + * 화면에 나타나도록 지도 화면 중심과 확대/축소 레벨을 자동으로 조정한다. + */ +- (void)fitMapViewAreaToShowAllPOIItems; + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// MTMapPolyline + +/** + * 지도화면에 보여주고 있는 Polyline 리스트를 조회할 수 있다. + */ +@property (nonatomic, readonly) NSArray* polylines; + +/** + * 지도화면에 Polyline을 추가한다. + * @param polyline 추가할 Polyline 객체 + */ +- (void)addPolyline:(MTMapPolyline*)polyline; + +/** + * 지도화면에 추가된 Polyline들 중에서 tag값이 일치하는 Polyline을 찾는다. + * @param tag 찾고자 하는 Polyline의 tag 값 + * @return tag값이 일치하는 Polyline 객체, 일치하는 Polyline이 없는 경우 nil이 리턴된다. + */ +- (MTMapPolyline*)findPolylineByTag:(NSInteger)tag; + +/** + * 특정 Polyline을 지도화면에서 제거한다. + * @param polyline 제거하고자 하는 Polyline 객체 + */ +- (void)removePolyline:(MTMapPolyline*)polyline; + +/** + * 지도 화면에 추가된 모든 Polyline을 제거한다. + */ +- (void)removeAllPolylines; + +/** + * 특정 Polyline의 모든 점들이 화면에 전부 나타나도록 + * 지도 화면 중심과 확대/축소 레벨을 자동으로 조정한다. + * @param polyline 화면에 보여주고자 하는 polyline + */ +- (void)fitMapViewAreaToShowPolyline:(MTMapPolyline*)polyline; + +/** + * 지도 화면에 추가된 모든 Polyline 들이 + * 화면에 나타나도록 지도 화면 중심과 확대/축소 레벨을 자동으로 조정한다. + */ +- (void)fitMapViewAreaToShowAllPolylines; + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// MTMapCircle + +/** + * 지도화면에 보여주고 있는 CircleOverlay 리스트를 조회할 수 있다. + */ +@property (nonatomic, readonly) NSArray* circles; + +/** + * 지도화면에 Circle을 추가한다. + * @param circle 추가할 CircleOverlay 객체 + */ +- (void)addCircle:(MTMapCircle*)circle; + +/** + * 지도화면에 추가된 Circle들 중에서 tag값이 일치하는 Circle를 찾는다. + * @param tag 찾고자 하는 Circle의 tag 값 + * @return tag값이 일치하는 Circle 객체, 일치하는 Circle이 없는 경우 nil이 리턴된다. + */ +- (MTMapCircle*)findCircleByTag:(NSInteger)tag; + +/** + * 특정 Circle을 지도화면에서 제거한다. + * @param circle 제거하고자 하는 CircleOverlay 객체 + */ +- (void)removeCircle:(MTMapCircle*)circle; + +/** + * 지도 화면에 추가된 모든 Circle를 제거한다. + */ +- (void)removeAllCircles; + +/** + * 특정 Circle이 화면에 전부 나타나도록 + * 지도 화면 중심과 확대/축소 레벨을 자동으로 조정한다. + * @param circle 화면에 보여주고자 하는 Circle + */ +- (void)fitMapViewAreaToShowCircle:(MTMapCircle*)circle; + +/** + * 지도 화면에 추가된 모든 Circle들이 + * 화면에 나타나도록 지도 화면 중심과 확대/축소 레벨을 자동으로 조정한다. + */ +- (void)fitMapViewAreaToShowAllCircleOverlays; + +@end + +/** + * 지도 객체에서 발생하는 이벤트를 처리할 delegate interface protocol. + * MTMapViewDelegate protocol을 구현한 객체를 생성하여 MTMapView 객체의 delegate property에 설정해야한다. + * delegate 객체는 Open API Key 인증 결과 이벤트, 지도 이동/확대/축소, + * 지도 화면 터치(Single Tap / Double Tap / Long Press) 이벤트, + * 현위치 트래킹 이벤트, POI(Point Of Interest) 관련 이벤트를 통보받을 수 있다. + * @see MTMapView + */ +@protocol MTMapViewDelegate +@optional + +// Open API Key Authentication delegate methods + +/** + * [Open API Key Authentication] MTMapView 객체의 setDaumMapApiKey 메소드로 설정한 Open API Key값을 + * Daum Open API Key 인증 서버에 인증한 결과를 통보받을 수 있다. + * Open API Key 는 App. Bundle Id 당 하나씩 Daum Open API Key 발급 페이지를 통해서 발급 된다. + * @param mapView MTMapView 객체 + * @param resultCode 인증 결과 코드, 200 : 인증성공, 200이 아닌경우에는 인증 실패 + * @param resultMessage 인증 결과 메세지, 인증 성공 및 실패에 대한 구체적인 메세지를 제공함 + */ +- (void)mapView:(MTMapView*)mapView openAPIKeyAuthenticationResultCode:(int)resultCode resultMessage:(NSString*)resultMessage; + + +// Map View Event delegate methods + +/** + * [Map View Event] 지도 중심 좌표가 이동한 경우 호출된다. + * @param mapView MTMapView 객체 + * @param mapCenterPoint 새로 이동한 지도 중심 좌표 + */ +- (void)mapView:(MTMapView*)mapView centerPointMovedTo:(MTMapPoint*)mapCenterPoint; + +/** + * [Map View Event] 지도 화면의 이동이 끝난 뒤 호출된다. + * @param mapView MTMapView 객체 + * @param mapCenterPoint 새로 이동한 지도 중심 좌표 + */ +- (void)mapView:(MTMapView*)mapView finishedMapMoveAnimation:(MTMapPoint*)mapCenterPoint; + +/** + * [Map View Event] 지도 확대/축소 레벨이 변경된 경우 호출된다. + * @param mapView MTMapView 객체 + * @param zoomLevel 변경된 지도 확대/축소 레벨 + */ +- (void)mapView:(MTMapView*)mapView zoomLevelChangedTo:(MTMapZoomLevel)zoomLevel; + +/** + * [Map View Event] 사용자가 지도 위를 터치한 경우 호출된다. + * @param mapView MTMapView 객체 + * @param mapPoint 사용자가 터치한 지도 좌표 + */ +- (void)mapView:(MTMapView*)mapView singleTapOnMapPoint:(MTMapPoint*)mapPoint; + +/** + * [Map View Event] 사용자가 지도 위 한 지점을 더블 터치한 경우 호출된다. + * @param mapView MTMapView 객체 + * @param mapPoint 사용자가 터치한 지도 좌표 + */ +- (void)mapView:(MTMapView*)mapView doubleTapOnMapPoint:(MTMapPoint*)mapPoint; + +/** + * [Map View Event] 사용자가 지도 위 한 지점을 터치하여 드래그를 시작할 경우 호출된다. + * @param mapView MTMapView 객체 + * @param mapPoint 사용자의 드래그가 시작한 지도 좌표 + */ +- (void)mapView:(MTMapView*)mapView dragStartedOnMapPoint:(MTMapPoint*)mapPoint; + +/** + * [Map View Event] 사용자가 지도 위 한 지점을 터치하여 드래그를 끝낼 경우 호출된다. + * @param mapView MTMapView 객체 + * @param mapPoint 사용자의 드래그가 끝난 지도 좌표 + */ +- (void)mapView:(MTMapView*)mapView dragEndedOnMapPoint:(MTMapPoint*)mapPoint; + +/** + * [Map View Event] 사용자가 지도 위 한 지점을 길게 누른 경우(long press) 호출된다. + * @param mapView MTMapView 객체 + * @param mapPoint 사용자가 터치한 지도 좌표 + */ +- (void)mapView:(MTMapView*)mapView longPressOnMapPoint:(MTMapPoint*)mapPoint; + + +// User Location Tracking delegate methods + +/** + * [User Location Tracking] 단말의 현위치 좌표값을 통보받을 수 있다. + * MTMapView 클래스의 currentLocationTrackingMode property를 통해서 + * 사용자 현위치 트래킹 기능이 켜진 경우(MTMapCurrentLocationTrackingOnWithoutHeading, MTMapCurrentLocationTrackingOnWithHeading) + * 단말의 위치에 해당하는 지도 좌표와 위치 정확도가 주기적으로 delegate 객체에 통보된다. + * @param mapView MTMapView 객체 + * @param location 사용자 단말의 현재 위치 좌표 + * @param accuracy 현위치 좌표의 오차 반경(정확도) (meter) + */ +- (void)mapView:(MTMapView*)mapView updateCurrentLocation:(MTMapPoint*)location withAccuracy:(MTMapLocationAccuracy)accuracy; + +/** + * [User Location Tracking] 현위치를 얻고자 할때 실패한 경우 통보받을 수 있다. + * MTMapView 클래스의 currentLocationTrackingMode property를 통해서 + * 사용자 현위치 트래킹 기능이 켜고자 했을 경우(MTMapCurrentLocationTrackingOnWithoutHeading, MTMapCurrentLocationTrackingOnWithHeading) + * 위치 사용 권한이나 기타 다른 이유로 인해 오류가 발생했을 때 발생한다. + * @param mapView MTMapView 객체 + * @param error 오류가 발생한 정보를 담고 있는 객체 + */ +- (void)mapView:(MTMapView*)mapView failedUpdatingCurrentLocationWithError:(NSError *)error; + +/** + * [User Location Tracking] 단말의 방향(Heading) 각도값을 통보받을 수 있다. + * MTMapView 클래스의 currentLocationTrackingMode property를 통해서 + * 사용자 현위치 트래킹과 나침반 모드가 켜진 경우(MTMapCurrentLocationTrackingOnWithHeading) + * 단말의 방향 각도값이 주기적으로 delegate 객체에 통보된다. + * @param mapView MTMapView 객체 + * @param headingAngle 사용자 단말의 방향 각도 값(degree) + */ +- (void)mapView:(MTMapView*)mapView updateDeviceHeading:(MTMapRotationAngle)headingAngle; + +// POI(Point Of Interest) Item delegate methods + +/** + * [POI Item] 단말 사용자가 POI Item을 선택한 경우 호출된다. + * 사용자가 MTMapView에 등록된 POI(Point Of Interest) Item 아이콘(마커)를 터치한 경우 호출된다. + * MTMapViewDelegate protocol을 구현하는 delegate 객체의 구현의 리턴값(BOOL)에 따라 + * 해당 POI Item 선택 시, POI Item 마커 위에 말풍선(Callout Balloon)을 보여줄지 여부를 선택할 수 있다. + * @param mapView MTMapView 객체 + * @param poiItem 선택된 POI Item 객체 + * @return POI Item 선택 시, 말풍선을 보여줄지 여부. YES:터치 시 말풍선이 나타남. NO:터치 시 말풍선이 나타나지 않음. + * @see MTMapPOIItem + */ +- (BOOL)mapView:(MTMapView*)mapView selectedPOIItem:(MTMapPOIItem*)poiItem; + +/** + * [POI Item] 단말 사용자가 POI Item 아이콘(마커) 위에 나타난 말풍선(Callout Balloon)을 터치한 경우 호출된다. + * @param mapView MTMapView 객체 + * @param poiItem 말풍선이 터치된 POI Item 객체 + * @see MTMapPOIItem + */ +- (void)mapView:(MTMapView*)mapView touchedCalloutBalloonOfPOIItem:(MTMapPOIItem*)poiItem; + +/** + * [POI Item] 단말 사용자가 POI Item 아이콘(마커) 위에 나타난 말풍선(Callout Balloon)의 왼쪽 영역을 터치한 경우 호출된다. + * @param mapView MTMapView 객체 + * @param poiItem 말풍선이 터치된 POI Item 객체 + * @see MTMapPOIItem + */ +- (void)mapView:(MTMapView*)mapView touchedCalloutBalloonLeftSideOfPOIItem:(MTMapPOIItem*)poiItem; + +/** + * [POI Item] 단말 사용자가 POI Item 아이콘(마커) 위에 나타난 말풍선(Callout Balloon)의 오른쪽 영역을 터치한 경우 호출된다. + * @param mapView MTMapView 객체 + * @param poiItem 말풍선이 터치된 POI Item 객체 + * @see MTMapPOIItem + */ +- (void)mapView:(MTMapView*)mapView touchedCalloutBalloonRightSideOfPOIItem:(MTMapPOIItem*)poiItem; + +/** + * [POI Item] 단말 사용자가 길게 누른후(long press) 끌어서(dragging) 위치 이동 가능한 POI Item의 위치를 이동시킨 경우 호출된다. + * 이동가능한 POI Item을 Draggable POI Item이라 한다. + * @param mapView MTMapView 객체 + * @param poiItem 새로운 위치로 이동된 Draggable POI Item 객체 + * @param newMapPoint 이동된 POI Item의 위치에 해당하는 지도 좌표 + * @see MTMapPOIItem + */ +- (void)mapView:(MTMapView*)mapView draggablePOIItem:(MTMapPOIItem*)poiItem movedToNewMapPoint:(MTMapPoint*)newMapPoint; +@end \ No newline at end of file diff --git a/DaumMap.embeddedframework/DaumMap.framework/Info.plist b/DaumMap.embeddedframework/DaumMap.framework/Info.plist new file mode 100644 index 0000000..f66b807 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/Info.plist differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/copyright.png b/DaumMap.embeddedframework/DaumMap.framework/copyright.png new file mode 100644 index 0000000..034fff2 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/copyright.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/daum_copyright.png b/DaumMap.embeddedframework/DaumMap.framework/daum_copyright.png new file mode 100644 index 0000000..6e801e1 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/daum_copyright.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/daum_th_line.png b/DaumMap.embeddedframework/DaumMap.framework/daum_th_line.png new file mode 100644 index 0000000..c8817cb Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/daum_th_line.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/detail_button.png b/DaumMap.embeddedframework/DaumMap.framework/detail_button.png new file mode 100644 index 0000000..0decd21 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/detail_button.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/info_box.png b/DaumMap.embeddedframework/DaumMap.framework/info_box.png new file mode 100644 index 0000000..a8204fd Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/info_box.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/info_box_tail.png b/DaumMap.embeddedframework/DaumMap.framework/info_box_tail.png new file mode 100644 index 0000000..4a18c3e Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/info_box_tail.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin.png new file mode 100644 index 0000000..e42edf5 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin@3x.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin@3x.png new file mode 100644 index 0000000..e42edf5 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin@3x.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin_custom.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin_custom.png new file mode 100644 index 0000000..b96412e Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin_custom.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin_custom@3x.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin_custom@3x.png new file mode 100644 index 0000000..b96412e Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin_custom@3x.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin_red.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin_red.png new file mode 100644 index 0000000..fc34693 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin_red.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin_red@3x.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin_red@3x.png new file mode 100644 index 0000000..fc34693 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin_red@3x.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin_shadow.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin_shadow.png new file mode 100644 index 0000000..7f66e2f Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin_shadow.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pin_shadow@3x.png b/DaumMap.embeddedframework/DaumMap.framework/map_pin_shadow@3x.png new file mode 100644 index 0000000..7f66e2f Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pin_shadow@3x.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pinup.png b/DaumMap.embeddedframework/DaumMap.framework/map_pinup.png new file mode 100644 index 0000000..e42edf5 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pinup.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pinup@3x.png b/DaumMap.embeddedframework/DaumMap.framework/map_pinup@3x.png new file mode 100644 index 0000000..e42edf5 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pinup@3x.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pinup_custom.png b/DaumMap.embeddedframework/DaumMap.framework/map_pinup_custom.png new file mode 100644 index 0000000..b96412e Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pinup_custom.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_pinup_custom@3x.png b/DaumMap.embeddedframework/DaumMap.framework/map_pinup_custom@3x.png new file mode 100644 index 0000000..b96412e Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_pinup_custom@3x.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_present.png b/DaumMap.embeddedframework/DaumMap.framework/map_present.png new file mode 100644 index 0000000..fde02cb Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_present.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_present_background_update.png b/DaumMap.embeddedframework/DaumMap.framework/map_present_background_update.png new file mode 100644 index 0000000..fde02cb Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_present_background_update.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_present_direction.png b/DaumMap.embeddedframework/DaumMap.framework/map_present_direction.png new file mode 100644 index 0000000..839c07c Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_present_direction.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/map_present_tracking.png b/DaumMap.embeddedframework/DaumMap.framework/map_present_tracking.png new file mode 100644 index 0000000..fd6356f Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/map_present_tracking.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/noimage.png b/DaumMap.embeddedframework/DaumMap.framework/noimage.png new file mode 100644 index 0000000..bb021f1 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/noimage.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/noimage256.png b/DaumMap.embeddedframework/DaumMap.framework/noimage256.png new file mode 100644 index 0000000..c1e1b49 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/noimage256.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/point_sprite.png b/DaumMap.embeddedframework/DaumMap.framework/point_sprite.png new file mode 100644 index 0000000..e3ee1e8 Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/point_sprite.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/shadow_balloon.png b/DaumMap.embeddedframework/DaumMap.framework/shadow_balloon.png new file mode 100644 index 0000000..b9e133f Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/shadow_balloon.png differ diff --git a/DaumMap.embeddedframework/DaumMap.framework/th_line.png b/DaumMap.embeddedframework/DaumMap.framework/th_line.png new file mode 100644 index 0000000..c8817cb Binary files /dev/null and b/DaumMap.embeddedframework/DaumMap.framework/th_line.png differ diff --git a/DaumMap.embeddedframework/Resources/Headers b/DaumMap.embeddedframework/Resources/Headers new file mode 120000 index 0000000..c3b2f84 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/Headers @@ -0,0 +1 @@ +../DaumMap.framework/Headers \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/copyright.png b/DaumMap.embeddedframework/Resources/copyright.png new file mode 120000 index 0000000..001d3b9 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/copyright.png @@ -0,0 +1 @@ +../DaumMap.framework/copyright.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/daum_copyright.png b/DaumMap.embeddedframework/Resources/daum_copyright.png new file mode 120000 index 0000000..40a8ad0 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/daum_copyright.png @@ -0,0 +1 @@ +../DaumMap.framework/daum_copyright.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/daum_th_line.png b/DaumMap.embeddedframework/Resources/daum_th_line.png new file mode 120000 index 0000000..2e565d9 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/daum_th_line.png @@ -0,0 +1 @@ +../DaumMap.framework/daum_th_line.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/detail_button.png b/DaumMap.embeddedframework/Resources/detail_button.png new file mode 120000 index 0000000..2fffbb3 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/detail_button.png @@ -0,0 +1 @@ +../DaumMap.framework/detail_button.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/info_box.png b/DaumMap.embeddedframework/Resources/info_box.png new file mode 120000 index 0000000..baf39b0 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/info_box.png @@ -0,0 +1 @@ +../DaumMap.framework/info_box.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/info_box_tail.png b/DaumMap.embeddedframework/Resources/info_box_tail.png new file mode 120000 index 0000000..f3b1447 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/info_box_tail.png @@ -0,0 +1 @@ +../DaumMap.framework/info_box_tail.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin.png b/DaumMap.embeddedframework/Resources/map_pin.png new file mode 120000 index 0000000..123b8ad --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin@3x.png b/DaumMap.embeddedframework/Resources/map_pin@3x.png new file mode 120000 index 0000000..7825ab5 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin@3x.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin@3x.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin_custom.png b/DaumMap.embeddedframework/Resources/map_pin_custom.png new file mode 120000 index 0000000..41d07e1 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin_custom.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin_custom.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin_custom@3x.png b/DaumMap.embeddedframework/Resources/map_pin_custom@3x.png new file mode 120000 index 0000000..e9b140b --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin_custom@3x.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin_custom@3x.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin_red.png b/DaumMap.embeddedframework/Resources/map_pin_red.png new file mode 120000 index 0000000..4698f6e --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin_red.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin_red.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin_red@3x.png b/DaumMap.embeddedframework/Resources/map_pin_red@3x.png new file mode 120000 index 0000000..3ab8555 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin_red@3x.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin_red@3x.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin_shadow.png b/DaumMap.embeddedframework/Resources/map_pin_shadow.png new file mode 120000 index 0000000..1e4bbaf --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin_shadow.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin_shadow.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pin_shadow@3x.png b/DaumMap.embeddedframework/Resources/map_pin_shadow@3x.png new file mode 120000 index 0000000..b7e231d --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pin_shadow@3x.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pin_shadow@3x.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pinup.png b/DaumMap.embeddedframework/Resources/map_pinup.png new file mode 120000 index 0000000..dbece0e --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pinup.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pinup.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pinup@3x.png b/DaumMap.embeddedframework/Resources/map_pinup@3x.png new file mode 120000 index 0000000..b15c12b --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pinup@3x.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pinup@3x.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pinup_custom.png b/DaumMap.embeddedframework/Resources/map_pinup_custom.png new file mode 120000 index 0000000..b372e49 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pinup_custom.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pinup_custom.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_pinup_custom@3x.png b/DaumMap.embeddedframework/Resources/map_pinup_custom@3x.png new file mode 120000 index 0000000..a05a9e8 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_pinup_custom@3x.png @@ -0,0 +1 @@ +../DaumMap.framework/map_pinup_custom@3x.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_present.png b/DaumMap.embeddedframework/Resources/map_present.png new file mode 120000 index 0000000..deedc3a --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_present.png @@ -0,0 +1 @@ +../DaumMap.framework/map_present.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_present_background_update.png b/DaumMap.embeddedframework/Resources/map_present_background_update.png new file mode 120000 index 0000000..82bff69 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_present_background_update.png @@ -0,0 +1 @@ +../DaumMap.framework/map_present_background_update.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_present_direction.png b/DaumMap.embeddedframework/Resources/map_present_direction.png new file mode 120000 index 0000000..3917573 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_present_direction.png @@ -0,0 +1 @@ +../DaumMap.framework/map_present_direction.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/map_present_tracking.png b/DaumMap.embeddedframework/Resources/map_present_tracking.png new file mode 120000 index 0000000..d0d730a --- /dev/null +++ b/DaumMap.embeddedframework/Resources/map_present_tracking.png @@ -0,0 +1 @@ +../DaumMap.framework/map_present_tracking.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/noimage.png b/DaumMap.embeddedframework/Resources/noimage.png new file mode 120000 index 0000000..00a3f2f --- /dev/null +++ b/DaumMap.embeddedframework/Resources/noimage.png @@ -0,0 +1 @@ +../DaumMap.framework/noimage.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/noimage256.png b/DaumMap.embeddedframework/Resources/noimage256.png new file mode 120000 index 0000000..2b09de2 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/noimage256.png @@ -0,0 +1 @@ +../DaumMap.framework/noimage256.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/point_sprite.png b/DaumMap.embeddedframework/Resources/point_sprite.png new file mode 120000 index 0000000..cb3db4f --- /dev/null +++ b/DaumMap.embeddedframework/Resources/point_sprite.png @@ -0,0 +1 @@ +../DaumMap.framework/point_sprite.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/shadow_balloon.png b/DaumMap.embeddedframework/Resources/shadow_balloon.png new file mode 120000 index 0000000..d062b4d --- /dev/null +++ b/DaumMap.embeddedframework/Resources/shadow_balloon.png @@ -0,0 +1 @@ +../DaumMap.framework/shadow_balloon.png \ No newline at end of file diff --git a/DaumMap.embeddedframework/Resources/th_line.png b/DaumMap.embeddedframework/Resources/th_line.png new file mode 120000 index 0000000..0d93274 --- /dev/null +++ b/DaumMap.embeddedframework/Resources/th_line.png @@ -0,0 +1 @@ +../DaumMap.framework/th_line.png \ No newline at end of file diff --git a/FoodMaps.xcodeproj/project.pbxproj b/FoodMaps.xcodeproj/project.pbxproj index 3d5c4e5..dd09b51 100644 --- a/FoodMaps.xcodeproj/project.pbxproj +++ b/FoodMaps.xcodeproj/project.pbxproj @@ -7,23 +7,132 @@ objects = { /* Begin PBXBuildFile section */ + 6385BC622AF40D44005CDA61 /* DaumMap.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6385BC612AF40D44005CDA61 /* DaumMap.xcframework */; }; 63BFBF0B2AD39284004150C7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63BFBF0A2AD39284004150C7 /* AppDelegate.swift */; }; 63BFBF0D2AD39284004150C7 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63BFBF0C2AD39284004150C7 /* SceneDelegate.swift */; }; - 63BFBF0F2AD39284004150C7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63BFBF0E2AD39284004150C7 /* ViewController.swift */; }; - 63BFBF122AD39284004150C7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 63BFBF102AD39284004150C7 /* Main.storyboard */; }; + 63BFBF0F2AD39284004150C7 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63BFBF0E2AD39284004150C7 /* MainViewController.swift */; }; 63BFBF142AD39286004150C7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63BFBF132AD39286004150C7 /* Assets.xcassets */; }; 63BFBF172AD39286004150C7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 63BFBF152AD39286004150C7 /* LaunchScreen.storyboard */; }; + 63BFC6592AD3A4D4004150C7 /* map_pinup_custom@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6342AD3A4D4004150C7 /* map_pinup_custom@3x.png */; }; + 63BFC65A2AD3A4D4004150C7 /* map_pin_custom.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6352AD3A4D4004150C7 /* map_pin_custom.png */; }; + 63BFC65B2AD3A4D4004150C7 /* shadow_balloon.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6362AD3A4D4004150C7 /* shadow_balloon.png */; }; + 63BFC65C2AD3A4D4004150C7 /* map_pinup.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6372AD3A4D4004150C7 /* map_pinup.png */; }; + 63BFC65D2AD3A4D4004150C7 /* detail_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6382AD3A4D4004150C7 /* detail_button.png */; }; + 63BFC65E2AD3A4D4004150C7 /* map_pin_custom@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6392AD3A4D4004150C7 /* map_pin_custom@3x.png */; }; + 63BFC65F2AD3A4D4004150C7 /* map_pinup@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC63A2AD3A4D4004150C7 /* map_pinup@3x.png */; }; + 63BFC6602AD3A4D4004150C7 /* map_pin_shadow@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC63B2AD3A4D4004150C7 /* map_pin_shadow@3x.png */; }; + 63BFC6612AD3A4D4004150C7 /* copyright.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC63C2AD3A4D4004150C7 /* copyright.png */; }; + 63BFC6622AD3A4D4004150C7 /* th_line.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC63D2AD3A4D4004150C7 /* th_line.png */; }; + 63BFC6632AD3A4D4004150C7 /* map_pin_red@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC63E2AD3A4D4004150C7 /* map_pin_red@3x.png */; }; + 63BFC6642AD3A4D4004150C7 /* daum_copyright.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC63F2AD3A4D4004150C7 /* daum_copyright.png */; }; + 63BFC6652AD3A4D4004150C7 /* map_pin@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6402AD3A4D4004150C7 /* map_pin@3x.png */; }; + 63BFC6662AD3A4D4004150C7 /* map_present_tracking.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6412AD3A4D4004150C7 /* map_present_tracking.png */; }; + 63BFC6672AD3A4D4004150C7 /* map_pin_red.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6422AD3A4D4004150C7 /* map_pin_red.png */; }; + 63BFC6682AD3A4D4004150C7 /* info_box.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC64C2AD3A4D4004150C7 /* info_box.png */; }; + 63BFC6692AD3A4D4004150C7 /* point_sprite.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC64D2AD3A4D4004150C7 /* point_sprite.png */; }; + 63BFC66A2AD3A4D4004150C7 /* map_pinup_custom.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC64E2AD3A4D4004150C7 /* map_pinup_custom.png */; }; + 63BFC66B2AD3A4D4004150C7 /* info_box_tail.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC64F2AD3A4D4004150C7 /* info_box_tail.png */; }; + 63BFC66C2AD3A4D4004150C7 /* noimage256.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6502AD3A4D4004150C7 /* noimage256.png */; }; + 63BFC66D2AD3A4D4004150C7 /* map_present_direction.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6512AD3A4D4004150C7 /* map_present_direction.png */; }; + 63BFC66E2AD3A4D4004150C7 /* map_pin.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6522AD3A4D4004150C7 /* map_pin.png */; }; + 63BFC66F2AD3A4D4004150C7 /* map_present.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6532AD3A4D4004150C7 /* map_present.png */; }; + 63BFC6702AD3A4D4004150C7 /* noimage.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6542AD3A4D4004150C7 /* noimage.png */; }; + 63BFC6712AD3A4D4004150C7 /* map_present_background_update.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6552AD3A4D4004150C7 /* map_present_background_update.png */; }; + 63BFC6722AD3A4D4004150C7 /* daum_th_line.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6562AD3A4D4004150C7 /* daum_th_line.png */; }; + 63BFC6732AD3A4D4004150C7 /* map_pin_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = 63BFC6572AD3A4D4004150C7 /* map_pin_shadow.png */; }; + 63BFC6742AD3A4D4004150C7 /* DaumMap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC6582AD3A4D4004150C7 /* DaumMap.framework */; }; + 63BFC6772AD3A504004150C7 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC6762AD3A504004150C7 /* OpenGLES.framework */; }; + 63BFC6792AD3A513004150C7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC6782AD3A512004150C7 /* SystemConfiguration.framework */; }; + 63BFC67B2AD3A51D004150C7 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC67A2AD3A51D004150C7 /* CoreLocation.framework */; }; + 63BFC67D2AD3A525004150C7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC67C2AD3A525004150C7 /* QuartzCore.framework */; }; + 63BFC67F2AD3A535004150C7 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC67E2AD3A535004150C7 /* libc++.tbd */; }; + 63BFC6812AD3A53F004150C7 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC6802AD3A53F004150C7 /* libxml2.tbd */; }; + 63BFC6832AD3A54E004150C7 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 63BFC6822AD3A54E004150C7 /* libsqlite3.tbd */; }; + 63EA0DB52AD632B1001585EA /* AddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EA0DB42AD632B1001585EA /* AddViewController.swift */; }; + 63EA0DB72AD639DD001585EA /* AddViewController+TextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EA0DB62AD639DD001585EA /* AddViewController+TextViewDelegate.swift */; }; + 63EA0DBA2AD63A86001585EA /* Restaurant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EA0DB92AD63A86001585EA /* Restaurant.swift */; }; + 63ED4C6F2AD8E0260000F429 /* LocationNetWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C6E2AD8E0260000F429 /* LocationNetWork.swift */; }; + 63ED4C712AD8E0520000F429 /* LocationAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C702AD8E0520000F429 /* LocationAPI.swift */; }; + 63ED4C742AD8E1AA0000F429 /* LocationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C732AD8E1AA0000F429 /* LocationData.swift */; }; + 63ED4C762AD8E1C00000F429 /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C752AD8E1C00000F429 /* Document.swift */; }; + 63ED4C7B2AD8E2140000F429 /* MapViewError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C7A2AD8E2140000F429 /* MapViewError.swift */; }; + 63ED4C7D2AD8E5450000F429 /* APIKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C7C2AD8E5450000F429 /* APIKey.swift */; }; + 63ED4C862AD91E400000F429 /* Keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 63ED4C852AD91E400000F429 /* Keys.plist */; }; + 63ED4C912ADCFB280000F429 /* ListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C902ADCFB280000F429 /* ListViewController.swift */; }; + 63ED4C932ADE85E20000F429 /* ListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C922ADE85E20000F429 /* ListTableViewCell.swift */; }; + 63ED4C952ADEA5520000F429 /* LocationDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C942ADEA5520000F429 /* LocationDataManager.swift */; }; + 63ED4C9A2AE0C24F0000F429 /* CategoryNamespace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C992AE0C24F0000F429 /* CategoryNamespace.swift */; }; + 63ED4C9F2AEA7E5A0000F429 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ED4C9E2AEA7E5A0000F429 /* MainView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 6385BC612AF40D44005CDA61 /* DaumMap.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = DaumMap.xcframework; path = ../Downloads/DaumMap.xcframework; sourceTree = ""; }; 63BFBF072AD39284004150C7 /* FoodMaps.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FoodMaps.app; sourceTree = BUILT_PRODUCTS_DIR; }; 63BFBF0A2AD39284004150C7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 63BFBF0C2AD39284004150C7 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 63BFBF0E2AD39284004150C7 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 63BFBF112AD39284004150C7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 63BFBF0E2AD39284004150C7 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 63BFBF132AD39286004150C7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 63BFBF162AD39286004150C7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 63BFBF182AD39286004150C7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63BFC6342AD3A4D4004150C7 /* map_pinup_custom@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map_pinup_custom@3x.png"; sourceTree = ""; }; + 63BFC6352AD3A4D4004150C7 /* map_pin_custom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_pin_custom.png; sourceTree = ""; }; + 63BFC6362AD3A4D4004150C7 /* shadow_balloon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shadow_balloon.png; sourceTree = ""; }; + 63BFC6372AD3A4D4004150C7 /* map_pinup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_pinup.png; sourceTree = ""; }; + 63BFC6382AD3A4D4004150C7 /* detail_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = detail_button.png; sourceTree = ""; }; + 63BFC6392AD3A4D4004150C7 /* map_pin_custom@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map_pin_custom@3x.png"; sourceTree = ""; }; + 63BFC63A2AD3A4D4004150C7 /* map_pinup@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map_pinup@3x.png"; sourceTree = ""; }; + 63BFC63B2AD3A4D4004150C7 /* map_pin_shadow@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map_pin_shadow@3x.png"; sourceTree = ""; }; + 63BFC63C2AD3A4D4004150C7 /* copyright.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = copyright.png; sourceTree = ""; }; + 63BFC63D2AD3A4D4004150C7 /* th_line.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = th_line.png; sourceTree = ""; }; + 63BFC63E2AD3A4D4004150C7 /* map_pin_red@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map_pin_red@3x.png"; sourceTree = ""; }; + 63BFC63F2AD3A4D4004150C7 /* daum_copyright.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = daum_copyright.png; sourceTree = ""; }; + 63BFC6402AD3A4D4004150C7 /* map_pin@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map_pin@3x.png"; sourceTree = ""; }; + 63BFC6412AD3A4D4004150C7 /* map_present_tracking.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_present_tracking.png; sourceTree = ""; }; + 63BFC6422AD3A4D4004150C7 /* map_pin_red.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_pin_red.png; sourceTree = ""; }; + 63BFC6442AD3A4D4004150C7 /* MTMapPOIItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapPOIItem.h; sourceTree = ""; }; + 63BFC6452AD3A4D4004150C7 /* MTMapCameraUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapCameraUpdate.h; sourceTree = ""; }; + 63BFC6462AD3A4D4004150C7 /* MTMapReverseGeoCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapReverseGeoCoder.h; sourceTree = ""; }; + 63BFC6472AD3A4D4004150C7 /* MTMapPolyline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapPolyline.h; sourceTree = ""; }; + 63BFC6482AD3A4D4004150C7 /* MTMapLocationMarkerItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapLocationMarkerItem.h; sourceTree = ""; }; + 63BFC6492AD3A4D4004150C7 /* MTMapView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapView.h; sourceTree = ""; }; + 63BFC64A2AD3A4D4004150C7 /* MTMapGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapGeometry.h; sourceTree = ""; }; + 63BFC64B2AD3A4D4004150C7 /* MTMapCircle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMapCircle.h; sourceTree = ""; }; + 63BFC64C2AD3A4D4004150C7 /* info_box.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = info_box.png; sourceTree = ""; }; + 63BFC64D2AD3A4D4004150C7 /* point_sprite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = point_sprite.png; sourceTree = ""; }; + 63BFC64E2AD3A4D4004150C7 /* map_pinup_custom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_pinup_custom.png; sourceTree = ""; }; + 63BFC64F2AD3A4D4004150C7 /* info_box_tail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = info_box_tail.png; sourceTree = ""; }; + 63BFC6502AD3A4D4004150C7 /* noimage256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noimage256.png; sourceTree = ""; }; + 63BFC6512AD3A4D4004150C7 /* map_present_direction.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_present_direction.png; sourceTree = ""; }; + 63BFC6522AD3A4D4004150C7 /* map_pin.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_pin.png; sourceTree = ""; }; + 63BFC6532AD3A4D4004150C7 /* map_present.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_present.png; sourceTree = ""; }; + 63BFC6542AD3A4D4004150C7 /* noimage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noimage.png; sourceTree = ""; }; + 63BFC6552AD3A4D4004150C7 /* map_present_background_update.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_present_background_update.png; sourceTree = ""; }; + 63BFC6562AD3A4D4004150C7 /* daum_th_line.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = daum_th_line.png; sourceTree = ""; }; + 63BFC6572AD3A4D4004150C7 /* map_pin_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_pin_shadow.png; sourceTree = ""; }; + 63BFC6582AD3A4D4004150C7 /* DaumMap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = DaumMap.framework; sourceTree = ""; }; + 63BFC6762AD3A504004150C7 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 63BFC6782AD3A512004150C7 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 63BFC67A2AD3A51D004150C7 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 63BFC67C2AD3A525004150C7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 63BFC67E2AD3A535004150C7 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + 63BFC6802AD3A53F004150C7 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; + 63BFC6822AD3A54E004150C7 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 63BFC6842AD3A5D4004150C7 /* BridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BridgingHeader.h; sourceTree = ""; }; + 63EA0DB42AD632B1001585EA /* AddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddViewController.swift; sourceTree = ""; }; + 63EA0DB62AD639DD001585EA /* AddViewController+TextViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AddViewController+TextViewDelegate.swift"; sourceTree = ""; }; + 63EA0DB92AD63A86001585EA /* Restaurant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Restaurant.swift; sourceTree = ""; }; + 63ED4C6E2AD8E0260000F429 /* LocationNetWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationNetWork.swift; sourceTree = ""; }; + 63ED4C702AD8E0520000F429 /* LocationAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationAPI.swift; sourceTree = ""; }; + 63ED4C732AD8E1AA0000F429 /* LocationData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationData.swift; sourceTree = ""; }; + 63ED4C752AD8E1C00000F429 /* Document.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Document.swift; sourceTree = ""; }; + 63ED4C7A2AD8E2140000F429 /* MapViewError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewError.swift; sourceTree = ""; }; + 63ED4C7C2AD8E5450000F429 /* APIKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIKey.swift; sourceTree = ""; }; + 63ED4C852AD91E400000F429 /* Keys.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Keys.plist; sourceTree = ""; }; + 63ED4C902ADCFB280000F429 /* ListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListViewController.swift; sourceTree = ""; }; + 63ED4C922ADE85E20000F429 /* ListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTableViewCell.swift; sourceTree = ""; }; + 63ED4C942ADEA5520000F429 /* LocationDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationDataManager.swift; sourceTree = ""; }; + 63ED4C992AE0C24F0000F429 /* CategoryNamespace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryNamespace.swift; sourceTree = ""; }; + 63ED4C9E2AEA7E5A0000F429 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -31,6 +140,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 63BFC6832AD3A54E004150C7 /* libsqlite3.tbd in Frameworks */, + 63BFC6812AD3A53F004150C7 /* libxml2.tbd in Frameworks */, + 63BFC67F2AD3A535004150C7 /* libc++.tbd in Frameworks */, + 63BFC67D2AD3A525004150C7 /* QuartzCore.framework in Frameworks */, + 63BFC67B2AD3A51D004150C7 /* CoreLocation.framework in Frameworks */, + 63BFC6792AD3A513004150C7 /* SystemConfiguration.framework in Frameworks */, + 6385BC622AF40D44005CDA61 /* DaumMap.xcframework in Frameworks */, + 63BFC6772AD3A504004150C7 /* OpenGLES.framework in Frameworks */, + 63BFC6742AD3A4D4004150C7 /* DaumMap.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -42,6 +160,7 @@ children = ( 63BFBF092AD39284004150C7 /* FoodMaps */, 63BFBF082AD39284004150C7 /* Products */, + 63BFC6752AD3A504004150C7 /* Frameworks */, ); sourceTree = ""; }; @@ -56,17 +175,187 @@ 63BFBF092AD39284004150C7 /* FoodMaps */ = { isa = PBXGroup; children = ( - 63BFBF0A2AD39284004150C7 /* AppDelegate.swift */, - 63BFBF0C2AD39284004150C7 /* SceneDelegate.swift */, - 63BFBF0E2AD39284004150C7 /* ViewController.swift */, - 63BFBF102AD39284004150C7 /* Main.storyboard */, - 63BFBF132AD39286004150C7 /* Assets.xcassets */, - 63BFBF152AD39286004150C7 /* LaunchScreen.storyboard */, + 63ED4C852AD91E400000F429 /* Keys.plist */, 63BFBF182AD39286004150C7 /* Info.plist */, + 63BFC6842AD3A5D4004150C7 /* BridgingHeader.h */, + 63ED4C982AE0C20E0000F429 /* Namespace */, + 63ED4C6D2AD8E00E0000F429 /* NetWork */, + 63ED4C722AD8E10B0000F429 /* Entity */, + 63EA0DB82AD63A76001585EA /* Model */, + 63EA0DB32AD63260001585EA /* Contorller */, + 63BFBF152AD39286004150C7 /* LaunchScreen.storyboard */, + 63BFBF132AD39286004150C7 /* Assets.xcassets */, + 63EA0DB12AD631F4001585EA /* AppSupport */, + 63ED4C792AD8E1DF0000F429 /* Error */, ); path = FoodMaps; sourceTree = ""; }; + 63BFC6322AD3A4D4004150C7 /* DaumMap.embeddedframework */ = { + isa = PBXGroup; + children = ( + 63BFC6332AD3A4D4004150C7 /* Resources */, + 63BFC6582AD3A4D4004150C7 /* DaumMap.framework */, + ); + path = DaumMap.embeddedframework; + sourceTree = SOURCE_ROOT; + }; + 63BFC6332AD3A4D4004150C7 /* Resources */ = { + isa = PBXGroup; + children = ( + 63BFC6342AD3A4D4004150C7 /* map_pinup_custom@3x.png */, + 63BFC6352AD3A4D4004150C7 /* map_pin_custom.png */, + 63BFC6362AD3A4D4004150C7 /* shadow_balloon.png */, + 63BFC6372AD3A4D4004150C7 /* map_pinup.png */, + 63BFC6382AD3A4D4004150C7 /* detail_button.png */, + 63BFC6392AD3A4D4004150C7 /* map_pin_custom@3x.png */, + 63BFC63A2AD3A4D4004150C7 /* map_pinup@3x.png */, + 63BFC63B2AD3A4D4004150C7 /* map_pin_shadow@3x.png */, + 63BFC63C2AD3A4D4004150C7 /* copyright.png */, + 63BFC63D2AD3A4D4004150C7 /* th_line.png */, + 63BFC63E2AD3A4D4004150C7 /* map_pin_red@3x.png */, + 63BFC63F2AD3A4D4004150C7 /* daum_copyright.png */, + 63BFC6402AD3A4D4004150C7 /* map_pin@3x.png */, + 63BFC6412AD3A4D4004150C7 /* map_present_tracking.png */, + 63BFC6422AD3A4D4004150C7 /* map_pin_red.png */, + 63BFC6432AD3A4D4004150C7 /* Headers */, + 63BFC64C2AD3A4D4004150C7 /* info_box.png */, + 63BFC64D2AD3A4D4004150C7 /* point_sprite.png */, + 63BFC64E2AD3A4D4004150C7 /* map_pinup_custom.png */, + 63BFC64F2AD3A4D4004150C7 /* info_box_tail.png */, + 63BFC6502AD3A4D4004150C7 /* noimage256.png */, + 63BFC6512AD3A4D4004150C7 /* map_present_direction.png */, + 63BFC6522AD3A4D4004150C7 /* map_pin.png */, + 63BFC6532AD3A4D4004150C7 /* map_present.png */, + 63BFC6542AD3A4D4004150C7 /* noimage.png */, + 63BFC6552AD3A4D4004150C7 /* map_present_background_update.png */, + 63BFC6562AD3A4D4004150C7 /* daum_th_line.png */, + 63BFC6572AD3A4D4004150C7 /* map_pin_shadow.png */, + ); + path = Resources; + sourceTree = ""; + }; + 63BFC6432AD3A4D4004150C7 /* Headers */ = { + isa = PBXGroup; + children = ( + 63BFC6442AD3A4D4004150C7 /* MTMapPOIItem.h */, + 63BFC6452AD3A4D4004150C7 /* MTMapCameraUpdate.h */, + 63BFC6462AD3A4D4004150C7 /* MTMapReverseGeoCoder.h */, + 63BFC6472AD3A4D4004150C7 /* MTMapPolyline.h */, + 63BFC6482AD3A4D4004150C7 /* MTMapLocationMarkerItem.h */, + 63BFC6492AD3A4D4004150C7 /* MTMapView.h */, + 63BFC64A2AD3A4D4004150C7 /* MTMapGeometry.h */, + 63BFC64B2AD3A4D4004150C7 /* MTMapCircle.h */, + ); + path = Headers; + sourceTree = ""; + }; + 63BFC6752AD3A504004150C7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 63BFC6322AD3A4D4004150C7 /* DaumMap.embeddedframework */, + 63BFC6822AD3A54E004150C7 /* libsqlite3.tbd */, + 63BFC6802AD3A53F004150C7 /* libxml2.tbd */, + 63BFC67E2AD3A535004150C7 /* libc++.tbd */, + 63BFC67C2AD3A525004150C7 /* QuartzCore.framework */, + 63BFC67A2AD3A51D004150C7 /* CoreLocation.framework */, + 63BFC6782AD3A512004150C7 /* SystemConfiguration.framework */, + 63BFC6762AD3A504004150C7 /* OpenGLES.framework */, + 6385BC612AF40D44005CDA61 /* DaumMap.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 63EA0DB12AD631F4001585EA /* AppSupport */ = { + isa = PBXGroup; + children = ( + 63BFBF0A2AD39284004150C7 /* AppDelegate.swift */, + 63BFBF0C2AD39284004150C7 /* SceneDelegate.swift */, + ); + path = AppSupport; + sourceTree = ""; + }; + 63EA0DB32AD63260001585EA /* Contorller */ = { + isa = PBXGroup; + children = ( + 63ED4C9D2AEA7E4A0000F429 /* View */, + 63BFBF0E2AD39284004150C7 /* MainViewController.swift */, + 63EA0DBE2AD63E74001585EA /* AddViewController */, + 63ED4C8D2ADCFAB20000F429 /* ListViewController */, + ); + path = Contorller; + sourceTree = ""; + }; + 63EA0DB82AD63A76001585EA /* Model */ = { + isa = PBXGroup; + children = ( + 63EA0DB92AD63A86001585EA /* Restaurant.swift */, + 63ED4C942ADEA5520000F429 /* LocationDataManager.swift */, + ); + path = Model; + sourceTree = ""; + }; + 63EA0DBE2AD63E74001585EA /* AddViewController */ = { + isa = PBXGroup; + children = ( + 63EA0DB42AD632B1001585EA /* AddViewController.swift */, + 63EA0DB62AD639DD001585EA /* AddViewController+TextViewDelegate.swift */, + ); + path = AddViewController; + sourceTree = ""; + }; + 63ED4C6D2AD8E00E0000F429 /* NetWork */ = { + isa = PBXGroup; + children = ( + 63ED4C7C2AD8E5450000F429 /* APIKey.swift */, + 63ED4C702AD8E0520000F429 /* LocationAPI.swift */, + 63ED4C6E2AD8E0260000F429 /* LocationNetWork.swift */, + ); + path = NetWork; + sourceTree = ""; + }; + 63ED4C722AD8E10B0000F429 /* Entity */ = { + isa = PBXGroup; + children = ( + 63ED4C732AD8E1AA0000F429 /* LocationData.swift */, + 63ED4C752AD8E1C00000F429 /* Document.swift */, + ); + path = Entity; + sourceTree = ""; + }; + 63ED4C792AD8E1DF0000F429 /* Error */ = { + isa = PBXGroup; + children = ( + 63ED4C7A2AD8E2140000F429 /* MapViewError.swift */, + ); + path = Error; + sourceTree = ""; + }; + 63ED4C8D2ADCFAB20000F429 /* ListViewController */ = { + isa = PBXGroup; + children = ( + 63ED4C902ADCFB280000F429 /* ListViewController.swift */, + 63ED4C922ADE85E20000F429 /* ListTableViewCell.swift */, + ); + path = ListViewController; + sourceTree = ""; + }; + 63ED4C982AE0C20E0000F429 /* Namespace */ = { + isa = PBXGroup; + children = ( + 63ED4C992AE0C24F0000F429 /* CategoryNamespace.swift */, + ); + path = Namespace; + sourceTree = ""; + }; + 63ED4C9D2AEA7E4A0000F429 /* View */ = { + isa = PBXGroup; + children = ( + 63ED4C9E2AEA7E5A0000F429 /* MainView.swift */, + ); + path = View; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -125,9 +414,36 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 63BFC66B2AD3A4D4004150C7 /* info_box_tail.png in Resources */, + 63BFC6602AD3A4D4004150C7 /* map_pin_shadow@3x.png in Resources */, + 63BFC66E2AD3A4D4004150C7 /* map_pin.png in Resources */, + 63BFC6672AD3A4D4004150C7 /* map_pin_red.png in Resources */, + 63BFC65F2AD3A4D4004150C7 /* map_pinup@3x.png in Resources */, + 63BFC6692AD3A4D4004150C7 /* point_sprite.png in Resources */, + 63BFC6652AD3A4D4004150C7 /* map_pin@3x.png in Resources */, + 63BFC66C2AD3A4D4004150C7 /* noimage256.png in Resources */, + 63BFC66F2AD3A4D4004150C7 /* map_present.png in Resources */, + 63BFC6642AD3A4D4004150C7 /* daum_copyright.png in Resources */, + 63BFC6612AD3A4D4004150C7 /* copyright.png in Resources */, + 63BFC65B2AD3A4D4004150C7 /* shadow_balloon.png in Resources */, + 63BFC65E2AD3A4D4004150C7 /* map_pin_custom@3x.png in Resources */, + 63BFC6622AD3A4D4004150C7 /* th_line.png in Resources */, + 63BFC66A2AD3A4D4004150C7 /* map_pinup_custom.png in Resources */, 63BFBF172AD39286004150C7 /* LaunchScreen.storyboard in Resources */, + 63BFC6722AD3A4D4004150C7 /* daum_th_line.png in Resources */, + 63BFC6592AD3A4D4004150C7 /* map_pinup_custom@3x.png in Resources */, 63BFBF142AD39286004150C7 /* Assets.xcassets in Resources */, - 63BFBF122AD39284004150C7 /* Main.storyboard in Resources */, + 63BFC6662AD3A4D4004150C7 /* map_present_tracking.png in Resources */, + 63BFC6732AD3A4D4004150C7 /* map_pin_shadow.png in Resources */, + 63BFC66D2AD3A4D4004150C7 /* map_present_direction.png in Resources */, + 63BFC6712AD3A4D4004150C7 /* map_present_background_update.png in Resources */, + 63BFC65D2AD3A4D4004150C7 /* detail_button.png in Resources */, + 63ED4C862AD91E400000F429 /* Keys.plist in Resources */, + 63BFC6632AD3A4D4004150C7 /* map_pin_red@3x.png in Resources */, + 63BFC6702AD3A4D4004150C7 /* noimage.png in Resources */, + 63BFC6682AD3A4D4004150C7 /* info_box.png in Resources */, + 63BFC65A2AD3A4D4004150C7 /* map_pin_custom.png in Resources */, + 63BFC65C2AD3A4D4004150C7 /* map_pinup.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -138,23 +454,29 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 63BFBF0F2AD39284004150C7 /* ViewController.swift in Sources */, + 63ED4C742AD8E1AA0000F429 /* LocationData.swift in Sources */, + 63ED4C952ADEA5520000F429 /* LocationDataManager.swift in Sources */, + 63ED4C7B2AD8E2140000F429 /* MapViewError.swift in Sources */, + 63BFBF0F2AD39284004150C7 /* MainViewController.swift in Sources */, 63BFBF0B2AD39284004150C7 /* AppDelegate.swift in Sources */, + 63EA0DBA2AD63A86001585EA /* Restaurant.swift in Sources */, + 63ED4C762AD8E1C00000F429 /* Document.swift in Sources */, + 63ED4C912ADCFB280000F429 /* ListViewController.swift in Sources */, + 63ED4C6F2AD8E0260000F429 /* LocationNetWork.swift in Sources */, + 63EA0DB72AD639DD001585EA /* AddViewController+TextViewDelegate.swift in Sources */, + 63EA0DB52AD632B1001585EA /* AddViewController.swift in Sources */, + 63ED4C9F2AEA7E5A0000F429 /* MainView.swift in Sources */, 63BFBF0D2AD39284004150C7 /* SceneDelegate.swift in Sources */, + 63ED4C9A2AE0C24F0000F429 /* CategoryNamespace.swift in Sources */, + 63ED4C7D2AD8E5450000F429 /* APIKey.swift in Sources */, + 63ED4C712AD8E0520000F429 /* LocationAPI.swift in Sources */, + 63ED4C932ADE85E20000F429 /* ListTableViewCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 63BFBF102AD39284004150C7 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 63BFBF112AD39284004150C7 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; 63BFBF152AD39286004150C7 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -174,7 +496,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_ARC = NO; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -222,6 +544,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OBJC_BRIDGING_HEADER = /Users/a1/Desktop/FoodMaps/FoodMaps/BridgingHeader.h; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; @@ -234,7 +557,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_ARC = NO; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -275,6 +598,7 @@ MTL_FAST_MATH = YES; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OBJC_BRIDGING_HEADER = /Users/a1/Desktop/FoodMaps/FoodMaps/BridgingHeader.h; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; @@ -287,11 +611,18 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 6923PJ958M; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/DaumMap.embeddedframework", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = FoodMaps/Info.plist; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "위치를 받으려는 권한을 획득입니다."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "위치를 받으려는 권한을 획득입니다."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "위치 기반 정보 탐색 및 검색 기능을 이용 할 수 있습니다.(필수권한)"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( @@ -302,6 +633,7 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.co.hemg2.FoodMaps; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "/Users/a1/ios-foodmaps/FoodMaps/BridgingHeader.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -314,11 +646,18 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 6923PJ958M; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/DaumMap.embeddedframework", + ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = FoodMaps/Info.plist; + INFOPLIST_KEY_NSLocationAlwaysAndWhenInUseUsageDescription = "위치를 받으려는 권한을 획득입니다."; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "위치를 받으려는 권한을 획득입니다."; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "위치 기반 정보 탐색 및 검색 기능을 이용 할 수 있습니다.(필수권한)"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( @@ -329,6 +668,7 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.co.hemg2.FoodMaps; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "/Users/a1/ios-foodmaps/FoodMaps/BridgingHeader.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/FoodMaps.xcodeproj/xcshareddata/xcschemes/FoodMaps.xcscheme b/FoodMaps.xcodeproj/xcshareddata/xcschemes/FoodMaps.xcscheme new file mode 100644 index 0000000..1bd7f28 --- /dev/null +++ b/FoodMaps.xcodeproj/xcshareddata/xcschemes/FoodMaps.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FoodMaps/AppDelegate.swift b/FoodMaps/AppSupport/AppDelegate.swift similarity index 100% rename from FoodMaps/AppDelegate.swift rename to FoodMaps/AppSupport/AppDelegate.swift diff --git a/FoodMaps/SceneDelegate.swift b/FoodMaps/AppSupport/SceneDelegate.swift similarity index 80% rename from FoodMaps/SceneDelegate.swift rename to FoodMaps/AppSupport/SceneDelegate.swift index c6d781d..4d48516 100644 --- a/FoodMaps/SceneDelegate.swift +++ b/FoodMaps/AppSupport/SceneDelegate.swift @@ -13,10 +13,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } + guard let windowScene = (scene as? UIWindowScene) else { return } + + window = UIWindow(windowScene: windowScene) + let mainViewController = MainViewController() + let navigationController = UINavigationController(rootViewController: mainViewController) + window?.rootViewController = navigationController + window?.makeKeyAndVisible() } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/FoodMaps/Assets.xcassets/Tag.imageset/Contents.json b/FoodMaps/Assets.xcassets/Tag.imageset/Contents.json new file mode 100644 index 0000000..8b8f3cb --- /dev/null +++ b/FoodMaps/Assets.xcassets/Tag.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Tag.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FoodMaps/Assets.xcassets/Tag.imageset/Tag.pdf b/FoodMaps/Assets.xcassets/Tag.imageset/Tag.pdf new file mode 100644 index 0000000..b6979ca Binary files /dev/null and b/FoodMaps/Assets.xcassets/Tag.imageset/Tag.pdf differ diff --git "a/FoodMaps/Assets.xcassets/\353\257\270\352\265\255.imageset/Contents.json" "b/FoodMaps/Assets.xcassets/\353\257\270\352\265\255.imageset/Contents.json" new file mode 100644 index 0000000..b3c2c24 --- /dev/null +++ "b/FoodMaps/Assets.xcassets/\353\257\270\352\265\255.imageset/Contents.json" @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "United-States64.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/FoodMaps/Assets.xcassets/\353\257\270\352\265\255.imageset/United-States64.png" "b/FoodMaps/Assets.xcassets/\353\257\270\352\265\255.imageset/United-States64.png" new file mode 100644 index 0000000..f8da68a Binary files /dev/null and "b/FoodMaps/Assets.xcassets/\353\257\270\352\265\255.imageset/United-States64.png" differ diff --git "a/FoodMaps/Assets.xcassets/\354\235\274\353\263\270.imageset/Contents.json" "b/FoodMaps/Assets.xcassets/\354\235\274\353\263\270.imageset/Contents.json" new file mode 100644 index 0000000..fce79e3 --- /dev/null +++ "b/FoodMaps/Assets.xcassets/\354\235\274\353\263\270.imageset/Contents.json" @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Japan64.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/FoodMaps/Assets.xcassets/\354\235\274\353\263\270.imageset/Japan64.png" "b/FoodMaps/Assets.xcassets/\354\235\274\353\263\270.imageset/Japan64.png" new file mode 100644 index 0000000..2b4213a Binary files /dev/null and "b/FoodMaps/Assets.xcassets/\354\235\274\353\263\270.imageset/Japan64.png" differ diff --git "a/FoodMaps/Assets.xcassets/\354\244\221\352\265\255.imageset/China64.png" "b/FoodMaps/Assets.xcassets/\354\244\221\352\265\255.imageset/China64.png" new file mode 100644 index 0000000..7acf87b Binary files /dev/null and "b/FoodMaps/Assets.xcassets/\354\244\221\352\265\255.imageset/China64.png" differ diff --git "a/FoodMaps/Assets.xcassets/\354\244\221\352\265\255.imageset/Contents.json" "b/FoodMaps/Assets.xcassets/\354\244\221\352\265\255.imageset/Contents.json" new file mode 100644 index 0000000..e87135b --- /dev/null +++ "b/FoodMaps/Assets.xcassets/\354\244\221\352\265\255.imageset/Contents.json" @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "China64.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/FoodMaps/Assets.xcassets/\355\225\234\352\265\255.imageset/Contents.json" "b/FoodMaps/Assets.xcassets/\355\225\234\352\265\255.imageset/Contents.json" new file mode 100644 index 0000000..6298bbb --- /dev/null +++ "b/FoodMaps/Assets.xcassets/\355\225\234\352\265\255.imageset/Contents.json" @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Korea64.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/FoodMaps/Assets.xcassets/\355\225\234\352\265\255.imageset/Korea64.png" "b/FoodMaps/Assets.xcassets/\355\225\234\352\265\255.imageset/Korea64.png" new file mode 100644 index 0000000..98bd1d3 Binary files /dev/null and "b/FoodMaps/Assets.xcassets/\355\225\234\352\265\255.imageset/Korea64.png" differ diff --git a/FoodMaps/Base.lproj/Main.storyboard b/FoodMaps/Base.lproj/Main.storyboard deleted file mode 100644 index 25a7638..0000000 --- a/FoodMaps/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/FoodMaps/BridgingHeader.h b/FoodMaps/BridgingHeader.h new file mode 100644 index 0000000..9b5b3ae --- /dev/null +++ b/FoodMaps/BridgingHeader.h @@ -0,0 +1,13 @@ +// +// BridgingHeader.h +// FoodMaps +// +// Created by 1 on 2023/10/09. +// + +#ifndef BridgingHeader_h +#define BridgingHeader_h + +#import + +#endif /* BridgingHeader_h */ diff --git a/FoodMaps/Contorller/AddViewController/AddViewController+TextViewDelegate.swift b/FoodMaps/Contorller/AddViewController/AddViewController+TextViewDelegate.swift new file mode 100644 index 0000000..c46457b --- /dev/null +++ b/FoodMaps/Contorller/AddViewController/AddViewController+TextViewDelegate.swift @@ -0,0 +1,22 @@ +// +// AddViewController+TextViewDelegate.swift +// FoodMaps +// +// Created by Hemg on 10/11/23. +// + +extension AddViewController: UITextViewDelegate { + func textViewDidBeginEditing(_ textView: UITextView) { + if textView.textColor == .placeholderText { + textView.text = nil + textView.textColor = .label + } + } + + func textViewDidEndEditing(_ textView: UITextView) { + if textView.text.isEmpty { + textView.text = "내용 입력하는 곳입니다." + textView.textColor = .placeholderText + } + } +} diff --git a/FoodMaps/Contorller/AddViewController/AddViewController.swift b/FoodMaps/Contorller/AddViewController/AddViewController.swift new file mode 100644 index 0000000..0007740 --- /dev/null +++ b/FoodMaps/Contorller/AddViewController/AddViewController.swift @@ -0,0 +1,189 @@ +// +// AddViewController.swift +// FoodMaps +// +// Created by Hemg on 10/11/23. +// + +import UIKit + +protocol AddRestaurant: AnyObject { + func didAddRestaurants(title: String, description: String, category: RestaurantCategory) + func didEditRestaurant(title: String, description: String, index: Int, category: RestaurantCategory) + func deletePin(withTag tag: Int) +} + +final class AddViewController: UIViewController { + private let titleTextField: UITextField = { + let textField = UITextField() + textField.translatesAutoresizingMaskIntoConstraints = false + textField.font = .preferredFont(forTextStyle: .title1) + textField.placeholder = "식당이름" + textField.layer.borderColor = UIColor.lightGray.cgColor + textField.layer.borderWidth = 1.0 + + return textField + }() + + private let categoryControl: UISegmentedControl = { + let segmentedControl = UISegmentedControl(items: RestaurantCategory.allCases.map { $0.rawValue }) + segmentedControl.selectedSegmentIndex = 0 + segmentedControl.translatesAutoresizingMaskIntoConstraints = false + + return segmentedControl + }() + + private let descriptionTextView: UITextView = { + let textView = UITextView() + textView.translatesAutoresizingMaskIntoConstraints = false + textView.font = .preferredFont(forTextStyle: .body) + textView.text = "내용 입력하는 곳입니다." + textView.textColor = .placeholderText + textView.layer.borderColor = UIColor.lightGray.cgColor + textView.layer.borderWidth = 1.0 + + return textView + }() + + private let isNew: Bool + private let mapPoint: MTMapPoint + private var index: Int? + private var poiItem: MTMapPOIItem? + private var restaurantList: Restaurant? + weak var delegate: AddRestaurant? + + init(mapPoint: MTMapPoint, index: Int?) { + self.isNew = true + self.mapPoint = mapPoint + self.index = index + super.init(nibName: nil, bundle: nil) + } + + init(restaurantList: Restaurant?, mapPoint: MTMapPoint, index: Int?) { + self.isNew = false + self.mapPoint = mapPoint + self.index = index + self.restaurantList = restaurantList + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + setUpViewController() + setUpBarButtonItem() + configureUI() + setUpViewLayout() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + setUpItemValues() + } + + private func configureUI() { + view.addSubview(categoryControl) + view.addSubview(titleTextField) + view.addSubview(descriptionTextView) + } + + private func setUpViewLayout() { + NSLayoutConstraint.activate([ + categoryControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 4), + categoryControl.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 4), + categoryControl.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -4), + + titleTextField.topAnchor.constraint(equalTo: categoryControl.bottomAnchor, constant: 8), + titleTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 4), + titleTextField.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -4), + + descriptionTextView.topAnchor.constraint(equalTo: titleTextField.bottomAnchor, constant: 8), + descriptionTextView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 4), + descriptionTextView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -4), + descriptionTextView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -4) + ]) + } +} + +//MARK: - Navigation +extension AddViewController { + private func setUpViewController() { + view.backgroundColor = .systemBackground + descriptionTextView.delegate = self + + if isNew { + self.title = "음식점 추가" + } else { + self.title = "음식점 변경" + } + } + + private func setUpBarButtonItem() { + let deleteButton = UIBarButtonItem(title: "Delete", style: .done, target: self, action: #selector(deleteButton)) + navigationItem.rightBarButtonItem = deleteButton + + if isNew { + let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneButton)) + let cancelButton = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(cancelButton)) + navigationItem.rightBarButtonItem = doneButton + navigationItem.leftBarButtonItem = cancelButton + } else { + let editButton = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(editButton)) + navigationItem.leftBarButtonItem = editButton + } + } + + @objc private func doneButton() { + let selectedCategory: RestaurantCategory = RestaurantCategory.allCases[categoryControl.selectedSegmentIndex] + setUpItemText(category: selectedCategory) + dismiss(animated: true) + } + + @objc private func deleteButton() { + guard let tag = self.index else { + return + } + + delegate?.deletePin(withTag: tag) + dismiss(animated: true) + } + + @objc private func cancelButton() { + dismiss(animated: true) + } + + @objc private func editButton() { + let selectedCategory: RestaurantCategory = RestaurantCategory.allCases[categoryControl.selectedSegmentIndex] + setUpItemText(category: selectedCategory) + dismiss(animated: true) + } + + private func setUpItemValues() { + if let restaurantList = restaurantList { + titleTextField.text = restaurantList.title + descriptionTextView.text = restaurantList.description + } + } + + private func setUpItemText(category: RestaurantCategory) { + guard let titleText = titleTextField.text, + let descriptionText = descriptionTextView.text, + let index = index else { return } + + let newPoint = MTMapPOIItem() + newPoint.itemName = title + newPoint.mapPoint = mapPoint + + if isNew { + delegate?.didAddRestaurants(title: titleText, description: descriptionText, category: category) + } else { + restaurantList?.title = titleText + restaurantList?.description = descriptionText + delegate?.didEditRestaurant(title: titleText, description: descriptionText, index: index, category: category) + } + } +} diff --git a/FoodMaps/Contorller/ListViewController/ListTableViewCell.swift b/FoodMaps/Contorller/ListViewController/ListTableViewCell.swift new file mode 100644 index 0000000..6c40c37 --- /dev/null +++ b/FoodMaps/Contorller/ListViewController/ListTableViewCell.swift @@ -0,0 +1,107 @@ +// +// ListTableViewCell.swift +// FoodMaps +// +// Created by Hemg on 10/17/23. +// + +import UIKit + +final class ListTableViewCell: UITableViewCell { + private let titleLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .preferredFont(forTextStyle: .title1) + label.numberOfLines = 1 + + return label + }() + + private let categoryNameLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .preferredFont(forTextStyle: .callout) + label.numberOfLines = 1 + + return label + }() + + private let addressNameLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .preferredFont(forTextStyle: .body) + label.numberOfLines = 0 + + return label + }() + + private let distanceLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = .preferredFont(forTextStyle: .headline) + + return label + }() + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + configureUI() + setUpLabelLayout() + } + + override func prepareForReuse() { + super.prepareForReuse() + titleLabel.text = nil + categoryNameLabel.text = nil + addressNameLabel.text = nil + distanceLabel.text = nil + } + + private func configureUI() { + contentView.addSubview(titleLabel) + contentView.addSubview(categoryNameLabel) + contentView.addSubview(addressNameLabel) + contentView.addSubview(distanceLabel) + } + + private func setUpLabelLayout() { + NSLayoutConstraint.activate([ + titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor), + titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -28), + titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + + categoryNameLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 4), + categoryNameLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + + addressNameLabel.topAnchor.constraint(equalTo: categoryNameLabel.bottomAnchor, constant: 4), + addressNameLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + addressNameLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -4), + + distanceLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 4), + distanceLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -4), + distanceLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -12), + ]) + } + + func setModel(title: String, category: String, address: String, distance: String) { + titleLabel.text = title + categoryNameLabel.text = cleanCategoryName(category) + addressNameLabel.text = address + distanceLabel.text = "\(addDistance(distance: distance))M" + } + + private func addDistance(distance: String) -> Int { + if let intDistance: Int = Int(distance) { + return Int(intDistance * 2) + } + return 0 + } + + private func cleanCategoryName(_ category: String) -> String { + let prefixToRemove = "음식점 > " + if category.hasPrefix(prefixToRemove) { + return String(category.dropFirst(prefixToRemove.count)) + } + return category + } +} diff --git a/FoodMaps/Contorller/ListViewController/ListViewController.swift b/FoodMaps/Contorller/ListViewController/ListViewController.swift new file mode 100644 index 0000000..fc1a420 --- /dev/null +++ b/FoodMaps/Contorller/ListViewController/ListViewController.swift @@ -0,0 +1,78 @@ +// +// ListViewController.swift +// FoodMaps +// +// Created by Hemg on 10/16/23. +// + +import UIKit + +final class ListViewController: UIViewController { + private let tableView: UITableView = { + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + + return tableView + }() + + private var locationData: LocationData? + + override func viewDidLoad() { + super.viewDidLoad() + + configureUI() + setUpTableViewLayout() + fetchLocationData() + } + + private func configureUI() { + title = "맛집 리스트" + view.backgroundColor = .systemBackground + view.addSubview(tableView) + } + + private func setUpTableViewLayout() { + tableView.dataSource = self + tableView.delegate = self + tableView.register(ListTableViewCell.self, forCellReuseIdentifier: "ListCell") + + NSLayoutConstraint.activate([ + tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), + tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor) + ]) + } + + private func fetchLocationData() { + self.locationData = LocationDataManager.shared.locationData + tableView.reloadData() + } +} + +extension ListViewController: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return locationData?.documents.count ?? 0 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell", for: indexPath) as? ListTableViewCell else { + return UITableViewCell() + } + + if let document = locationData?.documents[indexPath.row] { + cell.setModel(title: document.placeName, + category: document.categoryName, + address: document.addressName, + distance: document.distance) + } + + return cell + } +} + +extension ListViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + } +} diff --git a/FoodMaps/Contorller/MainViewController.swift b/FoodMaps/Contorller/MainViewController.swift new file mode 100644 index 0000000..9b176d1 --- /dev/null +++ b/FoodMaps/Contorller/MainViewController.swift @@ -0,0 +1,275 @@ +// +// MainViewController.swift +// FoodMaps +// +// Created by Hemg on 2023/10/09. +// + +import UIKit +import CoreLocation + +final class MainViewController: UIViewController { + private var mainView: MainView { view as! MainView } + private var mapPointValue = MTMapPoint() + private var locationManager = CLLocationManager() + private var restaurantItems = [RestaurantItem]() + private let locationNetWork = LocationNetWork() + + override func loadView() { + view = MainView() + } + + override func viewDidLoad() { + super.viewDidLoad() + moveToMyLocation() + setUpLocationManager() + setUpButtonAction() + } + + private func setUpButtonAction() { + let locationAction = UIAction { [weak self] _ in + self?.moveToMyLocation() + } + mainView.currentLocationButton.addAction(locationAction, for: .touchUpInside) + + let foodStoreAction = UIAction { [weak self] _ in + self?.fetchLocationData(category: CategoryNamespace.foodStore) + } + mainView.foodStoreButton.addAction(foodStoreAction, for: .touchUpInside) + + let cafeAction = UIAction { [weak self] _ in + self?.fetchLocationData(category: CategoryNamespace.cafe) + } + mainView.cafeButton.addAction(cafeAction, for: .touchUpInside) + + let convenienceAction = UIAction { [weak self] _ in + self?.fetchLocationData(category: CategoryNamespace.convenienceStore) + } + mainView.convenienceStoreButton.addAction(convenienceAction, for: .touchUpInside) + + let parkingAction = UIAction { [weak self] _ in + self?.fetchLocationData(category: CategoryNamespace.parking) + } + mainView.parkingButton.addAction(parkingAction, for: .touchUpInside) + + let listAction = UIAction { [weak self] _ in + self?.showListView() + } + mainView.listButton.addAction(listAction, for: .touchUpInside) + } + + private func moveToMyLocation() { + if let location = locationManager.location?.coordinate { + let userLocation = MTMapPoint(geoCoord: .init(latitude: location.latitude, longitude: location.longitude)) + mainView.mapView.setMapCenter(userLocation, animated: true) + } + } + + private func fetchLocationData(category: String) { + locationNetWork.getLocation(by: mapPointValue, categoryValue: category) { [weak self] result in + guard let self else { return } + switch result { + case .success(let locationData): + LocationDataManager.shared.locationData = locationData + self.addMarkers(for: locationData) + case .failure(let error): + print(error) + } + } + mainView.mapView.removeAllPOIItems() + let customPins = restaurantItems.map { $0.poiItem } + mainView.mapView.addPOIItems(customPins) + } + + private func addMarkers(for locationData: LocationData) { + for item in locationData.documents { + let poiItem = MTMapPOIItem() + poiItem.itemName = item.placeName + if let latitude = Double(item.y), let longitude = Double(item.x) { + poiItem.mapPoint = MTMapPoint(geoCoord: .init(latitude: latitude, longitude: longitude)) + } + poiItem.markerType = .yellowPin + mainView.mapView.addPOIItems([poiItem]) + } + } + + private func showListView() { + let listViewController = ListViewController() + navigationController?.pushViewController(listViewController, animated: true) + } +} + +extension MainViewController: UISearchBarDelegate { + func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { + updateMapView(with: searchText) + } + + func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { + searchBar.text = "" + updateMapView(with: "") + } + + private func updateMapView(with searchText: String) { + mainView.mapView.removeAllPOIItems() + let filteredPoiItems: [MTMapPOIItem] + + if searchText.isEmpty { + filteredPoiItems = restaurantItems.map { $0.poiItem } + } else { + filteredPoiItems = restaurantItems.filter { restaurant in + let itemName = restaurant.poiItem.itemName.lowercased() + let lowercasedSearchText = searchText.lowercased() + return itemName.contains(lowercasedSearchText) + }.map { $0.poiItem } + } + + mainView.mapView.addPOIItems(filteredPoiItems) + } +} + +extension MainViewController: MTMapViewDelegate { + func mapView(_ mapView: MTMapView!, longPressOn mapPoint: MTMapPoint!) { + self.mapPointValue = mapPoint + let poiItem = MTMapPOIItem() + let addViewController = AddViewController(mapPoint: mapPoint, index: poiItem.tag) + let navigationController = UINavigationController(rootViewController: addViewController) + + addViewController.delegate = self + present(navigationController, animated: true) + } + + func mapView(_ mapView: MTMapView!, touchedCalloutBalloonRightSideOf poiItem: MTMapPOIItem!) { + let alertController = UIAlertController(title: "수정", message: "마커 수정", preferredStyle: .actionSheet) + let editAction = UIAlertAction(title: "수정진행", style: .default) { [weak self] _ in + let currentCategory = self?.restaurantItems.first { $0.poiItem.tag == poiItem.tag }?.restaurant.category ?? .korean + let restaurant = Restaurant(title: poiItem.itemName, + description: poiItem.userObject as? String ?? "", + category: currentCategory) + let addViewController = AddViewController(restaurantList: restaurant, mapPoint: poiItem.mapPoint, index: poiItem.tag) + let navigationController = UINavigationController(rootViewController: addViewController) + + addViewController.delegate = self + self?.present(navigationController, animated: true) + } + + let cancelAction = UIAlertAction(title: "취소", style: .cancel) + + alertController.addAction(editAction) + alertController.addAction(cancelAction) + present(alertController, animated: true) + } + + func mapView(_ mapView: MTMapView!, updateCurrentLocation location: MTMapPoint!, withAccuracy accuracy: MTMapLocationAccuracy) { + print("위치가 업데이트 될때마다 호출") + } + + func mapView(_ mapView: MTMapView!, finishedMapMoveAnimation mapCenterPoint: MTMapPoint!) { + mapPointValue = mapCenterPoint + } +} + +extension MainViewController: CLLocationManagerDelegate { + private func setUpLocationManager() { + locationManager.delegate = self + locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters + locationManager.startUpdatingLocation() + getLocationUsagePermission() + } + + private func getLocationUsagePermission() { + self.locationManager.requestWhenInUseAuthorization() + } + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + switch status { + case .authorizedAlways,.authorizedWhenInUse: + print("GPS 권한 설정됨") + case .restricted,.notDetermined: + print("GPS 권한 설정되지 않음") + getLocationUsagePermission() + case .denied: + print("GPS 권한 요청 거부됨") + getLocationUsagePermission() + default: + print("GPS:Default") + } + } +} + +extension MainViewController: AddRestaurant { + func didAddRestaurants(title: String, description: String, category: RestaurantCategory) { + let newRestaurants = Restaurant(title: title, description: description, category: category) + let newPoint = MTMapPOIItem() + newPoint.itemName = title + newPoint.userObject = description as NSObject + newPoint.mapPoint = mapPointValue + + switch category { + case .korean: + newPoint.markerType = .customImage + newPoint.customImage = UIImage(named: "한국") + case .chinese: + newPoint.markerType = .customImage + newPoint.customImage = UIImage(named: "중국") + case .japanese: + newPoint.markerType = .customImage + newPoint.customImage = UIImage(named: "일본") + case .western: + newPoint.markerType = .customImage + newPoint.customImage = UIImage(named: "미국") + } + + if let lastIndex = restaurantItems.last?.poiItem.tag { + newPoint.tag = lastIndex + 1 + } else { + newPoint.tag = 0 + } + + let restaurantItem = RestaurantItem(restaurant: newRestaurants, poiItem: newPoint) + restaurantItems.append(restaurantItem) + mainView.mapView.addPOIItems([newPoint]) + mainView.mapView.setMapCenter(mapPointValue, zoomLevel: 2, animated: true) + } + + func didEditRestaurant(title: String, description: String, index: Int, category: RestaurantCategory) { + guard index >= 0 && index < restaurantItems.count else { + return + } + + let modifiedPOIItem = restaurantItems[index].poiItem + modifiedPOIItem.itemName = title + modifiedPOIItem.userObject = description as NSObject + + switch category { + case .korean: + modifiedPOIItem.markerType = .customImage + modifiedPOIItem.customImage = UIImage(named: "한국") + case .chinese: + modifiedPOIItem.markerType = .customImage + modifiedPOIItem.customImage = UIImage(named: "중국") + case .japanese: + modifiedPOIItem.markerType = .customImage + modifiedPOIItem.customImage = UIImage(named: "일본") + case .western: + modifiedPOIItem.markerType = .customImage + modifiedPOIItem.customImage = UIImage(named: "미국") + } + + mainView.mapView.addPOIItems(restaurantItems.map{$0.poiItem}) + mainView.mapView.select(modifiedPOIItem, animated: true) + mainView.mapView.updateConstraints() + } + + func deletePin(withTag tag: Int) { + guard tag >= 0 && tag < restaurantItems.count else { return } + + let poiItemToRemove = restaurantItems[tag].poiItem + mainView.mapView + .removePOIItems([poiItemToRemove]) + restaurantItems.remove(at: tag) + + for (index, item) in restaurantItems.enumerated() { + item.poiItem.tag = index + } + } +} diff --git a/FoodMaps/Contorller/View/MainView.swift b/FoodMaps/Contorller/View/MainView.swift new file mode 100644 index 0000000..bea36dc --- /dev/null +++ b/FoodMaps/Contorller/View/MainView.swift @@ -0,0 +1,165 @@ +// +// MainView.swift +// FoodMaps +// +// Created by 1 on 10/26/23. +// + +import Foundation + +final class MainView: UIView { + let searchBar: UISearchBar = { + let searchBar = UISearchBar() + searchBar.searchBarStyle = .minimal + searchBar.backgroundColor = .white + searchBar.placeholder = "식당 검색" + searchBar.translatesAutoresizingMaskIntoConstraints = false + + return searchBar + }() + + let currentLocationButton: UIButton = { + let button = UIButton() + button.setImage(UIImage(systemName: "location.fill"), for: .normal) + button.backgroundColor = .white + button.layer.cornerRadius = 20 + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + let foodStoreButton: UIButton = { + let button = UIButton() + button.setTitle("맛집!", for: .normal) + button.setTitleColor(.black, for: .normal) + button.backgroundColor = .white + button.layer.cornerRadius = 10 + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + let cafeButton: UIButton = { + let button = UIButton() + button.setTitle("카페", for: .normal) + button.setTitleColor(.black, for: .normal) + button.backgroundColor = .white + button.layer.cornerRadius = 10 + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + let convenienceStoreButton: UIButton = { + let button = UIButton() + button.setTitle("편의점", for: .normal) + button.setTitleColor(.black, for: .normal) + button.backgroundColor = .white + button.layer.cornerRadius = 10 + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + let parkingButton: UIButton = { + let button = UIButton() + button.setTitle("주차장", for: .normal) + button.setTitleColor(.black, for: .normal) + button.backgroundColor = .white + button.layer.cornerRadius = 10 + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + let listButton: UIButton = { + let button = UIButton() + button.setTitle("목록", for: .normal) + button.setTitleColor(.black, for: .normal) + button.backgroundColor = .white + button.layer.cornerRadius = 20 + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + var mapView = MTMapView() + private weak var delegate: (UISearchBarDelegate & MTMapViewDelegate)? + + override init(frame: CGRect) { + super.init(frame: frame) + setUpMap() + setUpSearchBarUI() + setUpButton() + } + + convenience init(delegate: UISearchBarDelegate & MTMapViewDelegate) { + self.init(frame: .zero) + self.delegate = delegate + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUpMap() { + mapView = MTMapView(frame: self.frame) + mapView.delegate = delegate + mapView.baseMapType = .standard + self.addSubview(mapView) + mapView.showCurrentLocationMarker = true + mapView.currentLocationTrackingMode = .onWithHeadingWithoutMapMoving + } + + private func setUpSearchBarUI() { + addSubview(searchBar) + searchBar.delegate = delegate + + NSLayoutConstraint.activate([ + searchBar.topAnchor.constraint(equalTo: topAnchor, constant: 80), + searchBar.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 4), + searchBar.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -4) + ]) + } + + private func setUpButton() { + addSubview(currentLocationButton) + addSubview(foodStoreButton) + addSubview(cafeButton) + addSubview(convenienceStoreButton) + addSubview(parkingButton) + addSubview(listButton) + + NSLayoutConstraint.activate([ + currentLocationButton.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -12), + currentLocationButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12), + currentLocationButton.widthAnchor.constraint(equalToConstant: 40), + currentLocationButton.heightAnchor.constraint(equalToConstant: 40), + + foodStoreButton.topAnchor.constraint(equalTo: searchBar.bottomAnchor, constant: 12), + foodStoreButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12), + foodStoreButton.widthAnchor.constraint(equalToConstant: 50), + foodStoreButton.heightAnchor.constraint(equalToConstant: 20), + + cafeButton.centerYAnchor.constraint(equalTo: foodStoreButton.centerYAnchor), + cafeButton.leadingAnchor.constraint(equalTo: foodStoreButton.trailingAnchor, constant: 12), + cafeButton.widthAnchor.constraint(equalToConstant: 50), + cafeButton.heightAnchor.constraint(equalToConstant: 20), + + convenienceStoreButton.centerYAnchor.constraint(equalTo: foodStoreButton.centerYAnchor), + convenienceStoreButton.leadingAnchor.constraint(equalTo: cafeButton.trailingAnchor, constant: 12), + convenienceStoreButton.widthAnchor.constraint(equalToConstant: 50), + convenienceStoreButton.heightAnchor.constraint(equalToConstant: 20), + + parkingButton.centerYAnchor.constraint(equalTo: foodStoreButton.centerYAnchor), + parkingButton.leadingAnchor.constraint(equalTo: convenienceStoreButton.trailingAnchor, constant: 12), + parkingButton.widthAnchor.constraint(equalToConstant: 50), + parkingButton.heightAnchor.constraint(equalToConstant: 20), + + listButton.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -12), + listButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -12), + listButton.widthAnchor.constraint(equalToConstant: 40), + listButton.heightAnchor.constraint(equalToConstant: 40) + ]) + } +} diff --git a/FoodMaps/Entity/Document.swift b/FoodMaps/Entity/Document.swift new file mode 100644 index 0000000..168f8f3 --- /dev/null +++ b/FoodMaps/Entity/Document.swift @@ -0,0 +1,24 @@ +// +// Document.swift +// FoodMaps +// +// Created by Hemg on 10/13/23. +// + +struct Document: Decodable { + let placeName: String + let addressName: String + let roadAddressName: String + let x: String + let y: String + let distance: String + let categoryName: String + + enum CodingKeys: String, CodingKey { + case x, y, distance + case placeName = "place_name" + case addressName = "address_name" + case roadAddressName = "road_address_name" + case categoryName = "category_name" + } +} diff --git a/FoodMaps/Entity/LocationData.swift b/FoodMaps/Entity/LocationData.swift new file mode 100644 index 0000000..a979d96 --- /dev/null +++ b/FoodMaps/Entity/LocationData.swift @@ -0,0 +1,10 @@ +// +// LocationData.swift +// FoodMaps +// +// Created by Hemg on 10/13/23. +// + +struct LocationData: Decodable { + let documents: [Document] +} diff --git a/FoodMaps/Error/MapViewError.swift b/FoodMaps/Error/MapViewError.swift new file mode 100644 index 0000000..982b485 --- /dev/null +++ b/FoodMaps/Error/MapViewError.swift @@ -0,0 +1,20 @@ +// +// MapViewError.swift +// FoodMaps +// +// Created by Hemg on 10/13/23. +// + +enum MapViewError: Error { + case failedUpdatingCurrentLocation + case locationAuthorizaationDenied + + var errorDescription: String { + switch self { + case .failedUpdatingCurrentLocation: + return "현재 위치를 불러오지 못했어요. 잠시 후 다시 시도해주세요." + case .locationAuthorizaationDenied: + return "위치 정보를 비활성화하면 사용자의 현재 위치를 알 수 없어요." + } + } +} diff --git a/FoodMaps/Info.plist b/FoodMaps/Info.plist index dd3c9af..da92506 100644 --- a/FoodMaps/Info.plist +++ b/FoodMaps/Info.plist @@ -2,6 +2,8 @@ + KAKAO_APP_KEY + 31dc6fed9ccc85383fbd38f932039bb1 UIApplicationSceneManifest UIApplicationSupportsMultipleScenes @@ -15,8 +17,6 @@ Default Configuration UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main diff --git a/FoodMaps/Keys.plist b/FoodMaps/Keys.plist new file mode 100644 index 0000000..dfdf185 --- /dev/null +++ b/FoodMaps/Keys.plist @@ -0,0 +1,8 @@ + + + + + KAKAOAPIKey + KakaoAK 64ae52cfe89ccadd50b5103f24f60500 + + diff --git a/FoodMaps/Model/LocationDataManager.swift b/FoodMaps/Model/LocationDataManager.swift new file mode 100644 index 0000000..e5d443b --- /dev/null +++ b/FoodMaps/Model/LocationDataManager.swift @@ -0,0 +1,13 @@ +// +// DataManager.swift +// FoodMaps +// +// Created by Hemg on 10/17/23. +// + +final class LocationDataManager { + static let shared = LocationDataManager() + private init(){} + + var locationData: LocationData? +} diff --git a/FoodMaps/Model/Restaurant.swift b/FoodMaps/Model/Restaurant.swift new file mode 100644 index 0000000..2d2cf52 --- /dev/null +++ b/FoodMaps/Model/Restaurant.swift @@ -0,0 +1,24 @@ +// +// Restaurant.swift +// FoodMaps +// +// Created by Hemg on 10/11/23. +// + +struct RestaurantItem { + var restaurant: Restaurant + var poiItem: MTMapPOIItem +} + +struct Restaurant { + var title: String + var description: String + var category: RestaurantCategory +} + +enum RestaurantCategory: String, CaseIterable { + case korean = "한식" + case japanese = "일식" + case chinese = "중식" + case western = "양식" +} diff --git a/FoodMaps/Namespace/CategoryNamespace.swift b/FoodMaps/Namespace/CategoryNamespace.swift new file mode 100644 index 0000000..ceeaf7c --- /dev/null +++ b/FoodMaps/Namespace/CategoryNamespace.swift @@ -0,0 +1,13 @@ +// +// CategoryNamespace.swift +// FoodMaps +// +// Created by Hemg on 10/19/23. +// + +enum CategoryNamespace { + static let foodStore = "FD6" + static let convenienceStore = "CS2" + static let cafe = "CE7" + static let parking = "PK6" +} diff --git a/FoodMaps/NetWork/APIKey.swift b/FoodMaps/NetWork/APIKey.swift new file mode 100644 index 0000000..d0b70eb --- /dev/null +++ b/FoodMaps/NetWork/APIKey.swift @@ -0,0 +1,28 @@ +// +// APIKey.swift +// FoodMaps +// +// Created by Hemg on 10/13/23. +// + +enum APIKey { + static var location: String = { + return APIKeyFromPlist(key: "KAKAOAPIKey") + }() +} + +extension APIKey { + private static func APIKeyFromPlist(key: String) -> String { + var apiKey = "" + + if let path = Bundle.main.path(forResource: "Keys", ofType: "plist") { + let networkKeys = NSDictionary(contentsOfFile: path) + + if let networkKeys = networkKeys { + apiKey = (networkKeys[key] as? String) ?? "" + } + } + + return apiKey + } +} diff --git a/FoodMaps/NetWork/LocationAPI.swift b/FoodMaps/NetWork/LocationAPI.swift new file mode 100644 index 0000000..018c65d --- /dev/null +++ b/FoodMaps/NetWork/LocationAPI.swift @@ -0,0 +1,36 @@ +// +// LocationAPI.swift +// FoodMaps +// +// Created by Hemg on 10/13/23. +// + +final class LocationAPI { + private let scheme = "https" + private let host = "dapi.kakao.com" + private let path = "/v2/local/search/category.json" + + func getLocation(by mapPoint: MTMapPoint, categoryValue: String) -> URLComponents { + var components = URLComponents() + components.scheme = scheme + components.host = host + components.path = path + + components.queryItems = [ + URLQueryItem(name: "category_group_code", value: categoryValue), + URLQueryItem(name: "x", value: "\(mapPoint.mapPointGeo().longitude)"), + URLQueryItem(name: "y", value: "\(mapPoint.mapPointGeo().latitude)"), + URLQueryItem(name: "radius", value: "20000"), + URLQueryItem(name: "sort", value: "distance") + ] + + return components + } + + func request(url: URL) -> URLRequest { + var request = URLRequest(url: url) + request.httpMethod = "GET" + request.setValue(APIKey.location, forHTTPHeaderField: "Authorization") + return request + } +} diff --git a/FoodMaps/NetWork/LocationNetWork.swift b/FoodMaps/NetWork/LocationNetWork.swift new file mode 100644 index 0000000..bbd1d39 --- /dev/null +++ b/FoodMaps/NetWork/LocationNetWork.swift @@ -0,0 +1,45 @@ +// +// LocationNetWork.swift +// FoodMaps +// +// Created by Hemg on 10/13/23. +// + +final class LocationNetWork { + private let session: URLSession + let api = LocationAPI() + + init(session: URLSession = .shared) { + self.session = session + } + + func getLocation(by mapPoint: MTMapPoint, categoryValue: String, completion: @escaping (Result) -> Void) { + guard let url = api.getLocation(by: mapPoint, categoryValue: categoryValue).url else { + completion(.failure(URLError(.badURL))) + return + } + + let request = api.request(url: url) + + session.dataTask(with: request) { data, _, error in + if error != nil { + completion(.failure(URLError(.cannotLoadFromNetwork))) + } + + if let data = data { + + do { + let locationData = try JSONDecoder().decode(LocationData.self, from: data) + completion(.success(locationData)) + } catch { + completion(.failure(URLError(.cannotParseResponse))) + } + } + }.resume() + } +} + + +//https://dapi.kakao.com/v2/local/search/category.json?category_group_code=CS2&x=124.84848842774163&y=33.47496890088522&radius=20000&sort=distance + +//https://dapi.kakao.com/v2/local/search/category.json?category_group_code=FD6&x=127.055107449003&y=37.5876388514287&radius=20000&sort=distance diff --git a/FoodMaps/ViewController.swift b/FoodMaps/ViewController.swift deleted file mode 100644 index 5bf9113..0000000 --- a/FoodMaps/ViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ViewController.swift -// FoodMaps -// -// Created by 1 on 2023/10/09. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - - -} - diff --git a/README.md b/README.md new file mode 100644 index 0000000..366efef --- /dev/null +++ b/README.md @@ -0,0 +1,164 @@ +# README + +## 📖 목차 +1. [소개](#-소개) +2. [팀원](#-팀원) +3. [타임라인](#-타임라인) +4. [시각화된 프로젝트 구조](#-시각화된-프로젝트-구조) +5. [실행 화면](#-실행-화면) +6. [트러블 슈팅](#-트러블-슈팅) +7. [참고 링크](#-참고-링크) +8. [팀 회고](#-팀-회고) + +
+ +## 🍀 소개 +- 내 주변 음식점을 검색하며, 커스텀 하여 저장 진행 +
+ +## 👨‍💻 팀원 +| hamg | +| :--------: | +| | +|[Github Profile](https://github.com/Hoon94) | + + +
+ +## ⏰ 타임라인 +|날짜|내용| +|:--:|--| +|2023.10.09| 카카오프레임워크 추가 | +|2023.10.10| 지도 마커 커스텀 CRUD 진행| +|2023.10.11| 마커 커스텀 인덱스 이슈 해결, SearchBar생성| +|2023.10.13| 음식점API 생성 및 설정 | +|2023.10.14| 음식점API 지도에 생성 진행| +|2023.10.15| 지도 마커 커스텀 생성시 카테고리에 따라
커스텀이미지 생성| +|2023.10.16| 지도 이동시 중심축 이동값에 따른 API 통신 진행| +|2023.10.17| 음식점API 지도VC -> 리스트VC 구현| +|2023.10.18| READMA작성| + +
+ +## 💻 실행 화면 + +| |기본 화면| 이동후 음식점 불러오기| +|:--:|:--:|:--:| +|작동 화면| || + +| 커스텀 마커 생성| +|:--:| +| | + +
+ +## 🧨 트러블 슈팅 + +1️⃣ **인덱스관리** +🔒 **문제점** +- Restaurant값, MTMapPOIItem값 따로 저장을 하다보니 인덱스 이슈로 수정 및 삭제 처리 안되었습니다. + +```swift +struct Restaurant { + var title: String + var description: String +} + private func setUpItemText() { + guard let titleText = titleTextField.text, + let descriptionText = descriptionTextView.text else { return } + let newPoint = MTMapPOIItem() + newPoint.itemName = title + newPoint.mapPoint = mapPoint + newPoint.markerType = .redPin + + delegate?.didAddRestaurants(title: titleText, description: descriptionText) +``` +- 지도에는 추가가 되지만 인덱스가 달라 수정 및 삭제에 있어 원하는값이 안되었습니다. +
+🔑 **해결방법** + +```swift +struct Restaurant { + var title: String + var description: String +} +let newPoint = MTMapPOIItem() + +2개의 값을 하나로 묶어서 관리 진행 + +struct RestaurantItem { + var restaurant: Restaurant + var poiItem: MTMapPOIItem +} + +func didAddRestaurants(title: String, description: String, category: RestaurantCategory) { + let newRestaurants = Restaurant(title: title, description: description, category: category) + let newPoint = MTMapPOIItem() + newPoint.itemName = title + newPoint.userObject = description as NSObject + newPoint.mapPoint = mapPointValue + let restaurantItem = RestaurantItem(restaurant: newRestaurants, poiItem: newPoint) + restaurantItems.append(restaurantItem) +``` + +- `RestaurantItem` 라는 객체를 통해서 한번에 인덱스 관리를 진행하여 막을수 있었습니다. +
+ +2️⃣ **CLLocation -> MAPVIEW** +🔒 **문제점** +```swift +mapView: MTMapView!, finishedMapMoveAnimation +``` +```swift + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + if let location = locations.last { + let latitude = location.coordinate.latitude + ...... +``` +```swift + private var locationManager = CLLocationManager() + if let location = locationManager.location?.coordinate { + components.queryItems = [ + URLQueryItem(name: "x", value: "\(location.longitude)"), + URLQueryItem(name: "y", value: "\(location.latitude)"), +``` + +- 지도 이동 이후에 중심점이 변경된 지점에서 다시 서버 통신을하게 될때 나의 위치가 처음 시작위치에서 변경되지 않아 통신의 문제가 있었습니다. +- `mapView` 메서드 에서 좌표는 변하지만 변한 좌표에서 통신이 진행되지 않았으며 나의 좌표(mapView)는 변하지만 나의 좌표(CLLocation)은 변하지않은점 + +
+🔑 **해결방법** + +- CLLocation 의 나의 위치를 MapView좌표에서로 변경하여 서버와의 통신을 하기 위해 변경하여 진행 + +```swift + func getLocation(by mapPoint: MTMapPoint, categoryValue: String) -> URLComponents { + ...... + + components.queryItems = [ + URLQueryItem(name: "x", value: "\(mapPoint.mapPointGeo().longitude)"), + URLQueryItem(name: "y", value: "\(mapPoint.mapPointGeo().latitude)"), + ] +``` + +- API통신에 있어 CLLocation -> mapPoint로 변경 +- 그리고 변경된 mapPoint를 인스턴스 값에 할당을 진행하여 통신을 할 수있게 진행했습니다. +```swift +private var mapPointValue = MTMapPoint() +func mapView(_ mapView: MTMapView!, finishedMapMoveAnimation mapCenterPoint: MTMapPoint!) { + mapPointValue = mapCenterPoint + } +``` + + +
+ +## 📚 참고 링크 + +[카카오 지도 가이드](https://apis.map.kakao.com/ios/documentation/#MTMapView_updateCurrentLocationMarker)
+[지도관련 메서드](https://apis.map.kakao.com/ios/guide/)
+[카카오 지도 사용 블로그](https://iosminjae.tistory.com/14)
+[지도 추가후 빌드 이슈 블로그](https://byeon.is/swift-m1-daum-map-sdk-framework-error/)
+[카카오 REST API](https://developers.kakao.com/docs/latest/ko/local/dev-guide) + +