Override func paste(itemProviders: [NSItemProvider])

#1

Bonjour à tous.
J’ai besoin d’utiliser les fonctions “Drag and Paste” dans une application iPhone pour copier de multiples imageView “origines”, vers de multiples imageView “cibles”, une par une. Comme j’ai des traitements associés à ces déplacement aléatoires d’images, j’ai besoin que mon code sache d’où est parti le “Drag” de l’imageView " origine" et sur quelle imageView target s’execute le Drop-Paste".
Tout fonctionne bien, sauf 1 point, en ce qui concerne “récupérer” les infos de l’imageView target (coordonnées, tag, …) qui me permettraient d’identifier la target et de donner suite à mes traitements.
Ci dessous la fonction que j’utilise, mais avec une imageView codée en dur : "imageView_yyy"
Mon but serait de récupérer les infos (coordonnées x, y, tag, …) qui me permettent d’identifier la vue aléatoire “target” du “paste” afin de remplacer “imageView_yyy” par le paramètre de la vue target identifiée. Est-ce possible,? je pense que oui puisque Swift réalise le “paste”. Mais quels paramètres utilise-t-il? Merci pour toutes suggestions.

var pasteProgress: Progress?

override func paste(itemProviders: [NSItemProvider]) {
   pasteProgress = itemProviders.first?.loadObject(ofClass: UIImage.self, completionHandler: { (image: NSItemProviderReading?, error: Error?) in
        DispatchQueue.main.async {

        // ...

            self.imageView_yyy.image = image as? UIImage
        }
    })
}
//La variable pasteProgress: Progress? suggérée par stackOverflow ne semble pas régler mon problème.
#2

Bonjour Jean Michel,
je n’ai pas encore utilisé le drag and drop mais je pense que tu dois définir clairement tes destinations possibles. Si ta fonction paste() est définie dans ton contrôleur, alors c’est le contrôleur dans sa globalité qui sert de zone de dépôt et pas forcément les imageViews contenues dans ce contrôleur.
Si tu veux que les images views soient individuellement des zones de dépôts, il te faudrait peut-être créer ta propre classe qui hérite de UIImageView et qui implémente les protocoles de drop.
Ca n’est qu’une supposition car je n’ai personnellement pas utilisé cette API de drag and drop pour le moment

#3

Merci Maxime pour cette réponse rapide. C’est dommage que cela ne semble pas aussi simple pour le “Paste” (au lâché de souris) que lors de l’initiation du “Drag” (clic tenu de souris) qui permet d’obtenir les coordonnées de la view origine grace au paramètre “itemsForBeginning session” (exemple ci-dessous) :
Encore merci et à suivre :slight_smile:

func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {

    let touchPoint = session.location(in: self.view)
    print("\(touchPoint.x)")
    print("\(touchPoint.y)")

    //... grâce aux coordonnées, c'est facile de savoir si l'on est dans une vue appelée viewTaped ci-dessous

    guard let image = viewTaped!.image else { return [] }
    let item = UIDragItem(itemProvider: NSItemProvider(object: image))
    return [item]
}
#4

Bonjour à tous,

Finally, I solved my problem by replacing the solution “paste” by the solution “drop”.
This function proposes, as for the “drag” function, a parameter “session: UIDropSession” which allows to retrieve the information related to the “drop”.
Thank you for your help :smirk:

func dropInteraction (_interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {

let dropLocation = session.location (in: self.view)
print (">>>>>>>>> \ (dropLocation.x) \ (dropLocation.y)")

// … }

return UIDropProposal (operation: operation)
}`

1 Like
#5

Cool! Content que tu aies trouvé la solution :slight_smile: