Primordial -textRectForBounds: ne fait que changer l'encart du texte de l'espace réservé. Pour modifier l'encart de texte éditable, vous devez également remplacer -editingRectForBounds:
Cette solution a fonctionné pour moi, même si j'ai utilisé une valeur de retour de CGRectInset(limites, 9, 0); j'ai également nécessaire pour définir cette valeur pour textRectForBounds, editingRectForBounds, et placeholderRectForBounds. Cette solution n'est pas de bien jouer avec clearButton. Le texte à l'intérieur TextField bouton superpositions. Je pense que, à remplacer des méthodes ci-dessus sera la cause de défilement lent, si UITextField est résidant dans un UIScrollView. Pour placer le ClearButton: - (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); } Trouvé ici: stackoverflow.com/questions/5361369/... Je suggère d'appeler [super textRectForBounds:limites] et [super editingRectForBounds:limites] avant d'appeler CGRectInset(limites,10, 10). Cela permettra de résoudre le bouton effacer la superposition de problème.
Bien sûr, n'oubliez pas d'importer QuartzCore et aussi ajoutez le Cadre de votre projet.
Merci.. il a été d'une grande aide... +1 pour la créativité, mais c'est un peu problématique, il se déplace également supprimer bouton à l'intérieur de textfield vous pourriez faire myTextField.la couche.les sous-couches qui est un tableau de tous les sous-couches... et si sa UIImageView <- je suis en supposant que X est une image.. ou peut-être UIButton... ou vous pourriez boucle approfondie de chacun et de voir celui qui appartient à qui la sous-vue... mais myfield.la couche.sublayerTransform toutes les sous-couches et donc le bouton X en mouvement aussi bien.. C'est la meilleure solution sans sous-classement et n'a pas besoin de plus, inutile de vues pour être placé sur l'écran! +1! Le bouton X sur le côté droit de cette image.. developer.apple.com/library/content/documentation/...
Il pourrait être aussi simple que cela, si vous n'avez pas de contenu supplémentaire:
returnCGRectInset(bounds ,10,10);
UITextField fournit plusieurs méthodes de positionnement que vous pouvez remplacer.
oui, si vous ne la supplante pas editingRectForBounds vous obtenez le texte lors de l'édition en haut à gauche de la zone de texte. - (CGRect)editingRectForBounds:(CGRect)limites { return CGRectInset(limites, 10, 10); } Juste modifié la réponse à intégrer editingRectForBounds méthode en Cela me semble être une horrible hack - vous aussi, vous avez besoin de remplacer - (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Cela fonctionne pour moi. J'espère que cela peut aider.
C'est beaucoup plus facile que de sous-classement juste pour obtenir un encart, et vous permet d'ajouter n'importe quel point de vue sur la gauche (vous pouvez également utiliser rightView de mettre quelque chose sur la droite). Mieux que la accepté de répondre à mon humble avis. +1 facile, sans sous-classement, et conçu pour fonctionner avec les propriétés textfield (plutôt que de 'piratage'). Troisième ligne devrait être leftView.backgroundColor = textField.backgroundColor;... Autres que la grande solution... Merci (: Pas tout à fait aussi élégant/complet que azdev réponse, mais une excellente solution pour une simple affaire! Sous-classement va vous faire économiser une tonne de temps sur cette réponse, sauf si vous avez une seule zone de texte vous en avez besoin pour.
@IBDesignableclassTextField:UITextField{@IBInspectable var insetX:CGFloat=6{
didSet {
layoutIfNeeded()}}@IBInspectable var insetY:CGFloat=6{
didSet {
layoutIfNeeded()}}//placeholder position
override func textRectForBounds(bounds:CGRect)->CGRect{returnCGRectInset(bounds , insetX , insetY)}//text position
override func editingRectForBounds(bounds:CGRect)->CGRect{returnCGRectInset(bounds , insetX , insetY)}}
Vous verrez cela dans votre storyboard.
Mise À Jour - Swift 3
@IBDesignableclassTextField:UITextField{@IBInspectable var insetX:CGFloat=0@IBInspectable var insetY:CGFloat=0//placeholder position
override func textRect(forBounds bounds:CGRect)->CGRect{return bounds.insetBy(dx: insetX, dy: insetY)}//text position
override func editingRect(forBounds bounds:CGRect)->CGRect{return bounds.insetBy(dx: insetX, dy: insetY)}}
J'ai trouvé l'effet sur Y indésirables, je ne veux pas réduire le rect pour le texte, plutôt pousser vers le bas en direction de la ligne de base du domaine. J'ai ajusté la mise en œuvre de let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0) Et d'ajouter cette trop si yo utilisez espace réservé " ignorer func placeholderRectForBounds(limites: CGRect) -> CGRect { return CGRectInset(limites , insetX , insetY) }` Fonctionne parfaitement.
Si vous avez un bouton d'effacement, de la accepté de répondre ne fonctionnera pas pour vous. Nous devons également nous prémunir contre Apple de changer les choses dans le futur en appelant super.
Donc, assurez-vous que le texte ne déborde pas sur le bouton effacer, nous allons obtenir la valeur "par défaut" de super d'abord, puis de l'ajuster si nécessaire.
Ce code permettra d'ajouter un 10px empiècement sur le haut, à gauche et en bas du champ de texte:
@interfaceInsetTextField:UITextField@end@implementationInsetTextField//Placeholder position-(CGRect)textRectForBounds:(CGRect)bounds {CGRect rect =[super textRectForBounds:bounds];UIEdgeInsets insets =UIEdgeInsetsMake(10,10,10,0);returnUIEdgeInsetsInsetRect(rect, insets);}//Text position-(CGRect)editingRectForBounds:(CGRect)bounds {CGRect rect =[super editingRectForBounds:bounds];UIEdgeInsets insets =UIEdgeInsetsMake(10,10,10,0);returnUIEdgeInsetsInsetRect(rect, insets);}//Clear button position-(CGRect)clearButtonRectForBounds:(CGRect)bounds {CGRect rect =[super clearButtonRectForBounds:bounds];returnCGRectOffset(rect,-5,0);}@end
Remarque: UIEdgeInsetsMake prend des paramètres dans l'ordre: haut, gauche, bas, droit.
Merci beaucoup! J'ai été en utilisant la accepté de répondre et a remarqué qu'il ne tient pas compte pour le bouton effacer. Cette réponse n'est et doit être considérée comme la accepté de répondre. À l'aide de textRectForBounds: et editingRectForBounds: méthodes sansclearButtonRectForBounds: sur iOS 7+ a fonctionné pour moi. clearButtonRectForBounds: aide simplement pousser le bouton effacer de la gauche un peu. Comme vous pouvez le laisser dehors. Mon champ de texte a été sur un fond sombre, et le bouton effacer besoin d'un peu de rembourrage supplémentaire sur la droite.
importUIKitclassTextField:UITextField{
let inset:CGFloat=10//placeholder position
override func textRectForBounds(bounds:CGRect)->CGRect{returnCGRectInset(bounds , inset , inset)}//text position
override func editingRectForBounds(bounds:CGRect)->CGRect{returnCGRectInset(bounds , inset , inset)}
override func placeholderRectForBounds(bounds:CGRect)->CGRect{returnCGRectInset(bounds, inset, inset)}}
N'oubliez pas override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) } Dans Swift 3, vous devez utiliser 'CGRect.insetBy () la méthode Dans iOS 11 au moins, si vous substituez textRectForBounds, l'espace réservé est également affectée - donc, l'ajout de l'espace réservé remplacer les encarts de l'espace réservé un autre 10pt plus loin. Si c'est ce que vous cherchez, , mais si pas, il est bon d'être conscient de.
À l'aide de textRectForBounds: est la bonne approche. J'ai enroulé dans mon sous-classe de sorte que vous pouvez simplement utiliser textEdgeInsets. Voir SSTextField.
Cette approche, avec l'aide de cocoapods pour importer les SSToolkit pod, fonctionne très bien - je pense que c'est la plus élégante façon d'aller. Merci Chris! Content que vous avez trouvé utile.
Pour les personnes, qui sont à la recherche d'une solution plus facile.
Ajouter le UITextField à l'intérieur d'un UIView. Pour simuler un médaillon autour du champ de texte je garde 10 px à gauche et la largeur est 20px moins de la vue. Pour un angle arrondi bordure autour de la zone de texte, utilisation de la vue sur la frontière
Honnêtement, juste de mettre une UIView derrière l'objet UITextField est la meilleure et la plus simple des solutions. Faire l'objet UITextField transparent et fait. J'ai aligné avec un UITextView s'avère être d'environ 6 pixels en médaillon. Beaucoup plus facile et aussi plus souple que la création d'une sous-classe... Un problème avec cette approche est l'endroit où la barre de défilement apparaît. Ce que la barre de défilement? Faites-vous référence à UITextView peut-être?
Une bonne approche pour ajouter rembourrage pour objet UITextField est à la sous-classe UITextField et ajouter un edgeInsets de la propriété. Vous définissez ensuite la edgeInsets et l'objet UITextField sera établi en conséquence. Ce sera aussi fonctionner correctement avec un custom leftView ou rightView ensemble.
Lorsque vous devez également utiliser la vue de gauche pour une icône, on ne travail cette méthode sera également travailler pour une image. ajouter la quantité de remplissage que vous voulez à la largeur de l'imageview cadre et définir contentmode au centre. imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height) c'est beaucoup trop hacky. il y a déjà un textRectForBounds méthode pour le réglage de l'encart
//adjust place holder text
let paddingView =UIView(frame:CGRectMake(0,0,10, usernameOrEmailField.frame.height))
usernameOrEmailField.leftView = paddingView
usernameOrEmailField.leftViewMode =UITextFieldViewMode.Always
Ici est la même sous-classé UITextField écrit dans Swift 3. Il est tout à fait différente des versions antérieures de Swift, comme vous allez le voir:
importUIKitclassMyTextField:UITextField{
let inset:CGFloat=10//placeholder position
override func textRect(forBounds bounds:CGRect)->CGRect{return bounds.insetBy(dx: inset, dy: inset)}//text position
override func editingRect(forBounds bounds:CGRect)->CGRect{return bounds.insetBy(dx: inset, dy: inset)}
override func placeholderRect(forBounds bounds:CGRect)->CGRect{return bounds.insetBy(dx: inset, dy: inset)}}
D'ailleurs, vous pouvez aussi faire quelque chose comme ce qui suit, si vous voulez contrôler l'encart d'un seul côté. Cet exemple particulier de réglage seulement la gauche encart est très pratique si vous placez une image sur le dessus de l'objet UITextField, mais vous souhaitez qu'il apparaisse à l'utilisateur d'être dans le champ de texte:
Vous pouvez ajuster le positionnement du texte dans un champ de texte qui en fait une sous-classe de UITextField et en remplaçant la -textRectForBounds: méthode.
Il est absurde que vous avez à la sous-classe, depuis UITextField déjà implémente les méthodes, comme @Adam Waite points. Voici une rapide extension qui expose une méthode de fabrique, également disponible dans notre catégories repo:
privateclassInsetTextField:UITextField{
var insets:UIEdgeInsets
init(insets:UIEdgeInsets){
self.insets = insets
super.init(frame:CGRectZero)}
required init(coder aDecoder:NSCoder){
fatalError("not intended for use from a NIB")}//placeholder position
override func textRectForBounds(bounds:CGRect)->CGRect{return super.textRectForBounds(UIEdgeInsetsInsetRect(bounds, insets))}//text position
override func editingRectForBounds(bounds:CGRect)->CGRect{return super.editingRectForBounds(UIEdgeInsetsInsetRect(bounds, insets))}}
extension UITextField{class func textFieldWithInsets(insets:UIEdgeInsets)->UITextField{returnInsetTextField(insets: insets)}}
Le lien dans votre réponse est mort, pouvez vous s'il vous plaît mettre à jour? Correction de l'URL @WendiKidd
Je subclased UITextField pour gérer ce que soutient la gauche, en haut, à droite et en bas, en médaillon, et le bouton effacer positionnement en tant que bien.
Ce n'est pas aussi court que les autres exemples, mais prend une tout autre approche pour résoudre ce problème. Remarque, le curseur va encore commencer à ras du bord gauche, mais le texte sera correctement en retrait lorsqu'il est saisi/affiche. Cela fonctionne sans sous-classement, si vous recherchez seulement de la marge de gauche et que vous utilisez déjà UITextFieldDelegate pour vos champs de texte. Vous devez définir la valeur par défaut des attributs de texte et le typage des attributs. Vous définissez la valeur par défaut des attributs de texte lorsque vous créez le champ de texte. Le typage des attributs, vous devez définir un délégué. Si vous utilisez également un espace réservé à définir qu'à la marge. Assembler tout, vous obtenez quelque chose comme ceci.
D'abord créer une catégorie sur la UITextField classe.
Puis, si vous utilisez placé titulaires assurez-vous d'utiliser un attribuées espace réservé réglage de ce même alinéa. Créer une valeur par défaut attribuée dictionnaire avec les attributs appropriés, quelque chose comme ceci:
Ensuite, l'importation de la catégorie ci-dessus et à chaque fois que vous créez un champ de texte définir la valeur par défaut de retrait, le délégué et l'utilisation de la valeur par défaut de l'espace réservé attributs définis ci-dessus. Par exemple:
Testé avec iOS 7 et iOS 8. Tant de travail. Encore là, peut-être la chance d'Apple, la modification de l'objet UITextField couche de la hiérarchie vissage des choses mal.
Voici une complète réponse rapide qui comprend un leftView (icône personnalisée) et une coutume bouton effacer, définie à la fois dans Interface Builder avec des encarts.
importUIKit@IBDesignableclassInsetTextField:UITextField{@IBInspectable var leftInset:CGFloat=0@IBInspectable var rightInset:CGFloat=0@IBInspectable var icon:UIImage?{ didSet {
let imageView =UIImageView(frame:CGRect(x:0, y:0, width:16, height:16))
imageView.image = icon
self.leftView = imageView
self.leftViewMode =.Always}}@IBInspectable var clearButton:UIImage?{ didSet {
let button =UIButton(type:.Custom)
button.setImage(clearButton, forState:.Normal)
button.addTarget(self, action:"clear", forControlEvents:UIControlEvents.TouchUpInside)
button.frame =CGRect(x:0, y:0, width:18, height:18)
self.rightView = button
self.rightViewMode =.WhileEditing}}
func clear(){
self.text =""}
override func leftViewRectForBounds(bounds:CGRect)->CGRect{
var height:CGFloat=0
var width:CGFloat=0if let leftView = self.leftView {
height = leftView.bounds.height
width = leftView.bounds.width
}returnCGRect(x: leftInset, y: bounds.height/2- height/2, width: width, height: height)}
override func rightViewRectForBounds(bounds:CGRect)->CGRect{
var height:CGFloat=0
var width:CGFloat=0if let rightView = self.rightView {
height = rightView.bounds.height
width = rightView.bounds.width
}returnCGRect(x: bounds.width - width - rightInset, y: bounds.height/2- height/2, width: width, height: height)}}
Solution rapide sans sous-classe & aussi possible d'
extension UITextField{@IBInspectable var textInsets:CGPoint{
get {returnCGPoint.zero
}set{
layer.sublayerTransform =CATransform3DMakeTranslation(newValue.x, newValue.y,0);}}}
Primordial
-textRectForBounds:
ne fait que changer l'encart du texte de l'espace réservé. Pour modifier l'encart de texte éditable, vous devez également remplacer-editingRectForBounds:
Cette solution n'est pas de bien jouer avec clearButton. Le texte à l'intérieur TextField bouton superpositions.
Je pense que, à remplacer des méthodes ci-dessus sera la cause de défilement lent, si
UITextField
est résidant dans unUIScrollView
.Pour placer le ClearButton:
- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
Trouvé ici: stackoverflow.com/questions/5361369/...Je suggère d'appeler [super textRectForBounds:limites] et [super editingRectForBounds:limites] avant d'appeler CGRectInset(limites,10, 10). Cela permettra de résoudre le bouton effacer la superposition de problème.
OriginalL'auteur azdev
J'ai été en mesure de le faire à travers:
Bien sûr, n'oubliez pas d'importer QuartzCore et aussi ajoutez le Cadre de votre projet.
+1 pour la créativité, mais c'est un peu problématique, il se déplace également supprimer bouton à l'intérieur de textfield
vous pourriez faire myTextField.la couche.les sous-couches qui est un tableau de tous les sous-couches... et si sa UIImageView <- je suis en supposant que X est une image.. ou peut-être UIButton... ou vous pourriez boucle approfondie de chacun et de voir celui qui appartient à qui la sous-vue... mais myfield.la couche.sublayerTransform toutes les sous-couches et donc le bouton X en mouvement aussi bien..
C'est la meilleure solution sans sous-classement et n'a pas besoin de plus, inutile de vues pour être placé sur l'écran! +1!
Le bouton X sur le côté droit de cette image.. developer.apple.com/library/content/documentation/...
OriginalL'auteur chuthan20
Dans une classe dérivée de UITextField, remplacer au moins deux méthodes:
Il pourrait ê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.
Juste modifié la réponse à intégrer editingRectForBounds méthode en
Cela me semble être une horrible hack - vous aussi, vous avez besoin de remplacer
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
OriginalL'auteur drawnonward
Si vous avez besoin d'une marge de gauche, vous pouvez essayer ceci:
Cela fonctionne pour moi. J'espère que cela peut aider.
+1 facile, sans sous-classement, et conçu pour fonctionner avec les propriétés textfield (plutôt que de 'piratage').
Troisième ligne devrait être
leftView.backgroundColor = textField.backgroundColor;
... Autres que la grande solution... Merci (:Pas tout à fait aussi élégant/complet que azdev réponse, mais une excellente solution pour une simple affaire!
Sous-classement va vous faire économiser une tonne de temps sur cette réponse, sauf si vous avez une seule zone de texte vous en avez besoin pour.
OriginalL'auteur roberto.buratti
Un
@IBInspectable
,@IBDesignable
swift classe.Vous verrez cela dans votre storyboard.
Mise À Jour - Swift 3
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
Et d'ajouter cette trop si yo utilisez espace réservé " ignorer func placeholderRectForBounds(limites: CGRect) -> CGRect { return CGRectInset(limites , insetX , insetY) }`
Fonctionne parfaitement.
OriginalL'auteur mash
Si vous avez un bouton d'effacement, de la accepté de répondre ne fonctionnera pas pour vous. Nous devons également nous prémunir contre Apple de changer les choses dans le futur en appelant
super
.Donc, assurez-vous que le texte ne déborde pas sur le bouton effacer, nous allons obtenir la valeur "par défaut" de
super
d'abord, puis de l'ajuster si nécessaire.Ce code permettra d'ajouter un 10px empiècement sur le haut, à gauche et en bas du champ de texte:
Remarque: UIEdgeInsetsMake prend des paramètres dans l'ordre: haut, gauche, bas, droit.
À l'aide de
textRectForBounds:
eteditingRectForBounds:
méthodes sansclearButtonRectForBounds:
sur iOS 7+ a fonctionné pour moi.clearButtonRectForBounds:
aide simplement pousser le bouton effacer de la gauche un peu. Comme vous pouvez le laisser dehors. Mon champ de texte a été sur un fond sombre, et le bouton effacer besoin d'un peu de rembourrage supplémentaire sur la droite.OriginalL'auteur Chris Nolet
Pensé que je pourrais fournir une Solution Swift
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Dans Swift 3, vous devez utiliser 'CGRect.insetBy () la méthode
Dans iOS 11 au moins, si vous substituez
textRectForBounds
, l'espace réservé est également affectée - donc, l'ajout de l'espace réservé remplacer les encarts de l'espace réservé un autre 10pt plus loin. Si c'est ce que vous cherchez, , mais si pas, il est bon d'être conscient de.OriginalL'auteur smitt04
À l'aide de
textRectForBounds:
est la bonne approche. J'ai enroulé dans mon sous-classe de sorte que vous pouvez simplement utilisertextEdgeInsets
. Voir SSTextField.Merci Chris! Content que vous avez trouvé utile.
OriginalL'auteur Sam Soffes
Pour les personnes, qui sont à la recherche d'une solution plus facile.
Ajouter le
UITextField
à l'intérieur d'unUIView
. Pour simuler un médaillon autour du champ de texte je garde 10 px à gauche et la largeur est 20px moins de la vue. Pour un angle arrondi bordure autour de la zone de texte, utilisation de la vue sur la frontièreUn problème avec cette approche est l'endroit où la barre de défilement apparaît.
Ce que la barre de défilement? Faites-vous référence à
UITextView
peut-être?OriginalL'auteur karim
Une bonne approche pour ajouter rembourrage pour objet UITextField est à la sous-classe UITextField et ajouter un edgeInsets de la propriété. Vous définissez ensuite la edgeInsets et l'objet UITextField sera établi en conséquence. Ce sera aussi fonctionner correctement avec un custom leftView ou rightView ensemble.
OSTextField.h
OSTextField.m
OriginalL'auteur Brody Robertson
Vous pouvez définir encart de texte pour objet UITextField par la définition de la leftView.
Comme ceci:
cette méthode sera également travailler pour une image. ajouter la quantité de remplissage que vous voulez à la largeur de l'imageview cadre et définir contentmode au centre.
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
c'est beaucoup trop hacky. il y a déjà un textRectForBounds méthode pour le réglage de l'encart
OriginalL'auteur Golden
Swift
OriginalL'auteur LondonGuy
Swift 3 /Personnalisable dans Interface builder /Séparés horizontalement & vertical insectes /utilisable hors de la boîte
utilisation:
&
OriginalL'auteur zgorawski
Swift 3 Version de Xcode 8.3.1 en Mai 2017:
OriginalL'auteur lcl
Ici est la même sous-classé UITextField écrit dans Swift 3. Il est tout à fait différente des versions antérieures de Swift, comme vous allez le voir:
D'ailleurs, vous pouvez aussi faire quelque chose comme ce qui suit, si vous voulez contrôler l'encart d'un seul côté. Cet exemple particulier de réglage seulement la gauche encart est très pratique si vous placez une image sur le dessus de l'objet UITextField, mais vous souhaitez qu'il apparaisse à l'utilisateur d'être dans le champ de texte:
OriginalL'auteur Gene Loparco
C'est le moyen le plus rapide que j'ai trouvé sans faire toutes les sous-classes:
Dans Swift:
OriginalL'auteur Max
Vous pouvez ajuster le positionnement du texte dans un champ de texte qui en fait une sous-classe de
UITextField
et en remplaçant la-textRectForBounds:
méthode.OriginalL'auteur Noah Witherspoon
Il est absurde que vous avez à la sous-classe, depuis
UITextField
déjà implémente les méthodes, comme @Adam Waite points. Voici une rapide extension qui expose une méthode de fabrique, également disponible dans notre catégories repo:Correction de l'URL @WendiKidd
OriginalL'auteur Christopher Pickslay
Je subclased UITextField pour gérer ce que soutient la gauche, en haut, à droite et en bas, en médaillon, et le bouton effacer positionnement en tant que bien.
MRDInsetTextField.h
MRDInsetTextField.m
Exemple d'utilisation où *_someTextField* vient de plume/affichage storyboard avec MRDInsetTextField classe personnalisée
OriginalL'auteur Firula
Ce n'est pas aussi court que les autres exemples, mais prend une tout autre approche pour résoudre ce problème. Remarque, le curseur va encore commencer à ras du bord gauche, mais le texte sera correctement en retrait lorsqu'il est saisi/affiche. Cela fonctionne sans sous-classement, si vous recherchez seulement de la marge de gauche et que vous utilisez déjà
UITextFieldDelegate
pour vos champs de texte. Vous devez définir la valeur par défaut des attributs de texte et le typage des attributs. Vous définissez la valeur par défaut des attributs de texte lorsque vous créez le champ de texte. Le typage des attributs, vous devez définir un délégué. Si vous utilisez également un espace réservé à définir qu'à la marge. Assembler tout, vous obtenez quelque chose comme ceci.D'abord créer une catégorie sur la
UITextField
classe.Puis, si vous utilisez placé titulaires assurez-vous d'utiliser un attribuées espace réservé réglage de ce même alinéa. Créer une valeur par défaut attribuée dictionnaire avec les attributs appropriés, quelque chose comme ceci:
Ensuite, l'importation de la catégorie ci-dessus et à chaque fois que vous créez un champ de texte définir la valeur par défaut de retrait, le délégué et l'utilisation de la valeur par défaut de l'espace réservé attributs définis ci-dessus. Par exemple:
Enfin, le délégué, de mettre en œuvre la
textFieldDidBeginEditing
méthode, quelque chose comme ceci:defaultTextAttributes
contientNSMutableParagraphStyle
est très dangereux.. je préfère mutableCopy tout cela.OriginalL'auteur user3878720
Je l'ai fait en IB, où j'ai créé une UIView Derrière le textView qui a été un peu plus long. Avec le champ de couleur de fond définie clairement.
OriginalL'auteur jeremy wilson
Temps normal, j'essaie d'éviter de sous-classement, mais cela fonctionne si vous avez déjà:
OriginalL'auteur Adam Waite
À jeter dans une autre solution qui n'a pas besoin de sous-classement:
Testé avec iOS 7 et iOS 8. Tant de travail. Encore là, peut-être la chance d'Apple, la modification de l'objet UITextField couche de la hiérarchie vissage des choses mal.
OriginalL'auteur Lukas
Voici une complète réponse rapide qui comprend un leftView (icône personnalisée) et une coutume bouton effacer, définie à la fois dans Interface Builder avec des encarts.
OriginalL'auteur rmooney
Si vous voulez changer le HAUT et le retrait à GAUCHE alors seulement
//espace réservé position
//position du texte
OriginalL'auteur Mann
Solution rapide sans sous-classe & aussi possible d'
OriginalL'auteur Bhavesh Tiwari
Swift 4.2 version:
OriginalL'auteur Bruno Paulino