[SwiftUI] 멀티터치 막기

양재현·2025년 4월 30일

들어가며

멀티터치에 대하여 글을 쓰게된 이유는, 프로젝트를 진행하던 중 멀티터치, 중복터치를 막아야 하는 상황이 있었고 해결한 방법을 공유하기 위해서다.

우선, swiftui 에서는 멀티터치를 지원하고 있는데 멀티터치는 여러개의 콘텐츠를 동시에 탭할때 하나의 콘텐츠만 작용하는게 아니라 모두 다같이 작용한다.

다들 한 번쯤은 앱을 사용하다가

이런식으로 네비게이션이 중첩되어 넘어가본 경험이 있을 것이다. 이러한 경험은 사용자에게 좋지 않은 경험이 될 수도 있고, 멀티터치로 여러 콘텐츠가 동시에 넘어간다면 서버 비용측면에서도 좋지 않을 것이다. 뿐만 아니라 동시에 여러 기능이 구현되서 기능이 꼬이는 문제가 발생할 수도 있을 것이다.

이러한 내용들을 종합해보면, 멀티터치를 막는 기능을 구현하면 더욱 완성도 있는 서비스를 제공할 수 있을것이다.

첫 번째 방법

첫 번째 방법으로는 앱 전역에서 멀티터치를 막는 것이다.

@main
struct YourApp: App {
  init() {
      UIView.appearance().isMultipleTouchEnabled = false
      UIView.appearance().isExclusiveTouch = true
  }
}

이런식으로 적용하면 앱 전역에서 멀티터치, 중복터치를 막을 수 있다고 한다. 그러나 필자는 이 방법으로 적용해보니 계속해서 실패해서 다른 방법을 이용했다.

두 번째 방법

두 번째 방법으로는 TapLock이라는 싱글톤 객체를 생성하여 각 버튼, 또는 OnTapGesture에 메서드를 적용하는 것이다.

import SwiftUI

final class TapLock {
  static let shared = TapLock()
  private init() {}

  private var isLocked = false

  func tryLock(for duration: TimeInterval = 0.5) -> Bool {
      guard !isLocked else { return false }
      isLocked = true
      DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
          self.isLocked = false
      }
      return true
  }
}

이렇게 TapLock 클래스를 싱글톤으로 만들어두고 tryLock() 메서드를 각 버튼에 적용하게 되면 하나의 버튼을 눌렀을때 lock이 걸리고 0.5초가 지났을때 다시 lock이 해제된다.

이걸 View에서 적용한다면

import SwiftUI

struct TestView: View {
    var body: some View {
        VStack {
            Button("버튼 1") {
                guard TapLock.shared.tryLock() else { return }
                print("버튼 1 탭")
            }
            Button("버튼 2") {
                guard TapLock.shared.tryLock() else { return }
                print("버튼 2 탭")
            }
        }
    }
}

이런식으로 내가 구현하고 싶은 기능 앞에

guard TapLock.shared.tryLock() else { return }

이 싱글톤 메서드를 통해 lock이 걸려있을 경우 return 하여 멀티터치, 중복터치를 막을 수 있다.

마치며

앱 전역에 두 줄의 코드로 멀티터치를 막는 방법이 성공했다면 참 편했겠지만, 실패하여 싱글톤으로 멀티터치를 막는 방법을 택했다. 멀티터치 막기가 제대로 작동하지만 모든 버튼, onTapGesture에 메서드를 적용해야 하는 이 방법은 비효율적이라는 생각이 들었다. 하지만 아직은 앱 전역에 한 번에 멀티터치를 막는 방법을 알아내지 못해서 안타까울 뿐이다. 그래도 멀티터치를 막고 싶은 개발자들에게 이 글이 도움이 되었으면 좋겠다 ~

🍎 참고

https://stackoverflow.com/questions/67455293/how-to-disable-multi-touch-on-entire-app-or-just-a-view-using-swiftui

0개의 댓글