Pan Gesture 사용 - 2

Yoon Yeoung-jin·2022년 3월 26일
0

iOS 개발

목록 보기
7/11

  • Pan Gesture 사용-1에서 더 나아가 화면 밖을 벗어났을 경우 다시 돌아오게 하는 설정과 움직이는 축 제한하는 부분을 추가하였다.

  • ViewController.swift

//
//  ViewController.swift
//  panGesture
//
//  Created by yoon-yeoungjin on 2022/03/26.
//

import UIKit

/*
  제한할 축 enum 선언
 */
enum dtype{
    case x
    case y
    case none
}

class ViewController: UIViewController {
    
    var dragTyep = dtype.none
    let myView = DraggbleView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        myView.center = self.view.center
        myView.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
        myView.backgroundColor = .red
        self.view.addSubview(myView)
        // Do any additional setup after loading the view.
    }
    
    /*
     segmentedControl 스위치에 따라서 어떤 축을 제한할 건지 셋팅하고 이를 draggbleView 클래스에 전달한다. 
     */
    @IBAction func selectPanType(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            dragTyep = .x
        case 1:
            dragTyep = .y
        case 2:
            dragTyep = .none
        default:
            break
        }
        
        myView.dragType = self.dragTyep
    }
    
}
  • DraggbleView.swift
//
//  DraggbleView.swift
//  panGesture
//
//  Created by yoon-yeoungjin on 2022/03/26.
//

import Foundation
import UIKit

class DraggbleView: UIView {
    
    var dragType = dtype.none
    
    override init(frame: CGRect) {
        super.init(frame: CGRect.zero)
        let pan = UIPanGestureRecognizer(target: self, action: #selector(dragging))
        self.addGestureRecognizer(pan)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    @objc func dragging(pan: UIPanGestureRecognizer){
        switch pan.state {
        case .began:
            print("began pan gesture")
        case .changed:
            let delta = pan.translation(in: self.superview)
            var myPosition = self.center
            
            /**
             제한한 축만 움직힐 수 있도록 셋팅
             */
            if dragType == .x {
                myPosition.x += delta.x
            } else if dragType == .y {
                myPosition.y += delta.y
            } else if dragType == .none {
                myPosition.x += delta.x
                myPosition.y += delta.y
            } else {
                print("[ERROR] none dtype")
                exit(1)
            }
            print("x : ", myPosition.x, " y: ", myPosition.y)
            self.center = myPosition
            pan.setTranslation(CGPoint.zero, in: self.superview)
        case .ended, .cancelled:
            print("end pan gesture")
            
            /**
             화면 밖을 넘어가면 다시 돌아오게 셋팅
             */
            if self.frame.minX < 0 {
                self.frame.origin.x = 0
            }
            if self.frame.maxX > (self.superview?.frame.maxX ?? 0) {
                if let hasSuperView = self.superview {
                    self.frame.origin.x = hasSuperView.frame.maxX - self.bounds.width
                }
            }
            
            if self.frame.minY < 126 {
                self.frame.origin.y = 126
            }
            if self.frame.maxY > (self.superview?.frame.maxY ?? 0) {
                if let hasSuperViewY = self.superview {
                    self.frame.origin.y = hasSuperViewY.frame.maxY - self.bounds.width
                }
            }
        @unknown default:
            print("err")
        }
    }
}
  • 구동 화면
profile
신기한건 다 해보는 사람

0개의 댓글