[RESOLU][Swift]UITextField custom

maitomaito Membre
août 2015 modifié dans API UIKit #1

Bonjour, 


je veux customiser mon propre TextField (pour qu'il ressemble a ceci http://hpics.li/a45135f) et pour ca j'utilise la  classe suivant (j'essaie de dessiner le ligne qui est en dessous le cadre pour écrire son identifiant) : 



import UIKit

class CustomTextField: UITextField
{
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.attributedPlaceholder = NSAttributedString(string: "Identifier :", attributes: [NSForegroundColorAttributeName : UIColor.whiteColor()])
}

override func drawRect(rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
CGContextSetLineWidth(context, 1.0)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let components: [CGFloat] = [1.0, 1.0, 1.0, 1.0]
let color = CGColorCreate(colorSpace, components)
CGContextSetStrokeColorWithColor(context, color)
CGContextMoveToPoint(context,self.layer.position.x,self.layer.position.y)
CGContextAddLineToPoint(context, self.layer.position.x+100, self.layer.position.y)
CGContextStrokePath(context)
}


Le problème vient de 



CGContextMoveToPoint(context,self.layer.position.x,self.layer.position.y)
CGContextAddLineToPoint(context, self.layer.position.x+100, self.layer.position.y)

Je n'arrive pas à  récupérer la position de mon objet et ce n'est apparement pas la bonne manière de faire.


ps: Ce TexteField existe biensure deja dans mon main.storyboard.


J'espère avoir été assez clair.


Dernière petite question : Si dans la création de notre projet nous mettons que c'est que pour Ipad qu'est ce que ca change réellement ? Je pourrais rebasculer l'app sur iphone plus tard ?


Merci d'avance.


Réponses

  • CéroceCéroce Membre, Modérateur
    août 2015 modifié #2
    1) Utilise le rectangle .bounds de UIView. Regarde bien la doc de UITextField et UIControl, j'ai déjà  fait ce genre de choses, dans mon souvenir, il y a des méthodes précises à  surcharger et à  appeler pour connaà®tre les dimensions.
    2) Pourquoi utiliser directement Core Graphics quand on dispose de UIBezierPath et UIColor ?
    3) Pas de problème particulier pour passer sur iPhone plus tard, hormis les adaptations d'IHM.
  • AliGatorAliGator Membre, Modérateur
    Pour compléter la réponse de Céroce, effectivement s'il faut utiliser "bounds" et non pas "layer.position" c'est parce que layer.position n'est pas du tout dans le système de coordonnées auquel tu t'attends.

    layer.position, tout comme view.center, donnent les coordonnées du centre du layer (respectivement de la vue)... dans son conteneur parent. view.center par exemple donne les coordonnées du centre de la vue dans sa superview, et indiquent donc où est positionnée cette vue dans la vue parente. Tout comme la frame indique les coordonnées du rectangle englobant de la vue dans sa vue parente. Si textfield.center.x et textfield.center.y sont grand, ça veut juste dire que ton textfield est plutôt positionné en bas à  droite de l'écran, alors qu'avec un textfield.center ayant un x et y petits le textfield sera plutôt en haut à  gauche de l'écran.

    Tout ceci n'est pas du tout des coordonnées qui te seront utiles pour dessiner à  l'intérieur de ta vue. Pour dessiner dans ton textfield, et ce quel que soit son emplacement à  l'écran, toi tu veux plutôt te baser sur les bounds (de ta vue ou de ton layer), et pas la frame ou le center. Le 0,0 des bounds d'une vue sont en haut à  gauche de la vue en question, quel que soit l'endroit où cette vue est positionnée à  l'écran.
  • maitomaito Membre
    août 2015 modifié #4

    SI j'ai bien compris si j'utilise "bounds", cela va me permettre de dessiner dans mon objet qui est le textfield? Cependant lorsque je dessine mon bezier il me faut des coordonnés, comment suis-je censé faire (je dois utiliser bounds.witdth/height?)?


  • AliGatorAliGator Membre, Modérateur
    ? Bah heu oui, les bounds ce sont des coordonnées d'un rectangle donc tu as toutes les coordonnées qu'il te faut, origine x,y (typiquement 0,0, du coup, vu que c'est les coordonnées du coin en haut à  gauche par rapport... au coin en haut à  gauche) et taille width/height, donc de quoi tu aurais besoin de plus ? Qu'est ce qui te gène au juste ?


    Et sinon, vu les questions que tu as l'air de te poser, il est urgent d'aller lire le Quartz 2D Programming Guide qui explique tous les concepts qu'il est nécessaire de comprendre pour dessiner, y compris toutes les explications schemas à  l'appui sur les systèmes de coordonnées et exemples de code pour comment dessiner sur une vue, avec les différentes façons possibles (via le layer, via le drawRect, via un UIBezierPath...)
  • Logiquement si l'origine est (0,0), moi je voudrais tracer une ligne du point (0,1) à  (1,1) ? Pour tracer une ligne en dessous de mon textfield? Merci pour le lien.


  • AliGatorAliGator Membre, Modérateur

    Logiquement si l'origine est (0,0), moi je voudrais tracer une ligne du point (0,1) à  (1,1) ? Pour tracer une ligne en dessous de mon textfield? Merci pour le lien.

    Non, car le système de coordonnées est dans l'autre sens (Y-down), et que de toute façon si tu essayes de dessiner quelquechose au-delà  des bounds de ta vue tu vas rien voir, vu que c'est en dehors de la vue et qu'elle clip son contenu...

    Mais bon je vais pas te faire un cours là  dessus et te réexpliquer tous ces détails du système de coordonnées iOS, de ce qu'est le clipping et comment ça marche, etc... car vraiment, tout est expliqué dans les détails dans le Programming Guide où tu auras toutes les réponses à  tes questions, donc va vraiment le lire tu y verras bien plus clair.
Connectez-vous ou Inscrivez-vous pour répondre.