[swift] PeekPop을 사용한 앱의 제스처 기능 구현 방법
애플은 3D Touch 기술을 도입하여 사용자들에게 다양한 인터랙션을 제공하고 있습니다. PeekPop은 3D Touch를 활용하여 터치로 다른 화면을 미리보거나 해당 화면을 팝업으로 열 수 있는 기능입니다. 이번 블로그 포스트에서는 PeekPop을 사용하여 앱 내에서 제스처 기능을 구현하는 방법에 대해 알아보겠습니다.
1. 준비하기
- Xcode에서 새로운 프로젝트를 생성합니다.
- 적절한 이미지나 컨텐츠를 포함한 첫 번째 뷰 컨트롤러를 생성합니다.
- PeekPop을 사용할 두 번째 뷰 컨트롤러를 생성합니다.
2. PeekPop 설정하기
먼저, PeekPop을 사용할 두 번째 뷰 컨트롤러의 클래스에 UIViewControllerPreviewingDelegate
프로토콜을 채택합니다.
class SecondViewController: UIViewController, UIViewControllerPreviewingDelegate {
}
다음으로, 뷰 컨트롤러의 viewDidLoad()
메소드에서 PeekPop을 설정합니다. registerForPreviewing(with:sourceView:)
메소드를 사용하여 뷰 컨트롤러와 연결하고, Peek(미리보기) 및 Pop(팝업)을 위한 뷰를 설정합니다.
override func viewDidLoad() {
super.viewDidLoad()
// PeekPop을 위한 모션 등록
if traitCollection.forceTouchCapability == .available {
registerForPreviewing(with: self, sourceView: view)
}
}
// PeekPop을 위한 Delegate 메소드
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = tableView.indexPathForRow(at: location), let cell = tableView.cellForRow(at: indexPath) else {
return nil
}
// 미리보기할 뷰 컨트롤러 반환
let detailViewController = DetailViewController()
detailViewController.preferredContentSize = CGSize(width: 0, height: 300)
previewingContext.sourceRect = cell.frame
return detailViewController
}
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
// 팝업할 뷰 컨트롤러 열기
navigationController?.pushViewController(viewControllerToCommit, animated: true)
}
- 제스처 기능 추가하기 이제 두 번째 뷰 컨트롤러에서 사용자가 PeekPop을 사용할 수 있도록 제스처 기능을 추가해보겠습니다.
override func viewDidLoad() {
super.viewDidLoad()
// Long Press Gesture Recognizer 생성
let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress(_:)))
view.addGestureRecognizer(longPressGestureRecognizer)
}
@objc func didLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
if gestureRecognizer.state == .began {
// 제스처가 시작되면 PeekPop 실행
if let previewingContext = self.previewingContext {
previewingContext.previewingGestureRecognizerForFailureRelationship.isEnabled = false
self.previewingContext(previewingContext, commit: previewingContext.viewController)
}
}
}
위 코드에서 didLongPress(_:)
메소드에서는 길게 누른 제스처를 감지하여 PeekPop을 실행합니다. previewingContext()
메소드를 호출하여 Peek에서 Pop으로 전환합니다.
4. 빌드 및 실행
위의 코드를 모두 구현한 후, 앱을 빌드하고 3D Touch 기능을 활용한 제스처를 테스트해보세요. 첫 번째 뷰 컨트롤러에서 두 번째 뷰 컨트롤러로 길게 눌러 Peek하고 더 길게 눌러 Pop되는 것을 확인할 수 있습니다.
이제 앱에서 PeekPop을 사용한 제스처 기능을 구현할 수 있게 되었습니다. 다양한 사용자 경험을 제공하기 위해 PeekPop을 활용해보세요!
참고 자료
- Apple Developer Documentation - Canncels
- Apple Developer Documentation - Pop
- Hacking with Swift - Peek and pop with 3D Touch