[swift] PeekPop을 사용한 앱의 제스처 기능 구현 방법

애플은 3D Touch 기술을 도입하여 사용자들에게 다양한 인터랙션을 제공하고 있습니다. PeekPop은 3D Touch를 활용하여 터치로 다른 화면을 미리보거나 해당 화면을 팝업으로 열 수 있는 기능입니다. 이번 블로그 포스트에서는 PeekPop을 사용하여 앱 내에서 제스처 기능을 구현하는 방법에 대해 알아보겠습니다.

1. 준비하기

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)
}
  1. 제스처 기능 추가하기 이제 두 번째 뷰 컨트롤러에서 사용자가 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을 활용해보세요!

참고 자료