10
votes

Uitéxtfield texte flou

J'ai un problème avec le texte d'un Uitextfield étant flou / anti-aliasé même avec une taille de police standard. Le texte apparaîtra croustillant lorsque le contrôle est le premier répondant, mais floue à nouveau lorsqu'il perd la mise au point:

 text alt
(source: Mikeweller.com )

Quelqu'un sait-il comment résoudre ce problème?


1 commentaires

J'ai ouvert cela comme un wiki, n'hésitez pas à modifier la question / la réponse.


8 Réponses :


12
votes

OK, je réponds ici ma propre question ici.

J'ai trouvé un certain nombre de références à ce bogue via Google, mais tout le monde a travaillé autour de celui-ci en jouant avec des tailles de police. Après beaucoup de chasse, j'ai trouvé Ce fil qui dit que l'anti-aliasing est appliqué lorsque la trame d'une vue contient des valeurs de pixels fractionnaires, par exemple Si vous calculez sa taille comme une fraction de la super vue. P>

Assez sûr, jetant les valeurs de CGRRECT à (int) pour la trame de la vue fonctionnant parfaitement. Ainsi, à titre d'exemple, si vous voulez que votre champ de texte soit centré verticalement dans la supervish, vous devez utiliser un (int) lancé comme suit: P>

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

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


2 commentaires

Je vous suggère NE PAS CASTER à INT pour arrondi une valeur de point flottante. Il y a une fonction pour cela. C'est rond . La coulée sur INT sera renvoyée pour flotter implicitement comme CGrectument prend des paramètres de flotteur. Cette double fonte obscope son intention et pourrait éventuellement jouer pire. Là encore, CGRRECTINTEGAL est encore meilleur.


De plus, au lieu de rond, vous pouvez utiliser CIELF ou plancher (??) pour arrondir respectivement à la valeur intégrale la plus proche.



27
votes

Utilisez CGRECRETINGAL pour s'assurer que les cadres de champs de texte sont basés sur des coordonnées entier. Vous obtiendrez une antialiasing floue lorsque les choses se trouvent sur les coordonnées fractionnaires.


1 commentaires

Sollution la plus propre. Pour mon but, j'ai ajouté une extension Nsview avec - (vide) ConvertFramemeAsectureSointEger {Self.frame = CGRectIntegral (Self.frame); } .. mais même mieux serait d'avoir un drapeau comme utilletegerbounds et écraser --SetFrame



0
votes

J'aimerais bien contribuer car je viens de découvrir la réponse à mienne après une frustration assez frustrante.

Le uitextfield in interfaceBuilder a une hauteur forcée de 31 pixels. Cela ne peut pas être cliqué sur glisser pour redimensionner et ne peut-il pas être défini dans les propriétés du cadre dans IB. Vous devez aller à ViefDiDload et régler la hauteur de trame à 32 pixels, ce qui devrait résoudre le problème.

Espérons que les futures versions de l'IB corrigeront cela.


0 commentaires

1
votes

En plus de l'utilisation de positionnement non fractionné, il faut veiller à utiliser un alignement vertical non centré sur l'UITEXTFIELD. On dirait que l'alignement vertical centré en combinaison avec une taille de police étrange entraîne également un texte flou également.


0 commentaires

0
votes

J'ai essayé d'utiliser CGRectureTegral et des trucs. Dans mon cas, la variation de la taille de la police et la taille de la police dans IB l'a fait.


0 commentaires

0
votes

J'ai déjà rencontré ce problème. La solution ci-dessous fonctionne parfaitement pour tout texte ou format de cadre car il utilise la fonction ronde pour se débarrasser des valeurs de pixels fractionnaires. Insérez le code suivant après votre instanciation de l'UITEXTFIELD en question. xxx


0 commentaires

0
votes

Définit simplement le Uitextfield Hauteur de cadre à une valeur pare-dessus fixe pour moi.


2 commentaires

Cela ne résout pas le problème cependant, cela fonctionne simplement autour du problème sous-jacent afin que vous ayez une taille qui ne provoque pas la floue. Forcer le cadre dans des valeurs intégrées correctement correctement le problème.


Bien pour moi c'est fait. J'utilise SystemFontfsize: 18



0
votes

solution de Ce site explique que Il peut être lié au redimensionnement et IOS ne prend pas soin de ce bogue pour les couches, uniquement les différentes vues. Je l'ai mis à jour à Swift 4: XXX


0 commentaires