2009-03-19 7 views
8

Beim Zeichnen von Zeichenfolgen mit drawAtPoint :, drawInRect: und sogar das Festlegen der Texteigenschaft von UILabels - der Text kann manchmal leicht verschwommen erscheinen.drawAtPoint: und drawInRect: verschwommener Text

Ich neige dazu, Helvetica an den meisten Orten zu verwenden, und ich stelle fest, dass bestimmte Schriftgrößen ein gewisses Maß an Unschärfe verursachen, sowohl im Simulator als auch auf dem Gerät.

Zum Beispiel:

UIFont *labelFont = [UIFont fontWithName:@"Helvetica-Bold" size:12]; 

bewirkt, dass das resultierende Etikett leicht verschwommen Text haben.

UIFont *labelFont = [UIFont fontWithName:@"Helvetica-Bold" size:13]; 

Ergebnisse in gestochen scharfen Text.

Meine Frage ist, warum tritt das auf? Und ist es nur eine Frage der Auswahl einer optimalen Schriftgröße für eine Schrift? Wenn ja, wie lauten die optimalen Schriftgrößen?

UPDATE: Es scheint, dass es nicht die Schriftgröße ist, die die Unschärfe verursacht. Es kann sein, dass das Zentrum des Rect ein Bruchpunkt ist. Hier ist ein Kommentar, den ich in den Apple Dev Foren gefunden habe:

Überprüfen Sie die Position. Es ist wahrscheinlich auf einem Bruchteilpixel. Ändere das Zentrum auf Integer-Wert.

Ich rundete die Werte aller meiner Punkte ab, aber es gibt immer noch Stellen, wo Text verschwommen bleibt. Ist jemand schon einmal auf dieses Problem gestoßen?

+0

Siehe meine Antwort hier: http://stackoverflow.com/a/16822238/308315 – iwasrobbed

Antwort

9

Ich habe das gelöst.

Stellen Sie sicher, dass der Punkt oder das Rechteck, in dem Sie zeichnen, nicht auf einem Bruchteilpixel auftritt.

I.e. NSLog(@"%@", NSStringFromCGRect(theRect)), um zu bestimmen, welcher Punkt auf einem Bruchpixel gezeichnet wird. Rufen Sie dann round() an diesem Punkt.

+0

der Schlüssel zum Problem ist richtig, obwohl das Runden nicht die beste Technik ist. Bei vielen Runden kann der Rahmen verschoben oder in der Größe verändert werden. Der beste Ansatz wäre, den ursprünglichen Rahmen als Eigenschaft zu speichern und dann zurückzusetzen. Das garantiert keine Verschiebungen oder Größenänderungen –

2

Verzeihen Sie meine Ignoranz, wenn das falsch ist, weiß ich nichts über iPhone oder Cocoa.

Wenn Sie möchten, dass der Text in der Mitte zentriert ist, müssen Sie möglicherweise auch sicherstellen, dass die Breite und/oder Höhe des Rechtecks ​​eine gerade Zahl ist.

+0

Danke. Ich rundete alle Punkte und die Breite und Höhe. Rundete auch die Punkte für die Center-Eigenschaft. Immer noch keine Würfel. –

3

Sie möchten vielleicht NSIntegralRect() sehen, es tut was Sie wollen.

+1

NSIntegralRect() ist nur Mac, nicht iOS. – azdev

+1

Sie haben natürlich Recht [CGRectIntegral()] (https://developer.apple.com/library/IOs/documentation/GraphicsImaging/Reference/CGGeometry/Reference/reference.html#//apple_ref/c/func/ CGRectIntegral) statt. – EightyEight

0

Aus meinen Experimenten werden einige Schriftarten bei bestimmten Größen nicht eindeutig dargestellt. z.B. Helvetica-Bold macht nicht "." gut bei 16.0f, aber sie sind bei 18.0f klar. (Wenn Sie genau hinsehen, ist das obere Pixel des "." Verschwommen.)

Nachdem ich das bemerkt habe, war ich jedes Mal verärgert, wenn ich dieses UIView sehe, da es dynamisch gerendert wird.

2

Ich hatte dieses Problem auch, aber meine Lösung ist anders und kann jemandem helfen. Mein Problem war Text Unschärfe nach dem Ändern der Größe eines UIView Objekts bis TouchesBegan und CGAffineTransformMakeScale, dann zurück zu CGAffineTransformIdentity in TouchesEnded.

Ich probierte sowohl die variierende Textgröße als auch die Rundung der X- und Y-Mittelpunkte aus, aber keiner von beiden hat funktioniert. Die Lösung für mein Problem war, gleichmäßige Größen für die Breite und Höhe meiner UIView zu verwenden !!

this helps ....

+0

Das hat mir geholfen, danke! – Mike