[swift] Swift Koloda를 사용하여 카드 페이드 인/아웃 효과 추가하기

이번 글에서는 iOS 앱 개발에서 카드 페이드 인/아웃 효과를 구현하는 방법에 대해 알아보겠습니다. 이를 위해 Swift Koloda라는 라이브러리를 사용할 것입니다. Swift Koloda는 Tinder와 같은 스와이프 기반 인터페이스를 쉽게 구현할 수 있도록 도와주는 라이브러리입니다.

1. Swift Koloda 설치하기

먼저, Swift Koloda를 설치해야 합니다. 다음과 같이 CocoaPods를 사용하여 프로젝트에 Swift Koloda를 추가해주세요.

pod 'Koloda'

그런 다음, 터미널에서 pod install을 실행하여 CocoaPods를 통해 라이브러리를 설치합니다.

2. 카드 뷰 만들기

카드 페이드 인/아웃 효과를 구현하기 위해 먼저 카드 뷰를 만들어야 합니다. 이는 정해진 형식에 맞춰서 뷰를 구성하는 방법입니다.

class CardView: UIView {
    
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        // 카드 뷰 설정
        self.layer.cornerRadius = 10
        self.layer.masksToBounds = true
        self.layer.borderWidth = 1
        self.layer.borderColor = UIColor.lightGray.cgColor
    }
}

위 코드에서는 CardView 클래스를 만들고, imageViewnameLabel을 IBOutlet으로 설정했습니다. 또한, awakeFromNib() 메서드를 사용하여 카드 뷰의 모양을 설정했습니다.

3. KolodaView 구성하기

이제 KolodaView를 만들고, 앞서 만든 CardView를 이용하여 카드들을 표시하는 방법을 알아보겠습니다.

class ViewController: UIViewController, KolodaViewDelegate, KolodaViewDataSource {

    @IBOutlet weak var kolodaView: KolodaView!
    var cardData: [CardModel] = []  // 카드 데이터

    override func viewDidLoad() {
        super.viewDidLoad()
        
        kolodaView.delegate = self
        kolodaView.dataSource = self

        // 카드 데이터 설정
        cardData = [CardModel(image: UIImage(named: "image1"), name: "Card 1"),
                    CardModel(image: UIImage(named: "image2"), name: "Card 2"),
                    CardModel(image: UIImage(named: "image3"), name: "Card 3"),
                    CardModel(image: UIImage(named: "image4"), name: "Card 4")]

        kolodaView.reloadData()
    }

    // MARK: - KolodaViewDelegate

    func kolodaDidRunOutOfCards(_ koloda: KolodaView) {
        // 카드가 모두 소진될 경우 작업 수행
    }

    // MARK: - KolodaViewDataSource

    func kolodaNumberOfCards(_ koloda: KolodaView) -> Int {
        return cardData.count
    }
    
    func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
        let cardView = CardView()
        cardView.imageView.image = cardData[index].image
        cardView.nameLabel.text = cardData[index].name
        return cardView
    }
}

struct CardModel {
    let image: UIImage?
    let name: String
}

위 코드에서는 ViewController 클래스에 KolodaViewDelegate와 KolodaViewDataSource를 채택하여 delegate와 dataSource를 설정하였습니다. 또한, cardData 배열에 CardModel 객체들을 설정한 후, kolodaView.reloadData()를 호출하여 카드 뷰를 표시합니다.

4. 페이드 인/아웃 효과 추가하기

카드 뷰를 터치하거나 스와이프할 때 페이드 인/아웃 효과를 추가하려면 아래 코드를 추가해야 합니다.

// MARK: - KolodaViewDelegate

func koloda(_ koloda: KolodaView, didSwipeCardAt index: Int, in direction: SwipeResultDirection) {
    // 카드가 스와이프 될 때마다 수행할 작업
    switch direction {
    case .left:
        // 왼쪽으로 스와이프 되었을 때의 작업
        UIView.animate(withDuration: 0.3) {
            koloda.visibleCards[0].alpha = 0.5
        }
    case .right:
        // 오른쪽으로 스와이프 되었을 때의 작업
        UIView.animate(withDuration: 0.3) {
            koloda.visibleCards[0].alpha = 0.5
        }
    default:
        break
    }
}

func koloda(_ koloda: KolodaView, didShowCardAt index: Int) {
    // 카드가 표시될 때마다 수행할 작업
    UIView.animate(withDuration: 0.3) {
        koloda.visibleCards[0].alpha = 1.0
    }
}

func koloda(_ koloda: KolodaView, didDragCardAt index: Int, withOffset offset: CGPoint) {
    // 카드를 드래그할 때마다 수행할 작업
    let percentage = min(abs(offset.x) / koloda.frame.width, 1.0)
    kolodaView.visibleCards[0].alpha = 1.0 - percentage * 0.5
}

위 코드에서는 koloda(_:didSwipeCardAt:), koloda(_:didShowCardAt:), koloda(_:didDragCardAt:withOffset:) 메서드를 사용하여 카드가 스와이프되거나 표시될 때 애니메이션을 추가합니다. 이를 통해 카드가 페이드 인/아웃 효과를 가지게 됩니다.

이상으로 Swift Koloda를 사용하여 카드 페이드 인/아웃 효과를 추가하는 방법에 대해 알아보았습니다. 많은 활용을 바라며 좋은 결과물을 만들어보세요!