[Résolu] TapGesture vers subview d'une custom class

busterTheobusterTheo Membre
octobre 2015 modifié dans API UIKit #1

Bonjour,


j'essaie de simplifier un bout de code. Enfin, si j'y arrive, je risque d'économiser au moins 1000 lignes de codes.


 


Je vais essayer de faire simple sans surcharger de code.


 


En gros, je tape sur un bouton (custom class) qui m'affiche un popUp (custom class), dans lequel j'avais des labels (custom class), (pas dans la custom class popup) mais dans la self.view (enfin une view dans la self - peu importe). Dans mon controller, quoi.


 


Tout fonctionnait nickel, mais super chiant pour les valeur de frame (x, y, width, height) qui n'étaient pas relative au popup (soi-disant porteur mais non) mais à  la self.view. Bref, débile et pénible à  force, mais le tapGesture sur chacun des labels fonctionnait.


 


En voulant modifier tout ce bordel, je met donc les labels dans la custom class du popup - Logique, non.


 


Et là , impossible de recevoir le tapGesture.


 


Bouts de code.


 


Pas dans la custom class popup, mais dans mon controller.



let tapGesturelabel1Regard: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "label1RegardTap:")
popUpFieldRegard.label1.userInteractionEnabled = true
popUpFieldRegard.label1.addGestureRecognizer(tapGesturelabel1Regard)

En gros le label dans le popup ne reçoit pas le tapGesture.



popUpFieldRegard.label1

Pourquoi ?


 


 


Merci d'avance.


 


J'ai vu tout un tas de trucs (sur les contraints par ex !!!) sur le web sans réussir.


