2017-09-15 2 views
1

J'essaye d'ajouter un geste de robinet à un UIView mais le geste n'est pas reconnu. "IconBadgeView" est un UIView avec une image de taille définie comme passée dans les paramètres.L'événement de geste de tap ne fonctionne pas sur UIView

lazy var cardioVascularIcon : IconBadgeView! = { 

    let iconBadgeView = IconBadgeView(frame: CGRect(x: 0, y: 0, width: 95, height: 95), data:["big":"db_history"]) 

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) 

    tapEvent.numberOfTapsRequired = 1 
    iconBadgeView.translatesAutoresizingMaskIntoConstraints = false 

    iconBadgeView.isUserInteractionEnabled = true  
    iconBadgeView.addGestureRecognizer(tapEvent) 
}() 

Il y a un délégant attaché à la même classe et la fonction est implémentée comme suit:

func loadNewView(sender: UITapGestureRecognizer) { 
    print("Tapped") 
} 

La fonction loadNewView n'est pas appelé. Je ne suis pas sûr de ce qui ne va pas ici dans le code. S'il vous plaît, si quelqu'un peut vous aider.

J'ajoute iconBadgeView au superview comme ci-dessous:

override init(frame: CGRect) { 
    super.init(frame: CGRect.zero) 

    addSubview(cardioVascularIcon) 

    cardioVascularIcon.pinToSuperview([.Top]) 
    cardioVascularIcon.pinToSuperview([.Left], constant: 92) 
    cardioVascularIcon.pinToSuperview([.Right], constant: 92) 
} 
+0

'let tapEvent = UITapGestureRecognizer (cible: auto, action: #selector (loadNewView (expéditeur :))) tapEvent.addTarget (iconBadgeView, action: #selector (loadNewView (expéditeur :))) ' pourquoi êtes-vous répéter vous ici mon ami lol. si vous deviez créer un geste avec un 'constructeur par défaut 'signifiant' UITapGestureRecognizer() 'alors vous devrez fournir votre sélecteur à cette méthode' addTarget', mais puisque vous utilisez le constructeur personnalisé qui prend un sélecteur et une cible avoir cette deuxième ligne de code :) – Lamar

+0

J'ai essayé de supprimer la ligne en double mais cela n'a pas aidé – user2122178

+0

Avez-vous reçu des erreurs/problème? juste par curiosité avez-vous ajouté ce 'iconBadgeView' dans votre superView? aussi puisque vous désactivez 'translateAutoresizingMaskIntoConstraints' assurez-vous que vous ajoutez ces contraintes si maintenant vous pensez que vous voyez dans sur l'écran et ce n'est pas :) – Lamar

Répondre

1

J'ai obtenu une solution de contournement pour le problème. J'ai utilisé un bouton au lieu d'une étiquette et les choses fonctionnent très bien maintenant. Voici le code que je utilise:

func createButton (buttonWidth : CGFloat?, buttonTitle : String?, buttonFont : UIFont?, imageName : String?, buttonColor : UIColor?) -> UIButton { 
    let newButton = UIButton(type: . custom) 
    newButton.showsTouchWhenHighlighted = false 
    newButton.translatesAutoresizingMaskIntoConstraints = false 
    newButton.adjustsImageWhenHighlighted = false 

    if let title = buttonTitle { 
     newButton.setTitle(title, for: .normal) 
    } 
    if let color = buttonColor { 
     if let _ = newButton.titleLabel { 
      newButton.setTitleColor(color, for: .normal) 
     } 
    } 

    if let btnWidth = buttonWidth { 
     newButton.frame = CGRect(x: 0, y: 0, width: btnWidth, height: btnWidth) 
     newButton.layer.cornerRadius = 0.5 * newButton.bounds.size.width 
     newButton.clipsToBounds = true 
    } 
    if let img = imageName { 
     newButton.setImage(UIImage(named: img), for: .normal) 
    } 
    if let font = buttonFont { 
     newButton.titleLabel?.font = font 
    } 

    return newButton 
} 
let addDiagButton = self.createButton(buttonWidth: nil, buttonTitle: addButtonTitle, buttonFont: UIFont.regularDisplayOfSize(30), imageName: nil, buttonColor: UIColor(red: 111, green: 160, blue: 186)) 

addDiagButton.addTarget(self, action: #selector(addDiag(sender:)), for: .touchUpInside) 

Le code ci-dessus a une fonction commune qui crée un bouton et se fixe également l'événement déclencheur avec elle. Le code fonctionne très bien. Pour le faire se comporter comme un clic d'étiquette, j'ai ajouté une ligne dans la fonction createButton (0).

newButton.adjustsImageWhenHighlighted = false

Cela limitera l'effet flash du bouton lorsque vous cliquez dessus.

0

Votre iconBadgeView disparaître, car elle est variable locale.

Vous devez init cardioVascularIcon var.

lazy var cardioVascularIcon : IconBadgeView! = { 

    cardioVascularIcon.frame = CGRect(x: 0, y: 0, width: 95, height: 95) 
    //here call function which sets data property 

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) 

    tapEvent.numberOfTapsRequired = 1 
    cardioVascularIcon.translatesAutoresizingMaskIntoConstraints = false 

    cardioVascularIcon.isUserInteractionEnabled = true  
    cardioVascularIcon.addGestureRecognizer(tapEvent) 
}() 
+0

Salut merci pour la réponse mais j'ai peur que cela n'a pas fonctionné. – user2122178

+0

C'est la vue visible à l'écran? Il manque un code qui ajoute cette nouvelle vue pour afficher la hiérarchie. – Dan

+0

Oui, la vue est visible sur l'écran. – user2122178