web-dev-qa-db-fra.com

Mettre à jour la position de UIImageView Swift

J'essaie de créer une image déplaçable (singe) à la place d'une autre image déplaçable (banane) lorsque j'appuie sur un bouton. 

Jusqu'à présent, j'ai pu obtenir les coordonnées de la banane et les stocker en tant que nouvelles coordonnées x, y du singe. Cependant, la vue ne se met pas à jour et le singe ne se déplace pas vers son nouvel emplacement. 

Je suis sûr que je dois mettre à jour la vue, mais je ne peux pas le comprendre. J'ai essayé d'ajouter une nouvelle sous-vue (self.view.addSubview (monkey)), mais lorsque je le fais, c'est la vue entière qui est réinitialisée et le singe et la banane reviennent à leurs coordonnées d'origine. 

Voici le code du bouton d'action: 

@IBAction func getCoordinates (sender : AnyObject) {
    var bananax = banana.frame.Origin.x
    var bananay = banana.frame.Origin.y

    var monkeyx = monkey.frame.Origin.x
    var monkeyy = monkey.frame.Origin.y
    println("Banana : \(bananax) et \(bananay)")
    println("Monkey's default coordinates : \(monkeyx) et \(monkeyy)")


    monkeyx = bananax
    monkeyy = bananay
    println("Monkey's new coordinates : \(monkeyx) et \(monkeyy)")
}

Une idée sur la façon de mettre à jour uniquement le singe et de ne pas réinitialiser la vue entière?

Merci :)

9

Ces valeurs sont simplement supprimées lorsque vous définissez monkeyx et monkeyy ci-dessous.

var monkeyx = monkey.frame.Origin.x
var monkeyy = monkey.frame.Origin.y

L'affectation des valeurs ci-dessous affecte uniquement les valeurs d'une variable locale à une autre. Cela ne change pas réellement les coordonnées pour monkey.

monkeyx = bananax
monkeyy = bananay

Vous devez définir les nouvelles coordonnées sur monkey en construisant une nouvelle variable CGRect et en affectant la variable monkey à frame:

monkey.frame = CGRect(x: bananax, y: bananay, width: monkey.frame.size.width, height: monkey.frame.size.height)

Comme vous définissez simplement Origin de monkey sur banana, vous pouvez supprimer toutes les déclarations var et les réduire à une ligne en construisant le nouveau cadre de monkey avec la taille de monkey et son origine de banana:

monkey.frame = CGRect(Origin: banana.frame.Origin, size: monkey.frame.size)
20
BergQuester

Salut créer cela s'étend si vous voulez. Pour Swift

Create File Extends.Swift et ajouter ce code

/**
    Extension UIView
    by DaRk-_-D0G
*/
extension UIView {
    /**
    Set x Position

    :param: x CGFloat
    by DaRk-_-D0G
    */
    func setX(#x:CGFloat) {
        var frame:CGRect = self.frame
        frame.Origin.x = x
        self.frame = frame
    }
    /**
    Set y Position

    :param: y CGFloat
    by DaRk-_-D0G
    */
    func setY(#y:CGFloat) {
        var frame:CGRect = self.frame
        frame.Origin.y = y
        self.frame = frame
    }
    /**
    Set Width

    :param: width CGFloat
    by DaRk-_-D0G
    */
    func setWidth(#width:CGFloat) {
        var frame:CGRect = self.frame
        frame.size.width = width
        self.frame = frame
    }
    /**
    Set Height

    :param: height CGFloat
    by DaRk-_-D0G
    */
    func setHeight(#height:CGFloat) {
        var frame:CGRect = self.frame
        frame.size.height = height
        self.frame = frame
    }
}

For Use (hérite de UIView)

inheritsOfUIView.setX(x: 100)
button.setX(x: 100)
view.setY(y: 100)
5
YannickSteph

Maintenant tu peux faire

monkey.frame.Origin = banana.frame.Origin
1
Dmitry Kozlov

Si vous utilisez UIImageView pour singe et banane, vous pouvez le simplifier en procédant comme suit:

monkey.center = banana.center

Comprenez qu'il y a une différence entre l'origine et le centre. Voir plus ici:

Le cadre d'UIView, limites, centre, origine, quand utiliser quoi?

mais sur la base de la question, je pense que le centre devrait bien fonctionner et il est plus simple.

0
caesss