카카오맵 줌 레벨 고정

[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.

지도가 로딩이 될때 처음 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개의 좋아요