2017-11-14 4 views
0

Angenommen, ich habe eine Uhr App, und ich möchte die Stunden mit Zeichen, die in einem beliebigen Zeichensatz/Schriftart sein könnte. Ich möchte den Charakter in einem Rahmen einrahmen und so viel wie möglich ausfüllen. Wie kann ich das machen? Wenn ich eine UILabel10 verwende, wird Platz um die Glyphe eingefügt. Hier sind Beispiele, die zwei Etiketten zeigen, die beide die gleiche Schriftart, aber unterschiedliche Zeichen haben. Die hebräischen Zahlen erscheinen alle kürzer als die arabischen Ziffern. Gibt es eine Möglichkeit, die Größe der Glyphen zu bestimmen oder die Glyphen irgendwie in den Rahmen zu schieben?So verwalten Sie Text Glyph Grenze

enter image description hereenter image description here

Wie Sie sehen können, ist die hebräische Zahl kürzer, obwohl es zu einem höher UILabel hinzugefügt werden wird.

Edit: Seit der Veröffentlichung machte ich einen ersten Durchlauf der Verwendung von Kerntext, um zu sehen, ob das mein Problem lösen könnte. Es scheint, dass es nicht geht. Sehen Sie sich diese Abbildungen an und vergleichen Sie eine hebräische Glyphe mit einer arabischen Ziffernglyphe. Sie sind gelb, die Label-Grenzen. Das Grün ist das Glyphenrechteck, das vom Haupttext gemeldet wird. Ich hatte gehofft, ein Rechteck bündig mit der Glyphe zu bekommen, aber es sieht so aus, als ob die hebräischen Glyphen Platz über und neben dem enthalten, was ich als Glyphe erwartet habe. Gibt es noch etwas, das ich überprüfen sollte? Hebrew numeralArabic numeral

+0

Werfen Sie einen Blick auf 'CTFont' - speziell die ** Erste Glyptendaten ** Abschnitt: https://developer.apple.com/documentation/coretext/ctfont- q6r – DonMag

+0

Ich habe mir das angeschaut, aber das liefert Daten für die Schriftart, keine speziellen Glyphen. –

+0

Ich nehme es zurück. Es sieht so aus, als wären für die Anordnung von Glyphen Grenzdaten verfügbar. Ich schaue mir das an ... –

Antwort

1

Ich weiß nicht, ob Sie Obj-C oder Swift, aber Sie können diese in eine Swift Spielplatz Seite einfügen das Ergebnis zu sehen:

Minor Edits

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 

Viele Fehlerüberprüfungen/-behandlungen sind erforderlich, aber dies kann Ihnen einen guten Start beim Suchen und Verwenden der Grenzen der tatsächlichen Zeichenglyphen (anstelle der Etikettenrahmen) geben.

Ergebnis:

enter image description hereenter image description here

+0

Also im Wesentlichen, anstatt nach der Begrenzungsbox zu fragen, fragen Sie nach dem Weg der Glyphe und bekommen eine Grenze dafür. 'CTFontGetBoundingRectsForGlyphs' hat nichts mit dem Rahmen oder Rahmen des Labels zu tun. –

+0

Im Wesentlichen ja. Es ist ein wenig kompliziert, aber ... Wenn Sie diesen Code zum Beispiel ausführen und die Grenzen des Pfades betrachten, sehen Sie '(6.875, -1.953125, 62.4247159090909, 89.921875)' - was auf der Oberfläche etwas seltsam ist. Negatives Y? Ich weiß nicht genug über Font-/Glyph-Eigenschaften, um das zu erklären ... aber hoffentlich gibt dir das genug, um an dein Ziel zu kommen. – DonMag

+0

Ja, es sieht so aus. Ich werde Ihren Code im Detail überprüfen, wenn ich etwas Zeit habe. Aber es scheint genau das zu bekommen, was ich brauche. Vielen Dank. Ich werde es wahrscheinlich als Antwort in ein paar Tagen akzeptieren. Ich versuche nicht nur, eine Lösung zu finden, sondern auch den Rahmen zu verstehen. Es ist möglich, dass die Glyphenboxen Platz für andere Marken enthalten, die manchmal für Hebräisch enthalten sein können, aber es scheint, dass ich in der Lage sein sollte, nach den Grenzen dieser Bereiche zu fragen. P.S. Ich benutze derzeit Objective-C, aber ich code beide, also ist das in Ordnung. –