12
votes

Afficher à la fois une vue correcte et un bouton clair de Uitextfield

Après avoir ajouté une vue de droite sur un uitextfield , je constate qu'il refuse d'afficher à la fois la vue correcte et la touche Effacer (avoir les deux droiteviewMode et et et et ClearButtonMode défini sur UITEXTFIELDVIEWMODIES ). Je vois la bonne vue mais le bouton clair n'est plus affiché. Je me suis assuré qu'ils ne se chevauchent pas en cas de remplacement ClearButtonRectForbounds et ClearButtonRectForbounds , en vain. Et si j'utilise la View au lieu de RedayView, aucun problème de ce type ne se produit et que la vue de gauche et le bouton clair sont affichés.

Donc, bien que cela ne semble pas être indiqué dans la documentation, il me semble que le bouton Clear ne s'affiche que lorsque la vue correcte n'est pas affichée (et lorsque la propriété de texte n'est pas une chaîne vide). Est-ce exact et quelqu'un a-t-il une solution de contournement fiable? En attendant, je crois que je suis coincé avec devoir créer un UIView qui superpose ma bonne vue au sommet d'un Uitextfield afin d'obtenir ce que je gagnerais de l'Uitextfield seul.


0 commentaires

4 Réponses :


4
votes

Oui, vous avez raison. Uitextfield a des propriétés telles que la vue gauche et droite. Si vous utilisez un bouton clair, il chevauche à droiteview.

formulaire Apple doc http: // développeur.apple.com/library/ios/#documentation/uikit/reeference/uitextfield_class/reference/uitextfield.html

Si votre vue de superposition ne chevauche pas d'autres vues de frère de frère, il reçoit des événements tactiles comme une autre vue. Si vous spécifiez un contrôle de votre vue, ce contrôle passe et envoie des actions comme d'habitude. Si une vue de superposition chevauche le bouton CLEAR, cependant, le bouton CLEAR a toujours priorité dans la réception d'événements. Par défaut, la vue de la superposition de droite se chevauche le bouton CLEAR.

Mais comme si le nom dit que c'est une vue. Vous pouvez donc créer votre propre point de vue qui a 2 boutons sur elle et définir la vision de la vue de Textfield. Si vous le souhaitez, vous pouvez utiliser des méthodes de délégation de Textfield pour que vos boutons apparaissent et disparaissent de la vue.


1 commentaires

La documentation semble trompeuse. Cela ne dit pas que le bouton clair et la bonne vue sont mutuellement exclusifs. Cela dit seulement qu'ils se chevauchent. Cela fait semblant que si j'avais utilisé une vue transparente, je verrais le bouton clair. Cependant, ce n'est pas le cas.



15
votes

Vous ne pouvez pas afficher les deux en même temps, mais vous pouvez le faire comme ce xxx


1 commentaires

Merveilleuse réponse!



3
votes

J'ai eu le même problème, mais j'ai été facilement résolu en "rigoler" l'Uitextfield à l'aide de la vue de gauche au lieu de voir de droite. De cette façon, vous pouvez utiliser un bouton clair et votre supposé à droiteview . Tout ce que vous avez à faire est de la sous-classe Uitextfield et de renvoyer le «coin droit» dans gaucheViewrectorborcs et la mise à jour de la même manière éditionRectForbounds et textrectforbounds . Fonctionne parfaitement.


3 commentaires

J'ai trouvé plus facile d'ajouter une sous-vision et une substitution éditionRectForbounds / textrectforbounds pour l'éviter. N'avait pas besoin d'utiliser gaucheview (puisque je veux toujours que ma sous-affichée soit affichée.)


Si vous souhaitez ajouter un exemple de code, je vous donnerai un uppote :)


Fonctionne bien mais je devais remplacer PlaceholderRectForbounds aussi, pour le faire fonctionner correctement.



2
votes

Je sauve suite à la réponse @strange (en utilisant la vue de gauche au lieu de droite) avec un code:

-(CGRect)leftViewRectForBounds:(CGRect)bounds
{
    return CGRectOffset([super leftViewRectForBounds:bounds], bounds.size.width - 30, 0);
}

-(CGRect)clearButtonRectForBounds:(CGRect)bounds
{
    return CGRectOffset([super clearButtonRectForBounds:bounds], -30, 0);
}


-(CGRect)editingRectForBounds:(CGRect)bounds
{
    CGRect rect = bounds;
    rect.origin.x = 10;
    rect.size.width -= 60;
    return rect;
}


-(CGRect)textRectForBounds:(CGRect)bounds
{
    CGRect rect = bounds;
    rect.origin.x = 10;
    rect.size.width -= 60;
    return rect;
}


0 commentaires