【Swift】 탭했을 때 추종해 오는 View를 작성한다

소개



이러한 느낌으로, 탭한 위치에 추종해 오는 View를 작성하고 싶습니다.


구현



copipe로 만들 수 있습니다.
final class ViewController: UIViewController {

    private var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        myView = UIView()
        myView.frame.size = CGSize(width: 100, height: 100)
        myView.center = self.view.center
        myView.backgroundColor = .red
        myView.isUserInteractionEnabled = true
        self.view.addSubview(myView)

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if touches.first!.view == self.view {
            let after = touches.first!.location(in: self.view)
            let before = myView.center
            let deltaX = after.x - before.x
            let deltaY = after.y - before.y
            UIView.animate(withDuration: 0.3) {
                self.myView.transform = CGAffineTransform(translationX: deltaX, y: deltaY)
            }
        }
    }

}

해설


touchesBegan 는 탭했을 때 호출되는 메소드입니다. ( touchesBegan )

가장 먼저 탭한 부분의 좌표를 가져옵니다. 이것이 View의 목적지 좌표입니다.
let after = touches.first!.location(in: self.view)

이동 전 뷰의 좌표도 가져와야 합니다.
let before = myView.center

x와 y의 변화량을 각각 구합니다. (변화량이라고 하는 것은, 어느 정도 값이 증감했는지를 나타내는 것입니다)
예를 들어, 이동 전의 좌표 (10, 300)에서 이동 후의 좌표 (30, 200)로 이동 한 경우의 x와 y의 변화량 Δx, Δy는
Δx = 30 - 10 = 20
Δy = 200 - 300 = -100
따라서 변화량은 (20, -100)입니다.
let deltaX = after.x - before.x
let deltaY = after.y - before.y

그리고, 구한 변화량이 View가 이동해야 할 이동량이 되므로, CGAffineTransform로 애니메이션 첨부로 이동시켜 드리겠습니다. ( CGAffineTransform )
UIView.animate(withDuration: 0.3) {
    self.myView.transform = CGAffineTransform(translationX: deltaX, y: deltaY)
}

결론



끝입니다.

좋은 웹페이지 즐겨찾기