Position von Buchstaben bestimmen

  • Amin Negm-Awad schrieb:

    Text hat Attribute. Ist natürlich nur eine Begrifflichkeit, aber eine, die du kennen solltest.

    String sind reine Zeichenketten.
    Texte sind ein bisschen mehr. (Und noch deutlich mehr, als der Editor hier kann.)


    Hallo,

    was so generell der Unterschied ist, ist schon klar. Daran hatte ich hier nur nicht gedacht. Ich meine "nur" einen String.
    Entschuldigung für dieses Missverständis.

    Viele Grüße

    Sascha
  • Amin Negm-Awad schrieb:

    Du kannst dich mal mit
    -boundingRectForGlyphRange:inTextContainer: (NSLayoutManager)
    vertraut machen.

    Vielen Dank, werde ich mir mal anschauen.

    Amin Negm-Awad schrieb:


    Aber ich sehe schon weitere Fragen hier auflaufen.


    Das glaube ich nicht. ;)
    Ich hatte mir ursprünglich das zu einfach vorgestellt. Dazu kam meine Unwissenheit bezüglich Fonts und cocoa. Ich dachte, dass vielleicht eine ähnliche Funktion existiert wie diese Windows-Funktion oder dass es zumindest ähnlich einfach ist.
    Da dies nicht so ist, werde ich genauer damit auseinander setzen müssen, wie Fonts aufgebaut sind.

    Vielen Dank an alle, die mir geholfen haben.

    Viele Grüße

    Sascha
  • Lucas de Vil schrieb:

    Dann redet ihr nicht aneinander vorbei und Fonts sind so ziemlich das Einzige, das du nicht brauchst.


    Da ich bis zu diesem Thema nichts von kerning, tracking, Ligaturen, Glyphen oder ähnlichem wusste, da ich es nie gebraucht habe und dachte, dass Fonts wesentlich simpler aufgebaut sind, sollte man es sich doch mal anschauen, damit man weiß, was man macht, oder sehe ich das falsch?

    Viele Grüße

    Sascha
  • sashs schrieb:

    Lucas de Vil schrieb:

    Dann redet ihr nicht aneinander vorbei und Fonts sind so ziemlich das Einzige, das du nicht brauchst.


    Da ich bis zu diesem Thema nichts von kerning, tracking, Ligaturen, Glyphen oder ähnlichem wusste, da ich es nie gebraucht habe und dachte, dass Fonts wesentlich simpler aufgebaut sind, sollte man es sich doch mal anschauen, damit man weiß, was man macht, oder sehe ich das falsch?

    Viele Grüße

    Sascha


    im prinzip musst du nur wissen mit welchem framework und mit welchen einstellungen dein text gezeichnet wurde. verwenden die natürlich ein eigenes framework oder zeichnen gar die buchstaben nach eigenem gutdünken oder verwenden zb ein auto-kerning (weil einige fonts kein gutes kerning enthalten, oder die programmierer meinen das besser berechnen zu können) dann ist es wirklich unmöglich.
  • gritsch schrieb:


    im prinzip musst du nur wissen mit welchem framework und mit welchen einstellungen dein text gezeichnet wurde. verwenden die natürlich ein eigenes framework oder zeichnen gar die buchstaben nach eigenem gutdünken oder verwenden zb ein auto-kerning (weil einige fonts kein gutes kerning enthalten, oder die programmierer meinen das besser berechnen zu können) dann ist es wirklich unmöglich.


    Das habe ich verstanden. :)
    Ich kannte die ganzen Begriffe vorher gar nicht. ;)

    Ich denke, ich habe hier genug Input erhalten.
    Vielen Dank an alle für ihre Tipps und für ihre Geduld.

    Viele Grüße

    Sascha
  • @sashs

    Ich hatte ja bereits gesagt, dass das Ganze von einfach nach komplex skaliert. Verstehe die Basics, aber auch nur das. Dann siehst du, dass sich Cocoa (oder $whatever, etwa CT) darum kümmert. Das Problem ist jetzt, dass du eine bestimmte Information haben willst, wobei ich immer noch nicht weiß, warum. In diesem Falle bietet es sich an, die API des Textsystems zu nutzen, da das Textsystem ja weiß, was es mit Kerning, Laufweiten, Größen usw. usf. macht.

    Beispiel:

    -boundingRectForGlyphRange:inTextContainer: (NSLayoutManager) ist eine Methode des Layout-Managers, also brauchst du den und musst dich mit dem befassen. Dann erwartet der einen Text-Container, also brauchst du den auch und musst dich auch damit befassen. Außerdem gibt es da einen Glyph-Range. Dazu musst du wissen, was ein Glyph ist. Außerdem musst du wissen, wie du für einen Textbereich einen Glyphenbereich erhältst. Dazu gibt es auch eine Methode.

    Über alles andere musst du dann nichts wissen, weil sich das Textsystem darum kümmert. Aber wie du schon siehst, wird ein Text-Container benötigt. Das ist ein Bereich, in dem Zeichen platziert werden können. Also ist die Methode schon nicht mehr "unabhängig", sondern kann ihre Arbeit immer nur für einen bestimmten Zeichenbereich tun. Ein Text-Container kennt wiederum den View, in den er zeichnet. Also wird auch da eine Abhängigkeit bestehen.

    Mit anderen Worten: Allgemeingültig wird das so nicht. Es hängt eben von vielen Dingen ab. Das ist nicht schlimm, weil man das nicht allgemeingültig braucht. Nur du. Also das letzte Mal: Wieso?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    @sashs

    Ich hatte ja bereits gesagt, dass das Ganze von einfach nach komplex skaliert. Verstehe die Basics, aber auch nur das. Dann siehst du, dass sich Cocoa (oder $whatever, etwa CT) darum kümmert. Das Problem ist jetzt, dass du eine bestimmte Information haben willst, wobei ich immer noch nicht weiß, warum. In diesem Falle bietet es sich an, die API des Textsystems zu nutzen, da das Textsystem ja weiß, was es mit Kerning, Laufweiten, Größen usw. usf. macht.

    Beispiel:

    -boundingRectForGlyphRange:inTextContainer: (NSLayoutManager) ist eine Methode des Layout-Managers, also brauchst du den und musst dich mit dem befassen. Dann erwartet der einen Text-Container, also brauchst du den auch und musst dich auch damit befassen. Außerdem gibt es da einen Glyph-Range. Dazu musst du wissen, was ein Glyph ist. Außerdem musst du wissen, wie du für einen Textbereich einen Glyphenbereich erhältst. Dazu gibt es auch eine Methode.

    Über alles andere musst du dann nichts wissen, weil sich das Textsystem darum kümmert. Aber wie du schon siehst, wird ein Text-Container benötigt. Das ist ein Bereich, in dem Zeichen platziert werden können. Also ist die Methode schon nicht mehr "unabhängig", sondern kann ihre Arbeit immer nur für einen bestimmten Zeichenbereich tun. Ein Text-Container kennt wiederum den View, in den er zeichnet. Also wird auch da eine Abhängigkeit bestehen.

    Mit anderen Worten: Allgemeingültig wird das so nicht. Es hängt eben von vielen Dingen ab. Das ist nicht schlimm, weil man das nicht allgemeingültig braucht. Nur du. Also das letzte Mal: Wieso?


    aber das textsystem muss auch wissen welche einstellungen es verwenden soll und welche features der fonts es verwenden und welche nicht verwenden soll. hat man diese information nicht so kann man sie auch dem textsystem nicht geben und dieses kann nur mit den standardwerten arbeiten. passen die zufälltig dann hat man eben glück gehabt. verwendet der andere entwickler aber ein anderes system (ATSUI, CT, freetype oder sonstwas) dann wird das was der NSLayoutmanager und co produzieren meist doch wieder ein bisschen anders sein.
  • Ich irgendwann hier mal erwähnt, dass das ganze nicht mit Cocoa gebaut wird, sondern mit Firemonkey (Delphi). Ich habe die Aufgabe eine Funktion zu bauen, die ähnlich funktioniert, wie die Windows-Funktion die ich gezeigt habe, da Firemonkey sowas nicht bietet und unter Windows diese Windows-Funktion genutzt werden muss. Deshalb muss das ganze unabhängig von GUI-Componenten oder ähnlichem sein.

    Ich habe zwar schon was mit cocoa gemacht, aber bisher nicht soviel und da ich mich bisher nichts mit Fonts beschäftigen musste, ist diese Frage entstanden.

    -boundingRectForGlyphRange:inTextContainer: (NSLayoutManager) ist eine Methode des Layout-Managers, also brauchst du den und musst dich mit dem befassen. Dann erwartet der einen Text-Container, also brauchst du den auch und musst dich auch damit befassen. Außerdem gibt es da einen Glyph-Range. Dazu musst du wissen, was ein Glyph ist. Außerdem musst du wissen, wie du für einen Textbereich einen Glyphenbereich erhältst. Dazu gibt es auch eine Methode.

    Über alles andere musst du dann nichts wissen, weil sich das Textsystem darum kümmert. Aber wie du schon siehst, wird ein Text-Container benötigt. Das ist ein Bereich, in dem Zeichen platziert werden können. Also ist die Methode schon nicht mehr "unabhängig", sondern kann ihre Arbeit immer nur für einen bestimmten Zeichenbereich tun. Ein Text-Container kennt wiederum den View, in den er zeichnet. Also wird auch da eine Abhängigkeit bestehen.


    Dass ich bei einem bei einem Funktionsaufruf wissen muss, was ich da übergebe und womit das zusammenhängt ist schon klar. ;)

    Viele Grüße

    Sascha
  • gritsch schrieb:

    du brauchst also nur was ähnliches? na dann schau dir einfach CT an (CTLine und CTRun).
    das gleiche ergebnis wie unter windows bekommst du aber nie hin - außer es wird auf beiden systemen zb freetype benutzt, aber selbst dann können verschiedene ergebnisse rauskommen.


    Um Missverständisse auszuschließen, die Windows-Funktion liefert in Abhängikeiten von den Übergabeparametern die Position und die Breite der Buchstaben und genau das brauche ich auch für Mac OS. Es ist nicht wichtig, dass beide Funktionen die gleichen Maße oder sowas für den gleichen Text und Schriftart liefern, sondern für das Betriebssystem die richtigen Maße liefern, auf dem der Text gezeichnet wird.

    Viele Grüße

    Sascha