Search code examples
iosswifttouchesbegan

I want to move the image left and right only


I want to move this boat image with touches. It needs to move only left and right but not up and down. The problem is with this basic code setup, The image is moving all around.

I have the following code

import UIKit

class ViewController: UIViewController {

var boat:UIImageView!
var stone:UIImageView!

@IBOutlet weak var myView: UIView!
var location = CGPoint(x: 0, y: 0)

func start() {

boat = UIImageView(image: UIImage(named: "boat"))
boat.frame = CGRect(x: 0, y: 0, width: 60, height: 90)
boat.frame.origin.y = self.view.bounds.height - boat.frame.size.height - 10
boat.center.x = self.view.bounds.midX

self.view.addSubview(boat)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    start()
    movingStone()
    intersectsAt()



}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch : UITouch = touches.first as UITouch!

    location = touch.location(in: self.view)
    boat.center = location


}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch : UITouch = touches.first as UITouch!
       location = touch.location(in: self.view)

    boat.center = location
}

func movingStone() {


    stone = UIImageView(image: UIImage(named: "stones.png"))
    stone.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
    var stone2 = 10 + arc4random() % 20

    stone.bounds = CGRect(x:10, y:10, width:40.0, height:40.0)
    stone.contentMode = .center;
    stone.layer.position = CGPoint(x: Int(stone2), y: 10)
    stone.transform = CGAffineTransform(rotationAngle: 3.142)


    self.view.insertSubview(stone, aboveSubview: myView)



    UIView.animate(withDuration: 5, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: { () -> Void in
        self.stone.frame.origin.y = self.view.bounds.height + self.stone.frame.height + 10
    }) { (success:Bool) -> Void in

        self.stone.removeFromSuperview()
        self.movingStone()

    }



}
func intersectsAt() {


  if(boat.layer.presentation()?.frame.intersects
((stone.layer.presentation()?.frame)!))! {
            boat.image = UIImage(named: "wreckboat.png")

        }

    }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

Solution

  • You need to update only the x coordinate of the image not the y coordinate.

    Try this:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch : UITouch = touches.first as UITouch!
        let loc_tmp = touch.location(in: self.view)
    
        // only use the x coordinate of the touch location
        location = CGPoint(x: loc_tmp.x, y: boat.center.y)
        boat.center = location
    
    
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch : UITouch = touches.first as UITouch!
        let loc_tmp = touch.location(in: self.view)
    
        // only use the x coordinate of the touch location
        location = CGPoint(x: loc_tmp.x, y: boat.center.y)
        boat.center = location
    }