Do it! 스위프트로 아이폰 앱 만들기
18장 스와이프 제스처 사용하기
- 빈 스토리보드에 Horizontal Stack View 배치하기
- [Add New Constraints] 에서 왼쪽:16, 오른쪽:16 으로 설정하기
- [Align] -> [Vertically in Container] = 0 으로 설정하기
- 세로 스택 뷰 안에 Image View, Vertical Stack View, Image View 배치하기
- 가로 스택 뷰 안에 Image View 2개 배치하기
- 가로 스택 뷰를 선택하고 [Attributes inspector] -> [Distribution] -> [Fill Equally] 선택하기
- 모든 이미지 뷰를 선택하고 [Add New Constraints] -> [Height] = 72 로 설정하기
각 이미지 뷰에 이미지 설정하기
import UIKit
class ViewController: UIViewController {
@IBOutlet var imgViewUp: UIImageView!
@IBOutlet var imgViewLeft: UIImageView!
@IBOutlet var imgViewRight: UIImageView!
@IBOutlet var imgViewDown: UIImageView!
var imgUp = [UIImage]()
var imgDown = [UIImage]()
var imgLeft = [UIImage]()
var imgRight = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imgUp.append(UIImage(named: "./images/arrow-up-black.png")!)
imgUp.append(UIImage(named: "./images/arrow-up-red.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-black.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-red.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-black.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-red.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-black.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-red.png")!)
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewLeft.image = imgLeft[0]
imgViewRight.image = imgRight[0]
- 이미지 배열 선언하기
- 이미지 배열에 이미지 할당하기
- 이미지 뷰에 이미지 할당하기
override func viewDidLoad() {
super.viewDidLoad()
...
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeUp.direction = UISwipeGestureRecognizer.Direction.up
self.view.addGestureRecognizer(swipeUp)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeDown.direction = UISwipeGestureRecognizer.Direction.down
self.view.addGestureRecognizer(swipeDown)
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
self.view.addGestureRecognizer(swipeLeft)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
self.view.addGestureRecognizer(swipeRight)
}
@objc func respondToSwipeGesture(_ gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewLeft.image = imgLeft[0]
imgViewRight.image = imgRight[0]
switch swipeGesture.direction {
case UISwipeGestureRecognizer.Direction.up:
imgViewUp.image = imgUp[1]
case UISwipeGestureRecognizer.Direction.down:
imgViewDown.image = imgDown[1]
case UISwipeGestureRecognizer.Direction.left:
imgViewLeft.image = imgLeft[1]
case UISwipeGestureRecognizer.Direction.right:
imgViewRight.image = imgRight[1]
default:
break
}
}
}
}
- 스와이프 제스처 등록하기
- 스와이프 제스처에 대한 액션 메소드 구현하기
let numOfTouches = 2
override func viewDidLoad() {
super.viewDidLoad()
...
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeUp.direction = UISwipeGestureRecognizer.Direction.up
swipeUp.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeUp)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeDown.direction = UISwipeGestureRecognizer.Direction.down
swipeDown.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeDown)
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
swipeLeft.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeLeft)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
swipeRight.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeRight)
}
- 상수 선언하기
- 스와이프 인식에 필요한 터치 개수 설정하기
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imgUp.append(UIImage(named: "./images/arrow-up-black.png")!)
imgUp.append(UIImage(named: "./images/arrow-up-red.png")!)
imgUp.append(UIImage(named: "./images/arrow-up-green.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-black.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-red.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-green.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-black.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-red.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-green.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-black.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-red.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-green.png")!)
이미지 배열에 이미지 추가하기
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeUp.direction = UISwipeGestureRecognizer.Direction.up
self.view.addGestureRecognizer(swipeUp)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeDown.direction = UISwipeGestureRecognizer.Direction.down
self.view.addGestureRecognizer(swipeDown)
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
self.view.addGestureRecognizer(swipeLeft)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
self.view.addGestureRecognizer(swipeRight)
let swipeUpMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeUpMulti.direction = UISwipeGestureRecognizer.Direction.up
swipeUpMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeUpMulti)
let swipeDownMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeDownMulti.direction = UISwipeGestureRecognizer.Direction.down
swipeDownMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeDownMulti)
let swipeLeftMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeLeftMulti.direction = UISwipeGestureRecognizer.Direction.left
swipeLeftMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeLeftMulti)
let swipeRightMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeRightMulti.direction = UISwipeGestureRecognizer.Direction.right
swipeRightMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeRightMulti)
}
@objc func respondToSwipeGestureMulti(_ gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewLeft.image = imgLeft[0]
imgViewRight.image = imgRight[0]
switch swipeGesture.direction {
case UISwipeGestureRecognizer.Direction.up:
imgViewUp.image = imgUp[2]
case UISwipeGestureRecognizer.Direction.down:
imgViewDown.image = imgDown[2]
case UISwipeGestureRecognizer.Direction.left:
imgViewLeft.image = imgLeft[2]
case UISwipeGestureRecognizer.Direction.right:
imgViewRight.image = imgRight[2]
default:
break;
}
}
}
}
- 기존 스와이프 제스처의 numberOfTouchesRequired 코드 삭제하기
- 다중 스와이프 제스처 등록하기
- numberOfTouchesRequired 설정하기
- 다중 스와이프 제스처에 대한 액션 메소드 구현하기
import UIKit
class ViewController: UIViewController {
@IBOutlet var imgViewUp: UIImageView!
@IBOutlet var imgViewLeft: UIImageView!
@IBOutlet var imgViewRight: UIImageView!
@IBOutlet var imgViewDown: UIImageView!
var imgUp = [UIImage]()
var imgDown = [UIImage]()
var imgLeft = [UIImage]()
var imgRight = [UIImage]()
let numOfTouches = 2
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imgUp.append(UIImage(named: "./images/arrow-up-black.png")!)
imgUp.append(UIImage(named: "./images/arrow-up-red.png")!)
imgUp.append(UIImage(named: "./images/arrow-up-green.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-black.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-red.png")!)
imgDown.append(UIImage(named: "./images/arrow-down-green.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-black.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-red.png")!)
imgLeft.append(UIImage(named: "./images/arrow-left-green.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-black.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-red.png")!)
imgRight.append(UIImage(named: "./images/arrow-right-green.png")!)
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewLeft.image = imgLeft[0]
imgViewRight.image = imgRight[0]
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeUp.direction = UISwipeGestureRecognizer.Direction.up
self.view.addGestureRecognizer(swipeUp)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeDown.direction = UISwipeGestureRecognizer.Direction.down
self.view.addGestureRecognizer(swipeDown)
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
self.view.addGestureRecognizer(swipeLeft)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
self.view.addGestureRecognizer(swipeRight)
let swipeUpMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeUpMulti.direction = UISwipeGestureRecognizer.Direction.up
swipeUpMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeUpMulti)
let swipeDownMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeDownMulti.direction = UISwipeGestureRecognizer.Direction.down
swipeDownMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeDownMulti)
let swipeLeftMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeLeftMulti.direction = UISwipeGestureRecognizer.Direction.left
swipeLeftMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeLeftMulti)
let swipeRightMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))
swipeRightMulti.direction = UISwipeGestureRecognizer.Direction.right
swipeRightMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeRightMulti)
}
@objc func respondToSwipeGesture(_ gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewLeft.image = imgLeft[0]
imgViewRight.image = imgRight[0]
switch swipeGesture.direction {
case UISwipeGestureRecognizer.Direction.up:
imgViewUp.image = imgUp[1]
case UISwipeGestureRecognizer.Direction.down:
imgViewDown.image = imgDown[1]
case UISwipeGestureRecognizer.Direction.left:
imgViewLeft.image = imgLeft[1]
case UISwipeGestureRecognizer.Direction.right:
imgViewRight.image = imgRight[1]
default:
break
}
}
}
@objc func respondToSwipeGestureMulti(_ gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewLeft.image = imgLeft[0]
imgViewRight.image = imgRight[0]
switch swipeGesture.direction {
case UISwipeGestureRecognizer.Direction.up:
imgViewUp.image = imgUp[2]
case UISwipeGestureRecognizer.Direction.down:
imgViewDown.image = imgDown[2]
case UISwipeGestureRecognizer.Direction.left:
imgViewLeft.image = imgLeft[2]
case UISwipeGestureRecognizer.Direction.right:
imgViewRight.image = imgRight[2]
default:
break;
}
}
}
}
import UIKit
var images = ["01", "02", "03", "04", "05", "06"]
class ViewController: UIViewController {
@IBOutlet var imgView: UIImageView!
@IBOutlet var pageControl: UIPageControl!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
pageControl.numberOfPages = images.count
pageControl.currentPage = 0
pageControl.pageIndicatorTintColor = UIColor.lightGray
pageControl.currentPageIndicatorTintColor = UIColor.darkGray
imgView.image = UIImage(named: images[0])
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
self.view.addGestureRecognizer(swipeLeft)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
self.view.addGestureRecognizer(swipeRight)
}
@IBAction func pageChange(_ sender: UIPageControl) {
imgView.image = UIImage(named: images[pageControl.currentPage])
}
@objc func respondToSwipeGesture(_ gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
switch swipeGesture.direction {
case UISwipeGestureRecognizer.Direction.left:
pageControl.currentPage += 1
pageChange(pageControl)
case UISwipeGestureRecognizer.Direction.right:
pageControl.currentPage -= 1
pageChange(pageControl)
default:
break
}
}
}
}