Réponses

  • UserInteractionEnabled sur tes labels ?
  • busterTheobusterTheo Membre
    octobre 2015 modifié #3

    Ah merci colas_, mais en attendant, désolé, j'ai pris la décision de faire mon tap sur le popup, et mes tables sont bien tous dans le popup.


     


    J'ai tout synthétiser mon code.


    ça devient super abstrait, mais j'ai du gagner au moins mille lignes.


     


    Le code :



    func tapFormeArcadeButton() {
    removePopUpFieldsTap()

    popUpFieldFormeArcade = PopUpField(frame: CGRectMake(boutonFormeArcadeX + 60, boutonFormeArcadeY - 33, LargeurPopUpFields, HauteurPopUpFields * CGFloat(labelsChamps.count)))
    viewFille2Etapes.addSubview(popUpFieldFormeArcade)

    popUpFieldFormeArcade.label1String = labelsChamps[0]
    popUpFieldFormeArcade.label2String = labelsChamps[1]
    popUpFieldFormeArcade.label3String = labelsChamps[2]

    let tapGesturelabelsFormeArcade: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "labelsFormeArcadeTap:")
    popUpFieldFormeArcade.userInteractionEnabled = true
    popUpFieldFormeArcade.addGestureRecognizer(tapGesturelabelsFormeArcade)
    }

    func labelsFormeArcadeTap(recognizer: UITapGestureRecognizer) {
    let tap = recognizer as UITapGestureRecognizer
    if tap.state == .Ended {
    let recognizerY = recognizer.locationInView(popUpFieldFormeArcade).y as CGFloat
    let labelsChampsCount = labelsChamps.count
    for indexLabels in 0...labelsChampsCount - 1 {
    var inf = HauteurPopUpFields * CGFloat(indexLabels + 1)
    var sup = CGFloat(HauteurPopUpFields - 1) * CGFloat(indexLabels)
    if recognizerY < inf && recognizerY > sup {
    let labelString = labelsChamps[indexLabels]
    let labelUpperString = labelString.uppercaseString
    resultatFormeArcade.text = labelUpperString
    e5L8FormeArcadeString = labelsChamps[indexLabels]
    }
    }
    removePopUpFieldsTap()
    resultatRoue.removeFromSuperview()
    roueResultat()
    enregistrer()
    }
    }

    Les classes en question :


    Pas très académique, je le reconnais.


    Je peux mieux faire. Je verrais ça plus tard.


    Pour l'instant, ça me convient, à  part, évidemment des erreurs de conception que je ne connait pas.



    import UIKit

    class PopUpField: UIView {
    let FiletsBackgroundColor = UIColor(red: 171/255, green: 151/255, blue: 168/255, alpha: 1.0).CGColor

    var popLayer: CALayer = CALayer()
    var flecheLayer: CAShapeLayer = CAShapeLayer()
    var filet1: CALayer = CALayer()
    var filet2: CALayer = CALayer()
    var filet3: CALayer = CALayer()

    var label1: LabelPopup = LabelPopup()
    var label2: LabelPopup = LabelPopup()
    var label3: LabelPopup = LabelPopup()
    var label4: LabelPopup = LabelPopup()

    var label1String = ""
    var label2String = ""
    var label3String = ""
    var label4String = ""

    var nbreLabels: Int = 3

    override init(frame: CGRect) {
    super.init(frame: frame)
    self.backgroundColor = UIColor.greenColor()
    }

    required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }

    override func drawRect(rect: CGRect) {

    let popUpColor = UIColor(red: 167/255, green: 134/255, blue: 162/255, alpha: 1.0).CGColor

    popLayer.backgroundColor = popUpColor
    popLayer.cornerRadius = 8
    popLayer.shadowColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.25).CGColor
    popLayer.shadowOpacity = 0.8
    popLayer.shadowOffset = CGSizeMake(2, 2)
    popLayer.shadowRadius = 3

    self.layer.addSublayer(popLayer)

    var pathFleche = CGPathCreateMutable()
    CGPathMoveToPoint(pathFleche, nil, 0, 20)
    CGPathAddLineToPoint(pathFleche, nil, 20, 10)
    CGPathAddLineToPoint(pathFleche, nil, 20, 30)
    CGPathAddLineToPoint(pathFleche, nil, 0, 20)
    flecheLayer.fillColor = popUpColor

    flecheLayer.path = pathFleche
    self.layer.addSublayer(flecheLayer)

    filet1.frame = CGRect(x:18, y: 34, width: 174, height: 1)
    filet1.backgroundColor = FiletsBackgroundColor
    self.layer.addSublayer(filet1)

    if nbreLabels == 4 {
    popLayer.frame = CGRect(x: 18, y: 0, width: 174, height: 136)
    flecheLayer.frame = CGRect(x:0, y: 45, width: 20, height: 21)
    filet2.frame = CGRect(x:18, y: 68, width: 174, height: 1)
    filet2.backgroundColor = FiletsBackgroundColor
    self.layer.addSublayer(filet2)
    filet3.frame = CGRect(x:18, y: 102, width: 174, height: 1)
    filet3.backgroundColor = FiletsBackgroundColor
    self.layer.addSublayer(filet3)

    label1 = LabelPopup(frame: CGRectMake(18, 0, LargeurPopUpFields - 11, HauteurPopUpFields))
    label1.text = label1String
    self.addSubview(label1)

    label2 = LabelPopup(frame: CGRectMake(18, HauteurPopUpFields, LargeurPopUpFields - 11, HauteurPopUpFields))
    label2.text = label2String
    self.addSubview(label2)

    label3 = LabelPopup(frame: CGRectMake(18, 2*HauteurPopUpFields, LargeurPopUpFields - 11, HauteurPopUpFields))
    label3.text = label3String
    self.addSubview(label3)

    label4 = LabelPopup(frame: CGRectMake(18, 3*HauteurPopUpFields, LargeurPopUpFields - 11, HauteurPopUpFields))
    label4.text = label4String
    self.addSubview(label4)
    }

    if nbreLabels == 3 {
    popLayer.frame = CGRect(x: 18, y: 0, width: 174, height: 102)
    flecheLayer.frame = CGRect(x:0, y: 30, width: 20, height: 21)
    filet2.frame = CGRect(x:18, y: 68, width: 174, height: 1)
    filet2.backgroundColor = FiletsBackgroundColor
    self.layer.addSublayer(filet2)

    label1 = LabelPopup(frame: CGRectMake(18, 0, LargeurPopUpFields - 11, HauteurPopUpFields))
    label1.text = label1String
    self.addSubview(label1)

    label2 = LabelPopup(frame: CGRectMake(18, HauteurPopUpFields, LargeurPopUpFields - 11, HauteurPopUpFields))
    label2.text = label2String
    self.addSubview(label2)

    label3 = LabelPopup(frame: CGRectMake(18, 2*HauteurPopUpFields, LargeurPopUpFields - 11, HauteurPopUpFields))
    label3.text = label3String
    self.addSubview(label3)
    }

    if nbreLabels == 2 {
    popLayer.frame = CGRect(x: 18, y: 0, width: 174, height: 68)
    flecheLayer.frame = CGRect(x:0, y: 15, width: 20, height: 21)

    label1 = LabelPopup(frame: CGRectMake(18, 0, LargeurPopUpFields - 11, HauteurPopUpFields))
    label1.text = label1String
    self.addSubview(label1)

    label2 = LabelPopup(frame: CGRectMake(18, HauteurPopUpFields, LargeurPopUpFields - 11, HauteurPopUpFields))
    label2.text = label2String
    self.addSubview(label2)
    }
    }
    }


    import UIKit

    class LabelPopup: UILabel {
    override init(frame: CGRect) {
    super.init(frame: frame)

    self.backgroundColor = UIColor(red: 255/255, green: 200/255, blue: 0/255, alpha: 0.4)
    self.font = UIFont(name: FontName, size: FontSizeLabels)
    self.textColor = FontColorLabels
    self.textAlignment = .Left
    }

    required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }

    let padding = UIEdgeInsets(top: 0, left: 14, bottom: 0, right: 0)

    override func drawTextInRect(rect: CGRect) {
    let newRect = UIEdgeInsetsInsetRect(rect, padding)
    super.drawTextInRect(newRect)
    }

    override func intrinsicContentSize() -> CGSize {
    var intrinsicContentSize = super.intrinsicContentSize()
    intrinsicContentSize.height += padding.top + padding.bottom
    intrinsicContentSize.width += padding.left + padding.right
    return intrinsicContentSize
    }
    }

      :p


  • Au fait colas_, mes labels étaient déjà  ace UserInteractionEnabled. Et ça fonctionnait nickel lorsqu'ils n'étaient pas dans un parent.


    ​Le problème est (enfin était car maintenant je tape sur le popupparent) que lorsqu'il est dans un parent, il est inaccessible en gesture


     



     


     


    let tapGesturelabel1Regard: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "label1RegardTap:")
    popUpFieldRegard.label1.userInteractionEnabled = true
    popUpFieldRegard.label1.addGestureRecognizer(tapGesturelabel1Regard)

    popUpFieldRegard.label1
Connectez-vous ou Inscrivez-vous pour répondre.