Je voudrais insérer le texte d'unUITextField
.
Est-ce possible?
ios
cocoa-touch
uitextfield
RunLoop
la source
la source
Réponses:
La substitution
-textRectForBounds:
ne modifiera que l'encart du texte d'espace réservé. Pour modifier l'encart du texte modifiable, vous devez également remplacer-editingRectForBounds:
la source
UITextField
réside dans unUIScrollView
.- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
Trouvé ici: stackoverflow.com/questions/5361369/…J'ai pu le faire grâce à:
Bien sûr, n'oubliez pas d'importer QuartzCore et d'ajouter également le Framework à votre projet.
la source
UITextField
chevauche le contenu à droite de celui-ci.Si vous avez juste besoin d'une marge gauche, vous pouvez essayer ceci:
Ça marche pour moi. J'espère que cela peut aider.
la source
leftView.backgroundColor = textField.backgroundColor;
... Autre que cette excellente solution ... Merci (:Dans une classe dérivée de UITextField, remplacez au moins ces deux méthodes:
Cela peut être aussi simple que cela si vous n'avez pas de contenu supplémentaire:
UITextField fournit plusieurs méthodes de positionnement que vous pouvez remplacer.
la source
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Que diriez - vous d' une
@IBInspectable
,@IBDesignable
classe rapide.Vous verrez cela dans votre storyboard.
Mise à jour - Swift 3
la source
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/editingRect
) affecte les performances de défilement (sur iOS 12 au moins), lorsque le texte déborde du rect visible. Avec un encart de 15, il arrête même de défiler.Si vous avez un bouton clair, la réponse acceptée ne fonctionnera pas pour vous. Nous devons également nous prémunir contre les changements futurs d'Apple en appelant
super
.Donc, pour vous assurer que le texte ne chevauche pas le bouton d'effacement, obtenons d'abord la valeur `` par défaut ''
super
, puis ajustez-la si nécessaire.Ce code ajoutera un encart de 10 pixels en haut, à gauche et en bas du champ de texte:
Remarque: UIEdgeInsetsMake prend les paramètres dans l'ordre: haut , gauche , bas , droite .
la source
textRectForBounds:
et leseditingRectForBounds:
méthodes sansclearButtonRectForBounds:
sur iOS 7+ ont fonctionné pour moi.clearButtonRectForBounds:
aide juste à pousser un peu le bouton d'effacement vers la gauche. Vous voudrez peut-être le laisser de côté. Mon champ de texte était sur un fond sombre et le bouton d'effacement avait besoin d'un peu de rembourrage supplémentaire sur la droite.Je pensais que je fournirais une solution Swift
Swift 3+
la source
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
, l'espace réservé est également affecté - donc l'ajout de la substitution d'espace réservé insère l'espace réservé de 10 points supplémentaires. Si c'est ce que vous recherchez, 👍🏼, mais sinon, il est bon d'en être conscient.L'utilisation
textRectForBounds:
est la bonne approche. J'ai enveloppé cela dans ma sous-classe afin que vous puissiez simplement l'utilisertextEdgeInsets
. Voir SSTextField .la source
Rapide
la source
Pour les personnes qui recherchent une solution plus simple.
Ajoutez l'
UITextField
intérieur aUIView
. Pour simuler un encart autour du champ de texte, je garde 10 px à gauche et la largeur est inférieure de 20 pixels à la vue. Pour une bordure de coin arrondie autour du champ de texte, utilisez la bordure de la vuela source
UITextView
peut-être?Vous pouvez définir un encart de texte pour UITextField en définissant leftView.
Comme ça:
la source
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
Rapide
la source
Une bonne approche pour ajouter un remplissage à UITextField consiste à sous-classer UITextField et à ajouter une propriété edgeInsets. Vous définissez ensuite les edgeInsets et le UITextField sera dessiné en conséquence. Cela fonctionnera également correctement avec un ensemble leftView ou rightView personnalisé.
OSTextField.h
OSTextField.m
la source
Swift 3 / Designable dans le générateur d'interface / Insectes horizontaux et verticaux séparés / utilisables dès la sortie
usage:
&
la source
Je l'ai fait dans IB où j'ai créé une UIView Derrière la textView qui était un peu plus longue. Avec la couleur d'arrière-plan textField définie sur clear.
la source
C'est le moyen le plus rapide que j'ai trouvé sans faire de sous-classes:
Dans Swift:
la source
Voici le même UITextField sous-classé écrit dans Swift 3. Il est assez différent des versions précédentes de Swift, comme vous le verrez:
Par ailleurs, vous pouvez également faire quelque chose comme ce qui suit, si vous souhaitez contrôler l'encart d'un seul côté. Cet exemple particulier d'ajustement uniquement de l'encart de gauche est utile si vous placez une image au-dessus de l'UITextField mais que vous souhaitez qu'elle apparaisse à l'utilisateur comme étant dans le champ de texte:
la source
Version Swift 4.2 :
la source
Vous pouvez ajuster le positionnement du texte dans un champ de texte en en faisant une sous-classe
UITextField
et en remplaçant la-textRectForBounds:
méthode.la source
Il est absurde de devoir sous-
UITextField
classer , car il met déjà en œuvre les méthodes, comme le souligne @Adam Waite. Voici une extension rapide qui expose une méthode d'usine, également disponible dans notre référentiel de catégories :la source
J'ai sous-classé UITextField pour gérer cela qui prend également en charge l'encart gauche, haut, droit et bas et le positionnement des boutons clairs.
MRDInsetTextField.h
MRDInsetTextField.m
Exemple d'utilisation où * _someTextField * provient de la vue nib / storyboard avec la classe personnalisée MRDInsetTextField
la source
Ce n'est pas aussi court que les autres exemples, mais adopte une approche entièrement différente pour résoudre ce problème. Notez que le curseur commence toujours à affleurer sur le bord gauche mais le texte sera correctement mis en retrait lors de la frappe / affichage. Cela fonctionne sans sous-classement si vous recherchez juste une marge gauche et que vous utilisez déjà
UITextFieldDelegate
vos champs de texte. Vous devez définir à la fois les attributs de texte par défaut et les attributs de frappe. Vous définissez les attributs de texte par défaut lorsque vous créez le champ de texte. Les attributs de frappe que vous devez définir dans le délégué. Si vous utilisez également un espace réservé, vous souhaiterez également le définir sur la même marge. En résumé, vous obtenez quelque chose comme ça.Créez d'abord une catégorie sur la
UITextField
classe.Ensuite, si vous utilisez des supports placés, assurez-vous d'utiliser un espace réservé attribué définissant le même retrait. Créez un dictionnaire attribué par défaut avec les attributs appropriés, quelque chose comme ceci:
Ensuite, importez la catégorie ci-dessus et chaque fois que vous créez un champ de texte, définissez le retrait par défaut, le délégué et utilisez les attributs d'espace réservé par défaut définis ci-dessus. Par exemple:
Enfin, dans le délégué, implémentez la
textFieldDidBeginEditing
méthode, quelque chose comme ceci:la source
defaultTextAttributes
contientNSMutableParagraphStyle
est assez dangereuse. Je préfère mutable Copiez tout cela.J'essaye normalement d'éviter le sous-classement, mais cela fonctionne si vous avez déjà:
la source
Pour ajouter une autre solution qui n'a pas besoin de sous-classement:
Testé avec iOS 7 et iOS 8. Les deux fonctionnent. Il y a peut-être encore la possibilité qu'Apple modifie la hiérarchie des couches d'UITextField en vissant les choses.
la source
Voici une réponse Swift complète qui comprend une leftView (icône personnalisée) et un bouton d'effacement personnalisé, tous deux définis dans Interface Builder avec des encarts personnalisables.
la source
Une solution qui fonctionne réellement et couvre tous les cas:
offsetBy
pasinsetBy
.Rect
.Échantillon:
la source
Si vous souhaitez uniquement modifier le retrait TOP et LEFT
// position d'espace réservé
// position du texte
la source
Solution rapide sans sous-classe et également inspectable
la source