2017-11-14 23 views
0

시계 응용 프로그램이 있고 임의의 문자 집합/글꼴 일 수있는 문자로 시간을 레이블링한다고 가정합니다. 캐릭터의 프레임을 프레임에 넣고 최대한 많이 채우고 싶습니다. 어떻게해야합니까? UILabel을 사용하는 경우 글리프 주위에 공백이 삽입됩니다. 다음은 동일한 글꼴이지만 다른 문자로 된 두 개의 레이블을 보여주는 예입니다. 히브리어 숫자는 모두 아라비아 숫자보다 짧습니다. 글리프의 크기를 결정하거나 프레임에 맞게 글리프를 푸는 방법이 있습니까? 당신이 볼 수 있듯이텍스트 글자 경계를 관리하는 방법

enter image description hereenter image description here

는 히브리어 숫자는 더 키 큰 UILabel의에 추가 비록 짧습니다.

편집 : 게시 후, 핵심 텍스트를 사용하여 내 문제를 해결할 수 있는지 먼저 확인했습니다. 그것은 그렇지 않을 것 같습니다. 히브리어 글리프와 아라비아 숫자 글리프를 비교 한 이러한 그림을 참조하십시오. 노란색 라벨 경계입니다. 녹색은 핵심 텍스트에 의해보고 된 글리프 직사각형입니다. 글리프에 직사각형이 보이기를 바랬지 만 히브리어 글리프에 위의 공백이 있고 글리프가 될 것으로 예상되는 것 옆에 공백이있는 것처럼 보입니다. 확인해야 할 다른 것이 있습니까? Hebrew numeralArabic numeral

+0

CTFont''을 살펴보세요 - 특히 ** 얻기 문양 데이터 ** 섹션 https://developer.apple.com/documentation/coretext/ctfont-를 q6r – DonMag

+0

그걸 보았습니다.하지만 그 글꼴에 대한 데이터를 얻습니다. 구체적인 글리프가 아닙니다. –

+0

나는 그것을 되 찾는다. 글리프 배열에 사용할 수있는 경계 데이터가있는 것 같습니다. 나는 그것을 볼 것이다 ... –

답변

1

당신의 Obj-C 또는 스위프트 사용하는 경우 나도 몰라,하지만 당신은 결과를 볼 수있는 스위프트 놀이터 페이지에이 붙여 넣을 수 있습니다 :

사소한 편집

import UIKit 
import CoreText 
import PlaygroundSupport 


class PathView: UIView { 

    var myPath: UIBezierPath? 

    override func draw(_ rect: CGRect) { 

     if let pth = myPath { 

      UIColor.red.setStroke() 

      // glyph path is inverted, so flip vertically 
      let flipY = CGAffineTransform(scaleX: 1, y: -1.0) 

      // glyph path may be offset on the x coord, and by the height (because it's flipped) 
      let translate = CGAffineTransform(translationX: -pth.bounds.origin.x, y: pth.bounds.size.height + pth.bounds.origin.y) 

      // apply the transforms 
      pth.apply(flipY) 
      pth.apply(translate) 

      // stroke the path 
      pth.stroke() 

      // print the modified path for debug/reference 
      print(pth) 

     } 

    } 

} 

class TestViewController : UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // blue background so we can see framing 
     view.backgroundColor = UIColor(red: 0.25, green: 0.5, blue: 01.0, alpha: 1.0) 

     // use a large font so we can see it easily 
     let font = UIFont(name: "Times", size: 160)! 

     // Hebrew character for 8 
     var unichars = [UniChar]("ח".utf16) 
     unichars = [UniChar]("י".utf16) 

     // init glyphs array 
     var glyphs = [CGGlyph](repeatElement(0, count: unichars.count)) 

     let gotGlyphs = CTFontGetGlyphsForCharacters(font, &unichars, &glyphs, unichars.count) 

     if gotGlyphs { 
      // get the cgPath for the character 
      let cgpath = CTFontCreatePathForGlyph(font, glyphs[0], nil)! 

      // convert it to a UIBezierPath 
      let path = UIBezierPath(cgPath: cgpath) 

      var r = path.bounds 

      // let's show it at 40,40 
      r = r.offsetBy(dx: 40.0, dy: 40.0) 

      let pView = PathView(frame: r) 
      pView.backgroundColor = .white 
      pView.myPath = path 

      view.addSubview(pView) 

      // print bounds and path data for debug/reference 
      print("bounds of path:", path.bounds) 
      print() 
      print(path) 
      print() 
     } 

    } 

} 

let vc = TestViewController() 
PlaygroundPage.current.liveView = vc 

많은 오류 검사/처리가 필요하지만 이는 레이블 프레임 대신 실제 문자 모양의 범위를 찾고 사용하는 데 좋은 시작점이 될 수 있습니다.

결과 :

enter image description hereenter image description here

+0

기본적으로 경계 상자를 묻는 대신 글리프의 경로를 묻는 중입니다. 'CTFontGetBoundingRectsForGlyphs'는 레이블 프레임 또는 경계와 아무 관련이 없습니다. –

+0

기본적으로 그렇습니다. 조금 복잡합니다. 예를 들어 코드를 실행하고 경로의 경계를 보면 표면에 약간 이상한'(6.875, -1.953125, 62.4247159090909, 89.921875)가 나타납니다. 네가티브 Y? 설명하기에 폰트/글리프 특성에 대해 충분히 알지 못하지만 잘하면이 것은 목적지까지 도달 할 수있는 충분한 공간을 제공합니다. – DonMag

+0

예, 보이는 것처럼 보입니다. 내가 시간을 할애하면 코드를 자세히 검토 할 것입니다. 그러나 그것은 내가 필요한 것을 정확히 얻을 수있는 것처럼 보입니다. 감사. 며칠 안에 대답으로 받아 들일 가능성이 높습니다. 하지만 솔루션을 얻는 것 외에도 프레임 워크를 이해하려고합니다. 글리프 박스에는 때때로 히브리어에 포함될 수있는 다른 표시를위한 공간이 포함되어있을 수도 있지만 그 영역의 경계를 물어볼 수 있어야합니다. 추신 현재 Objective-C를 사용하고 있지만 두 가지 모두에서 코딩하므로 괜찮습니다. –