Ios poi text 일본어 & 중국어 깨짐 관련

poiOption1.addText로 일본어, 중국어 텍스트를 추가했는데 글자가 깨져서 나옵니다. 폰트 문제인가 생각해서
TextStyle에 font를 이것저것 넣어보았으나 모두 적용이 되지 않는거같네요.
무슨 이유일까요? 해결방법도 알려주시면 감사하겠습니다.

@이인호4096 사용하신 폰트가 어떤건가요?

처음에는 폰트를 지정하지 않았습니다. 별도로 지정하지 않는 경우 엔진의 기본 폰트인 Noto Sans KR Medium을 사용 이라고 API 사용 가이드에 적혀있더라고요.
근데 깨져서 Arial, Hiragino 를 넣어보았으나 이슈가 해결되지 않았습니다.

func createPoiStyle(styleID: String, currentLocation: Bool = false, placeType: PlaceType?) {
        let view = mapController?.getView("mapview") as! KakaoMap
        let manager = view.getLabelManager()
        var iconImage = UIImage(named: "map_ico_marker")
        manager.removePoiStyle(styleID)
        if let placeType = placeType {
            switch placeType {
            case .restaurant:
                iconImage = UIImage(systemName: "fork.knife.circle.fill")?.withTintColor(.systemOrange)
            case .shopping:
                iconImage = UIImage(systemName: "handbag.circle.fill")?.withTintColor(.systemPurple)
            case .touristAttraction:
                iconImage = UIImage(systemName: "flag.circle.fill")?.withTintColor(.systemRed)
            case .accommodation:
                iconImage = UIImage(systemName: "bed.double.circle.fill")?.withTintColor(.systemBlue)
            }
            
        }
        // PoiBadge는 스타일에도 추가될 수 있다. 이렇게 추가된 Badge는 해당 스타일이 적용될 때 함께 그려진다.
        let iconStyle1 = PoiIconStyle(symbol: iconImage,
                                      anchorPoint: CGPoint(x: 0, y: 0),
                                      transition: PoiTransition(entrance: .alpha, exit: .alpha)
                                      /*badges: [noti1]*/)
        
        let textColor = TextStyle(fontSize: 20, fontColor: UIColor.black, strokeThickness: 2, strokeColor: UIColor.white)
        let textStyle1 = PoiTextStyle(textLineStyles: [
            PoiTextLineStyle(textStyle: textColor)
        ])
        // 5~11, 12~21 에 표출될 스타일을 지정한다.
        let poiStyle = PoiStyle(styleID: styleID, styles: [
            PerLevelPoiStyle(iconStyle: iconStyle1, textStyle: textStyle1, level: 5)
        ])
        manager.addPoiStyle(poiStyle)
    }
    
    func createPois(layerID: String, styleID: String, poiID: String, mapPoints: [MapPoint], titles: [String], ids: [String]) {
        let view = mapController?.getView("mapview") as! KakaoMap
        let manager = view.getLabelManager()
        let layer = manager.getLabelLayer(layerID: layerID)
        layer?.visible = true
        
        for (idx, mapPoint) in mapPoints.enumerated() {
            let poiOption1 = PoiOptions(styleID: styleID, poiID: ids[idx])
            
            poiOption1.rank = 0
            poiOption1.clickable = true
            poiOption1.addText(PoiText(text: titles[idx], styleIndex: 0))
            let poi = layer?.addPoi(option: poiOption1, at: mapPoint)
            if let poi = poi {
                let _ = poi.addPoiTappedEventHandler(target: self, handler: HomeViewController.poiTappedHandler)
            }
        }
        layer?.showAllPois()
    }

코드는 이렇습니다. titles[idx]에 일어 혹은 중국어가 들어오게 됩니다. print로 PoiText.text를 찍어보았을때는 깨지지 않고 출력이 되는걸 확인하였습니다

@이인호4096 문제 확인을 위해서는 사용하신 폰트 파일이 필요합니다.

폰트 파일을 사용한게 아니라 iOS 기본 제공되는 시스템 폰트를 넣으려 시도했다는 뜻입니다.

@이인호4096 시스템 폰트를 어떻게 넣으려고 하셨을까요? 현재 SDK는 폰트파일을 바이너리로 읽을 수 있어야 사용이 가능합니다.

TextStyle(fontSize: 20, fontColor: UIColor.black, strokeThickness: 2, strokeColor: UIColor.white, font: “arial”) 이런 식으로 시도했습니다. 그러면 폰트 파일을 직접 프로젝트에 추가한 후에 추가한 폰트 이름을 font: “폰트 이름” 이렇게 사용해야하는건가요?

@이인호4096 기본 내장된 폰트 외에 다른 폰트를 사용하시려면

mapController?.addFont(fontName: <#T##String#>, fontData: <#T##Data#>)

로 폰트를 먼저 추가해 주셔야 하며, 이를 위해서는 폰트의 바이너리를 Data 타입으로 읽어와야 합니다.

이렇게 추가한 후에 추가한 이름으로 지정하시면 해당 폰트를 사용하실 수 있습니다.

기본 내장 폰트에는 영문/한글/숫자/일부 특수문자 외에는 들어있지 않습니다. 폰트에 들어있지 않은 문자를 그리려고 할 경우, 위 스크린샷처럼 보이게 됩니다.

1개의 좋아요

감사합니다. 한번 시도해 보겠습니다