2017-11-14 10 views
0

私はクロックアプリケーションを持っていて、時間を任意の文字セット/フォントの文字で表示したいとします。私はフレーム内のキャラクターをフレーム化し、できるだけそれを塗りたいと思います。どうやってやるの? UILabelを使用すると、グリフの周囲にスペースが挿入されます。同じフォントでも文字は異なる2つのラベルを示す例です。ヘブライ語の数字はすべてアラビア数字よりも短く見えます。グリフのサイズを決定する方法はありますか、何とかグリフをフレームに合わせて押し出す方法はありますか?テキストグリフの境界を管理する方法

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

はい、そうです。私はしばらく時間がかかると、あなたのコードを詳しく見直します。しかし、私は必要なものを正確に得ることができるようです。ありがとう。私はおそらくカップルの日の答えとしてそれを受け入れるだろう。しかし、ソリューションを得ることに加えて、私はフレームワークを理解しようとしています。グリフボックスには、ヘブライ語に含まれることがある他の記号のためのスペースが含まれている可能性もありますが、それらの領域の境界を尋ねることができるようです。 P.S.私は現在Objective-Cを使用していますが、両方でコーディングするので、これは問題ありません。 –

関連する問題