[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.
https://devtalk.kakao.com/t/faq-api/125610
안녕하세요! 저는 sdk v2로 swiftUI에 카카오맵을 사용하려고 하는데요,
KakaoMapEventDelegate에서 Camera 관련
cameraWillMove, cameraDidStopped 함수는 정상적으로 작동하는데,
kakaoMapDidTapped 혹은 poiDidTapped 등 터치이벤트는 동작을 안하는 게 아니겠어요?
그래서 예제 코드에서 사용한 대로 addPoiTappedEventHandler를 활용해서 터치이벤트를 해 보려고 했는데도 작동 안 하는 것을 확인했습니다.
PoiOption.clickable = true 등 설정도 제대로 완료 했기에, 무엇이 문제인지 모르겠어서 이렇게 질문 글 남깁니다.
1개의 좋아요
추가 ) K3fMapContainerDelegate 에서의 touchesBegan 함수는 정상 작동합니다!
//여기서 touch event 처리
func poiTouched(_ poi: Poi) {
print(poi.itemID)
}
func touchesBegan(_ touches: Set<AnyHashable>) {
if let touch = touches.first as? UITouch {
let radius = touch.majorRadius
let touchedCenter = touch.location(in: touch.window)
// touch major radius기준으로 거리 재기 위한 임시 Point
let withRadius = CGPoint(x: touchedCenter.x + radius, y: touchedCenter.y)
if let point = getPosition(touchedCenter),
let withRadiusPoint = getPosition(withRadius)
{
// 거리 계산
let latdist = (point.wgsCoord.latitude - withRadiusPoint.wgsCoord.latitude)
let longdist = (point.wgsCoord.longitude - withRadiusPoint.wgsCoord.longitude)
let powdDist = latdist * latdist + longdist * longdist
let dist = sqrt(powdDist) // radius의 map상에서의 거리
if let touchedPoi = touchedPOI(point.wgsCoord, dist) {
poiTouched(touchedPoi)
}
}
}
}
private func touchedPOI(_ coord: GeoCoordinate, _ dist: Double) -> Poi? {
if let map = controller?.getView("mapview") as? KakaoMap {
let manager = map.getLabelManager()
let layer = manager.getLabelLayer(layerID: "PoiLayer")
guard let pois = layer?.getAllPois() else {return nil}
var touchedPois: [Poi : Double] = [:] // value = distance
for poi in pois {
let latdist = (coord.latitude - poi.position.wgsCoord.latitude)
let longdist = (coord.longitude - poi.position.wgsCoord.longitude)
let powdDist = latdist * latdist + longdist * longdist
let distWithPoi = sqrt(powdDist)
// touched radius 반경 안에 있는 경우
if distWithPoi < dist {
touchedPois[poi] = distWithPoi
}
}
if touchedPois.isEmpty { return nil }
else { return touchedPois.sorted(by: {$0.value < $1.value}).first!.key} // 가장 가까운 poi를 리턴합니다.
}
return nil
}
private func getPosition(_ point: CGPoint) -> MapPoint? {
let mapView: KakaoMap? = controller?.getView("mapview") as? KakaoMap
guard let map = mapView else
{return nil}
return map.getPosition(point)
}
이렇게 임시 구현해봤습니당, 억지구현인거 같긴 한데 임시방편으로 이렇게라도 touch event 만들어봤어요
@st939823 안녕하세요.
말씀하신 내용으로는 어떤 부분에 문제가 있는지 파악하기 어렵습니다. cameraWillMove 가 정상적으로 호출된다고 하신 것으로 보아 KakaoMapDelegate 는 정상적으로 등록된 것으로 보여서
func poiDidTapped(kakaoMap: KakaoMap, layerID: String, poiID: String, position: MapPoint)
말씀하신 내용만으로는 이 함수만 불리지 않을 이유는 없어 보입니다. 해당 delegate 함수 구현이 정확한지 확인해 보시거나 좀 더 자세한 구현관련 사항이 필요할 것 같습니다.
iOS SDK v2 ( 2.10.4) 사용중인데 동일한 증상이 있습니다.
poiDidTapped 는 layerID = place 에 대해서는 호출됩니다. 앱에서 추가한 poi에 대해서는 호출되지 않습니다.
@flymaxelib
모든 POI 에 대한 이벤트는 동일한 경로를 통해 전달됩니다. 다른 설정에 문제가 없는지 확인해 보시기 바랍니다.