[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.
기본 사항
로컬 (REST) API 에 대한 설명은 로컬 API 가이드 를 참고하세요.
지도 SDK에 대한 설명은 Kakao Map API 가이드 를 참고하세요.
지도/로컬 API 사용 시 활용할 수 있는 카카오맵 아이콘 이미지는
Kakao Map 리소스 페이지에서 다운받울 수 있습니다.
로컬 API의 주소검색 기능과 당사가 별도로 제공하는 우편번호 서비스는 서로 다른 서비스 입니다.
우편번호 서비스 사용과 관련해서는 이곳에서 대응해드리기 어려우며
우편번호 서비스 가이드 내 “문의하기” 를 이용해주세요.
문의글 작성은
꼭 현재 사용 중인 앱키를 등록한 계정으로 해주셔야 정확한 안내가 가능합니다.
또한 서비스 소유자/회사와 계정 소유자가 동일하거나 소속관계가 확인되어야 정확한 안내/대응이 가능합니다.
문의하시기 전에 이곳 DevTalk의 게시글 검색을 통해
유사 문의에 대한 답변을 먼저 찾아보시면 더 빠르게 문제 해결이 가능할 수 있습니…
지도가 로딩이 될때 처음 defaultLevel인 12로 로딩되고
마커가 찍힌 지점을 17로 재조정되어 지도가 다시 로딩이 됩니다.
혹시 마커가 찍힌 지점을 12로 줌 하고 싶다면 코드를 어떤식으로 수정해야 하나요
func addViews() {
guard let controller = controller else { return }
// coordinates 배열의 첫 번째 요소를 기본 위치로 사용
if let firstCoordinate = coordinates.first {
let defaultPosition = MapPoint(longitude: firstCoordinate.mapX, latitude: firstCoordinate.mapY)
let mapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: defaultPosition, defaultLevel: 12)
controller.addView(mapviewInfo)
if let view = controller.getView("mapview") as? KakaoMap {
createLabelLayer(view: view)
createPois(view: view)
// 마커가 표시된 후 줌 레벨을 12로 설정
}
} else {
print("Error: No coordinates available to set the default position.")
}
}
@khj291400
보여주신 코드상으로는 17레벨로 조정하는 코드는 없는데 어디에서 레벨이 바뀌는건가요?
createPois 를 불러오는 과정에서 줌레벨 기본값인 17로 재조정되는 것으로 보입니다. defaultLevel 이 아닌 줌레벨을 따로 설정해주는 함수가 있나요?
struct KakaoMapView: UIViewRepresentable {
//@State private var draw: Bool = true
@Binding var draw: Bool // 요게 문제였음
var coordinates: [Coordinate]
func makeUIView(context: Self.Context) -> KMViewContainer {
let view = KMViewContainer(frame: CGRect(x: 15, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
context.coordinator.createController(view)
for coordinate in coordinates {
print("Coordinate's mapX:\(coordinate.mapX)")
}
return view
}
func updateUIView(_ uiView: KMViewContainer, context: Self.Context) {
if draw {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if context.coordinator.controller?.isEnginePrepared == false {
context.coordinator.controller?.prepareEngine()
}
if context.coordinator.controller?.isEngineActive == false {
context.coordinator.controller?.activateEngine()
}
// Ensure POIs are added after the engine is active
context.coordinator.addViews()
}
}
else {
context.coordinator.controller?.pauseEngine()
context.coordinator.controller?.resetEngine()
}
}
func makeCoordinator() -> KakaoMapCoordinator {
return KakaoMapCoordinator(coordinates: coordinates)
}
static func dismantleUIView(_ uiView: KMViewContainer, coordinator: KakaoMapCoordinator) {
}
class KakaoMapCoordinator: NSObject, MapControllerDelegate {
var controller: KMController?
var coordinates: [Coordinate] // 대소문자 잘 구분하기..
init(coordinates: [Coordinate]) {
self.coordinates = coordinates
super.init()
}
func createController(_ view: KMViewContainer) {
controller = KMController(viewContainer: view)
controller?.delegate = self
}
func addViews() {
guard let controller = controller else { return }
// coordinates 배열의 첫 번째 요소를 기본 위치로 사용
if let firstCoordinate = coordinates.first {
let defaultPosition = MapPoint(longitude: firstCoordinate.mapX, latitude: firstCoordinate.mapY)
let mapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: defaultPosition, defaultLevel: 12)
controller.addView(mapviewInfo)
if let view = controller.getView("mapview") as? KakaoMap {
createLabelLayer(view: view)
createPois(view: view)
// 마커가 표시된 후 줌 레벨을 12로 설정
}
} else {
print("Error: No coordinates available to set the default position.")
}
}
func createLabelLayer(view: KakaoMap) {
let manager = view.getLabelManager()
let layerOption = LabelLayerOptions(layerID: "PoiLayer", competitionType: .none, competitionUnit: .symbolFirst, orderType: .rank, zOrder: 1000)
_ = manager.addLabelLayer(option: layerOption)
}
// Poi 표시 스타일 생성
// createPoiStyle 삭제
func createPois(view: KakaoMap) {
let manager = view.getLabelManager()
let layer = manager.getLabelLayer(layerID: "PoiLayer")
for (index, coordinate) in coordinates.enumerated() {
let poiOption = PoiOptions(styleID: "PerLevelStyle")
let poi = layer?.addPoi(option: poiOption, at: MapPoint(longitude: coordinate.mapX, latitude: coordinate.mapY))
print("Attempting to add POI at \(coordinate.mapX), \(coordinate.mapY)")
// 인덱스를 사용하여 동적으로 이미지 이름 생성
let imageName = "\(index + 1).png"
if let image = UIImage(named: imageName) {
let resizedImage = resizeImage(image: image, percentage: 0.09) // 마커 이미지 짱큼 ㅋㅋ
let badge = PoiBadge(badgeID: "noti", image: resizedImage, offset: CGPoint(x: 0, y: 0), zOrder: 1000)
poi?.addBadge(badge)
poi?.show()
poi?.showBadge(badgeID: "noti")
} else {
// 이미지 로드 실패 시 처리
print("Failed to load '\(imageName)'")
}
}
}
@khj291400
보여주신 코드상의 createPois 함수 내부에는 카메라 위치 혹은 레벨을 변경하는 부분이 없습니다. SDK가 명시적인 호출없이 줌레벨을 변경하는 경우는 초기 생성시 카메라 초기 위치 지정, 뷰의 리사이즈에 따른 레벨 재계산 외에는 존재하지 않습니다. 말씀하시는 defaultLevel이 어디에 있는 값을 말씀하시는 것인지 보이지 않으나 다른 부분에서 카메라 이동을 호출하고 있지 않은지 확인해 보셔야 할 것 같습니다.
1개의 좋아요