티스토리 뷰

iOS

UITabBar와 UILongPressGestureRecognizer

Zedd0202 2021. 5. 16. 17:28
반응형

 

안녕하세요 :) Zedd입니다.

오늘은 처음 겪는 현상에 대해...분석 & 해결해보고자 합니다.

 

# UITabBar와 UILongPressGestureRecognizer

class MainTabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
        self.tabBar.addGestureRecognizer(gesture)
    }

    @objc
    func handleLongPress() {
        print("안녕")
    }
 }

코드는 간단합니다. UILongPressGestureRecognizer를 만들고 tabBar에 추가합니다.

tabBar를 길게 누르면 콘솔에 "안녕"이 찍히게 되겠죠.

 

# Dynamic Type

preferredFont와 UIFontMetrics에서 이야기 했듯이 Dynamic Type은 

extraSmall
small
medium
large
extraLarge
extraExtraLarge
extraExtraExtraLarge

// Larger Accessibility Sizes On
accessibilityMedium
accessibilityLarge
accessibilityExtraLarge
accessibilityExtraExtraLarge
accessibilityExtraExtraExtraLarge

기본적으로 7단계의 category가 있고, Larger Accessibility Sizes를 on하면 5단계가 더 늘어납니다. 

총 12단계 조절가능.

🙋 : UITabBar와 UILongPressGestureRecognizer 이야기 하다가 왜 Dynamic Type..?  

🧑‍💻 : 현재 상태에서 Dynamic Type을 accessibilityMedium 이상으로 지정하게 되면, 

갑자기 

안녕은 안뜨고 뭔가 화면 가운데에..뭔가가 뜨게됩니다.

이게 이상한거는 아니고, 기본적인 동작같아요!

accessibilityMedium 카테고리 이상에서는 TabBar long press시 저렇게 HUD가 나오게 됩니다.


🙋 : HUD? 

🧑‍💻 : Head Up Display.

iOS 13으로 올라가면서, 왼쪽 처럼 나오던 볼륨 조절 HUD가 가운데 사진 처럼 처럼 변경된 적이 있었죠.

저런것들을 HUD라고 생각하시면 됩니다.

아무튼 Long press를 하니 나왔던 저것도 HUD라고 보면됩니다.


 

[현재 상황]

Dynamic Type에서 큰 카테고리를 지정해도 TabBar의 title과 이미지는 커지지 않으니..

TabBar를 long press했을 때 나오는 HUD는 저시력자분들을 위한 UX라고 생각됩니다. 

하지만 저는 TabBar에 LongPress관련 action을 실행하도록 짜놨는데, "accessibilityMedium 카테고리 이상에서는 동작 안함"을 해결하고 싶어요. 

 

그럼 내가 하고싶은건 뭐ㄴ ㅑ!!!!!!!

HUD도 띄우고싶고, 내 longPress로직도 실행하고 싶ㄷㅏ 아니겠읍니까

 

자. 지금 HUD때문에 내 gesture가 동작이 안하는 상태인데..HUD도 띄우고, 내 gesture도 "동시에" 실행시켜줘!!!

ScrollView에서 위아래 Gesture를 감지하고싶다면? / UIGestureRecognizerDelegate에서 공부했던 UIGestureRecognizerDelegate메소드를 이용하면 됩니다. 그리고 그 중

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
      // 
}

이 친구를 이용하면 됩니다.

should / Recognize / Simultaneously / With

동시에 인식하게 한다~~ 뭐 이런거잖아요? 

맞습니다. 두 gesture recongnizer가 동시에 인식하도록 허용해야하는지를 리턴하면 됩니다.

기본적으로 false를 반환하고 있어요.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
      return true
}

응 true

 

[전체 코드]

class MainTabBarViewController: UITabBarController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
        gesture.delegate = self ✅
        self.tabBar.addGestureRecognizer(gesture)
    }

    @objc
    func handleLongPress() {
        print("안녕")
    }

    // UIGestureRecognizerDelegate
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true ✅
    }
}

gesture에 delegate 지정을 해주고, shouldRecognizeSimultaneouslyWith 메소드를 구현하면 됩니다.

 

[결과]

편-안

 

# HUD를 안뜨게 하고싶다.

흠..별로 추천하고 싶지 않지만..HUD를 안뜨게 하고싶을 수도 있잖아요!?

그렇다면 HUD를 뜨게하는 long press gesture를 "실패"하게 만들면 됩니다.

바로 지금 생각나는 그 메소드..역시나 ScrollView에서 위아래 Gesture를 감지하고싶다면? / UIGestureRecognizerDelegate에서 봤던건데요, 

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
}

shouldRequireFailureOf를 true로 리턴하면 됩니다. (기본적으로 false를 리턴하고 있음) 

gestureRecognizer 파라미터 : This is the object sending the message to the delegate. 즉 우리의 long press recognizer

otherGestureRecognizer : An instance of a subclass of the abstract base class UIGestureRecognizer. 아마도 HUD를 띄우는 long press recognizer

📍 shouldRequireFailureOf : gesture Recognizer가 다른 gesture Recognizer를 실패하도록 해야하는 경우, Delegate에게 요청.

즉 1) 우리의 long press recognizer가 2) HUD를 띄우는 long press recognizer를 실패하도록 해야하니 true를 리턴해줍니다.

하지만 HUD를 꺼버리면 저시력자분들은 이게 어떤 탭바인지 잘 모르겠죠..!? 그러니 추천하지 않습니다..🙅

암튼 이런 기능이 숨어있었군요..

틀린 부분이 있다면 댓글 달아주세요 ~.~

반응형