[swift] 터치 이벤트 처리를 위한 UIButton에서의 UIResponder 사용법

UIKit에서는 사용자의 터치 이벤트를 처리하기 위해 UIResponder 클래스를 사용합니다. UIButtonUIResponder를 상속받아 터치 이벤트를 처리할 수 있습니다. 이번 블로그에서는 UIButton에서의 UIResponder 사용법에 대해 알아보겠습니다.

1. UIButton 서브클래싱

UIResponder 프로토콜을 준수하는 새로운 클래스를 생성하여 UIButton을 서브클래싱합니다.

class TouchableButton: UIButton {

}

2. 터치 이벤트 처리 메서드 오버라이딩

UIResponder 프로토콜의 터치 이벤트 관련 메서드를 오버라이딩하여 원하는 동작을 구현합니다. 가장 기본적인 메서드로 touchesBegan(_:with:)을 사용해보겠습니다.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // 터치가 시작될 때 실행될 코드 작성
    super.touchesBegan(touches, with: event)
    
    // 터치된 좌표 추출
    guard let touch = touches.first else { return }
    let touchPoint = touch.location(in: self)
    
    // 터치된 좌표에 대한 동작 수행
    // 예: 버튼 클릭 효과 애니메이션
    
    UIView.animate(withDuration: 0.2) {
        self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
    }
}

이 코드에서는 터치가 시작될 때 버튼을 약간 축소하는 애니메이션을 적용하는 예시입니다.

3. 터치 이벤트 처리 메서드 추가

어떤 터치 이벤트에 대해 원하는 동작을 수행하고 싶다면 해당 메서드를 오버라이딩하여 구현합니다. 예를 들어, 터치가 끝났을 때 원래 크기로 돌아가는 애니메이션을 추가해보겠습니다.

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    // 터치가 끝났을 때 실행될 코드 작성
    super.touchesEnded(touches, with: event)
    
    // 터치된 좌표에 대한 동작 수행
    // 예: 버튼 크기 복원
    
    UIView.animate(withDuration: 0.2) {
        self.transform = CGAffineTransform.identity
    }
}

이제 touchesBegan(_:with:) 메서드에서 변경한 버튼 크기를 터치가 끝났을 때 다시 원래 크기로 복원하는 애니메이션을 추가하였습니다.

4. 터치 이벤트 처리 추가

다른 터치 이벤트에 대한 동작을 수행하고 싶다면 해당 메서드를 오버라이딩하여 구현하면 됩니다. 예를 들어, 터치가 취소될 때 동작을 추가해보겠습니다.

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    // 터치가 취소될 때 실행될 코드 작성
    super.touchesCancelled(touches, with: event)
    
    // 터치된 좌표에 대한 동작 수행
    // 예: 버튼 크기 복원
    
    UIView.animate(withDuration: 0.2) {
        self.transform = CGAffineTransform.identity
    }
}

이제 터치가 취소될 때에도 버튼 크기를 원래 크기로 복원하는 애니메이션을 추가하였습니다.

마무리

위의 예시를 통해 UIButton에서의 UIResponder를 사용해 터치 이벤트를 처리하는 방법에 대해 알아보았습니다. UIResponder를 상속받는 UIButton 서브클래스를 만들고, 원하는 터치 이벤트에 맞게 메서드를 오버라이딩하여 원하는 동작을 구현할 수 있습니다. 이를 활용하여 사용자의 터치에 따라 다양한 동작을 구현할 수 있습니다.

참고 자료