2009-08-10 19 views
10

Ich habe ein Problem mit einem UITextField-Text, der selbst bei einer Standardschriftgröße verwischt/geglättet ist. Der Text wird klar erscheinen, wenn die Kontrolle der Ersthelfer ist, aber wieder verwischt, wenn es den Fokus verliert:UITextField verschwommener Text

alt text http://www.mikeweller.com/images/blog/UITextFieldBlur.png

Weiß jemand, wie man das Problem lösen?

+0

Ich habe dies als Wiki geöffnet, zögern Sie nicht, die Frage/Antwort zu ändern. –

Antwort

12

OK Ich beantworte meine eigene Frage hier.

Ich habe eine Reihe von Verweisen auf diesen Fehler durch Google gefunden, aber jeder hat daran gearbeitet, indem er mit Schriftgrößen gespielt hat. Nach langem Suchen fand ich this thread, das besagt, dass Anti-Aliasing angewendet wird, wenn der Rahmen einer Ansicht gebrochene Pixelwerte enthält, z. wenn Sie seine Größe als Bruchteil der Superansicht berechnen.

Sicher genug, die CGRect-Werte auf (int) für den Rahmen der Ansicht zu wirken, funktionierte perfekt.

auch die Funktion CGRectIntegral
 
textFieldWidth = 300; 
textFieldHeight = 31; 
offsetX = 0; 
offsetY = (superview.bounds.size.height - textFieldHeight)/2; 

textField.frame = CGRectMake((int) offsetX, 
          (int) offsetY, 
          (int) textFieldWidth, 
          (int) textFieldHeight); 

Es ist, dass Sie ein konvertieren können: So als Beispiel, wenn Sie Ihr Textfeld wollen vertikal im Super zentriert werden, sollten Sie ein (int) gegossen wie folgt verwenden CGRect zu integralen Werten.

+7

Ich schlage vor, dass Sie * nicht * auf int rotieren, um einen Fließkommawert zu runden. Dafür gibt es eine Funktion. Es ist 'rund'. Das Umsetzen in int wird implizit auf float zurückgeworfen, da 'CGRectMake' Float-Parameter verwendet. Diese Doppelbesetzung verschleiert ihre Absicht und könnte möglicherweise schlechter abschneiden. Andererseits ist CGRectIntegral noch besser. –

+0

Außerdem können Sie anstelle von "round" cielf oder floorf (??) verwenden, um auf den nächsten Integralwert auf- bzw. abzurunden. –

26

Verwenden Sie CGRectIntegral, um sicherzustellen, dass die Rahmen der Textfelder auf ganzzahligen Koordinaten basieren. Sie erhalten unscharfes Antialiasing, wenn die Dinge auf gebrochenen Koordinaten liegen.

+0

sauberste Lösung.Für meinen Zweck habe ich eine NSView-Erweiterung hinzugefügt mit '- (void) convertFrameMeasurementsToInteger { \t self.frame = CGRectIntegral (self.frame); } ' .. aber noch besser wäre, eine Flagge wie' useIntegerBounds' zu haben und überschreiben '-setFrame' – codrut

0

Ich würde gerne dazu beitragen, wie ich gerade die Antwort nach ziemlich viel Frustration selbst entdeckt habe.

Das UITextField in InterfaceBuilder hat eine erzwungene Frame-Höhe von 31 Pixeln. Dies kann nicht mit der Maus gezogen werden, um die Größe zu ändern, noch kann es in den Rahmeneigenschaften in IB festgelegt werden. Sie müssen zu ViewDidLoad gehen und die Rahmenhöhe auf 32 Pixel einstellen, und das sollte das Problem lösen.

Hoffentlich werden zukünftige Versionen von IB dies korrigieren.

1

Zusätzlich zur Verwendung nicht-fraktionaler Positionierung sollte eine nicht zentrierte vertikale Ausrichtung für das UITextField verwendet werden. Sieht aus, als würde die zentrierte vertikale Ausrichtung in Kombination mit einer ungeraden Schriftgröße auch zu unscharfem Text führen.

0

Ich habe versucht, mit CGRectIntegral und Zeug. In meinem Fall hat das Ändern der minimalen Schriftgröße und Schriftgröße in IB es getan.

0

Ich stieß auf dieses Problem vor. Die folgende Lösung funktioniert perfekt für jede Text- oder Rahmengröße, da sie die Rundungsfunktion verwendet, um die Bruchteilpixelwerte loszuwerden. Fügen Sie den folgenden Code nach Ihrer Instanziierung des fraglichen uitextfield ein.

CGRect temp = textField.frame; 
temp.origin.x = round(temp.origin.x); 
temp.origin.y = round(temp.origin.y); 
textField.frame = temp; 
0

Einfach Einstellung der UITextField Rahmenhöhe auf einen geraden Wert es für mich fixiert.

+0

Das behebt das Problem nicht wirklich, es funktioniert nur um das zugrunde liegende Problem, so dass Sie zufällig erhalten eine Größe, die keine Unschärfe verursacht. Wenn Sie den Rahmen auf ganzzahlige Werte setzen, wird das Problem ordnungsgemäß behoben. –

+0

Gut für mich hat es getan. Ich benutze SystemFontOfSize: 18 – samvermette

Verwandte Themen