Bibi's DevLog ๐ค๐
UITapGestureRecognizer ํญ ์ ์ค์ฒ ์ธ์๊ธฐ ๋ณธ๋ฌธ
๐ฑ๐ iOS/๐ Apple Developer Documentation
UITapGestureRecognizer ํญ ์ ์ค์ฒ ์ธ์๊ธฐ
๋น๋น bibi 2022. 3. 24. 11:44[iOS, Swift] UITapGestureRecognizer ํญ ์ ์ค์ฒ ์ธ์๊ธฐ
https://cocoacasts.com/swift-fundamentals-working-with-tap-gesture-recognizers-in-swift
UITapGestureRecognizer
ํด๋์ค๋ฅผ ์ด์ฉํด ํญ ์ ์ค์ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ฒ.
import UIKit
class ViewController: UIViewController {
// MARK: - Properties
@IBOutlet private var tappableView: UIView! {
didSet {
tappableView.backgroundColor = .red
}
}
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
}
}
tappableView
ํ๋๋ฅผ ๋ง๋ค๊ณ ์์Main.storyboard
์ ๋ทฐ ํ๋ ๋ง๋ค๊ณ ,tappableView
์ ์ฐ๊ฒฐ- ์๋ฎฌ๋ ์ดํฐ ๋น๋ ๋ฐ ์คํ - ํฐ ๋ฐฐ๊ฒฝ์ ๋นจ๊ฐ ๋ทฐ๊ฐ ์์ด์ผ ํ๋ค.
๋ทฐ์ tap gesture recognizer ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค - ์ฝ๋๋ก ๋๋ ์ธํฐํ์ด์ค ๋น๋๋ก. ๊ฒฐ๊ณผ๋ ๋๊ฐ์ง๋ง ์คํ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค.
1. Interface Builder๋ก ๋ทฐ์ Tap Gesture Recognizer ์ถ๊ฐํ๊ธฐ
Main.storyboard
๋ฅผ ์ด๊ณ Object Library(+๋ฒํผ)์์ tap gesture recognizer๋ฅผ ์๊น ๋ง๋tappableView
์ ์ถ๊ฐํ๋ค.- ์ ์์ ์ผ๋ก ์ถ๊ฐ๋๋ฉด ์ผ์ชฝ์ Document Outline์ ๋ํ๋๋ค.
ViewController.swift
๋ฅผ ์ด๊ณ tap gesture recognizer์ ๋ํ Action์ ์ ์ํ๋ค.- "Action = Interface Builder์ ๋ ธ์ถ๋๋ ๋ฉ์๋๋ฅผ ๋งํจ"
- ํด๋น Action์
UITapGestureRecognizer
๋ผ๋ ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ค.
// MARK: - Actions
@IBAction func didTapView(_ sender: UITapGestureRecognizer) {
print("did tap view", sender)
}
- ๋ค์
Main.storyboard
์ ๊ฐ์ ์ผ์ชฝ Document Outline์์ tap gesture recognizer๋ฅผ ์ ํํ๋ค - ์ค๋ฅธ์ชฝ Connections Inspector๋ฅผ ์ด๊ณ , Sent Actions์ selector์์ Document Outline์
View Controller
๊น์ง ๋๋๊ทธํด ์ฐ๊ฒฐํ๋ค. didTapView(_:)
Action์ด ๋ํ๋๋ฉด ํด๋ฆญํด ์ฐ๊ฒฐํ๋ค.- ๋ค์ ๋น๋ํ๊ณ ์คํํ ๋ค ๋นจ๊ฐ ๋ทฐ๋ฅผ ํด๋ฆญํ๋ฉด, ์ฝ์ ์ฐฝ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
- tap gesture recognizer ์ฐ๊ฒฐ์ด ์ ๋ ๊ฒ!
์ฝ๋๋ก Tap Gesture Recognizer ์ถ๊ฐํ๊ธฐ
๋จผ์ ์์์ ์ค์ตํ Interface Builder์ tap gesture recognizer๋ฅผ ์ญ์ ํ๋ค.
- ViewCotnroller.swift์์
viewDidLoad()
๋ฉ์๋๋ฅผ ์ฐพ๋๋ค. UITapGestureRecognizer
์ธ์คํด์ค๋ฅผinit(target:action:)
๋ฉ์๋๋ฅผ ํธ์ถํด ์ด๊ธฐํํ๋ค.target
์ ๋ทฐ์ปจํธ๋กค๋ฌ,action
์ ์๊น ์ ์ํdidTapView(_:)
๋ก ์ ์ํ๋ค.
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
// Initialize Tap Gesture Recognizer
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapView(_:)))
}
// MARK: - Actions
@objc func didTapView(_ sender: UITapGestureRecognizer) {
print("did tap view", sender)
}
- โ
์ฝ๋๋ก ๊ตฌํํ ๋๋ InterfaceBuilder๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์
@IBAction
์ด๋ผ๋ ์์ฑ์ด ํ์๊ฐ ์๋ค. ๋์@objc
๋ผ๋ ์์ฑ์ด ํ์ํ๋ค.@objc
๋ผ๋ ์์ฑ์ ๊ทธ ๋ฉ์๋๊ฐ Objective-C ์ ์คํ์๊ฐ์ ๋ ธ์ถ๋๋๋ก ํ๋ค. ์์ธํ ๊ฑด ๋์ค์ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ..@objc
์์ฑ์ ๋นผ๋จน์ผ๋ฉด ์ปดํ์ผ๋ฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค -Argument of '#selector' refers to instance method 'didTapView' that is not exposed to Objective-C
- ๋ง์ง๋ง์ผ๋ก tap gesture recognizer๋ฅผ ์ฝ๋๋ก ๋ทฐ์ ์ถ๊ฐํด์ผ ํ๋ค.
tappableView
์addGuestureRecognizer(_:)
๋ฅผ ํธ์ถํ๊ณ , ๋งค๊ฐ๋ณ์๋ก tap gesture recognizer๋ฅผ ๋๊ธด๋ค.
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
// Initialize Tap Gesture Recognizer
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapView(_:)))
// Add Tap Gesture Recognizer
tappableView.addGestureRecognizer(tapGestureRecognizer)
}
- ๋น๋ ํ ์คํํด ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ํ์ธํ๋ค.
TapGestureRecognizer๋ก ๋๋ธ ํญ ๊ฐ์งํ๊ธฐ
tap gesture recognizer๋ ์ฑ๊ธ ํญ, ๋๋ธ ํญ, ํธ๋ฆฌํ ํญ์ ๊ฐ์งํ ์ ์๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ฑ๊ธ ํญ์ ๊ฐ์งํ๋ค)
์ฑ๊ธ ํญ์ด ์๋ ๋๋ธ ํญ์ ๊ฐ์งํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
viewDidLoad()
์์tapGestureRecognizer
์.numberOfTapsRequired
๋ฅผ 2๋ก ์ค์ ํ๋ค.
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
// Initialize Tap Gesture Recognizer
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapView(_:)))
// Configure Tap Gesture Recognizer
tapGestureRecognizer.numberOfTapsRequired = 2
// Add Tap Gesture Recognizer
tappableView.addGestureRecognizer(tapGestureRecognizer)
}
- ๋น๋ ํ ์คํํด ์ฑ๊ธ ํญ์ด ์๋ ๋๋ธ ํญ์๋ง
didTapView(_:)
๋ฉ์๋๊ฐ ์คํ๋๋์ง ํ์ธํ๋ค.