한 화면에 Menu와 Modal View(.fullScreenCover, .sheet 등)를 같이 사용하는 경우, 해당 Modal View가 dismiss 되었을 때 Menu를 두번 탭해야 정상 작동하는 버그가 있습니다.
예제를 한번 볼까요?
VStack {
Menu {
Button {
selectedMenu = 1
} label: {
Text("메뉴 1")
}
Button {
selectedMenu = 2
} label: {
Text("메뉴 2")
}
} label: {
Text("메뉴 버튼입니다")
}
Text("테스트 화면입니다")
.onTagGesture {
showModal = true
}
}
.sheet(isPresented: $showModal, onDismiss: nil) {
ModalView()
}
SwiftUI의 Menu는 Context Menu 라고 불리는 형태의 메뉴 목록을 화면에 보여줄 수 있습니다. (탭하면 해당 요소의 바로 아래 또는 위로 선택지가 나타나는 목록)
또, 위 예제처럼 .sheet를 사용하면 쉽게 Modal View를 나타낼 수 있습니다 (.fullScreenCover는 화면을 다 덮는 형태, .sheet는 일부만 덮는 형태)
문제는 이 두 가지를 한 화면에 같이 사용하면 발생하는 버그가 있다는 것이죠.
위 예제에서, 바로 "메뉴 버튼입니다"를 탭하면 메뉴가 보이지만, "테스트 화면입니다"를 탭하여 Modal View를 보여줬다가 Dismiss 시킨 후 다시 "메뉴 버튼입니다"를 탭하면 메뉴가 바로 보이지 않습니다. 두번 탭해야 보이는 버그가 있죠...
VStack {
if !showModal {
Menu {
Button {
selectedMenu = 1
} label: {
Text("메뉴 1")
}
Button {
selectedMenu = 2
} label: {
Text("메뉴 2")
}
} label: {
Text("메뉴 버튼입니다")
}
}
Text("테스트 화면입니다")
.onTagGesture {
showModal = true
}
}
.sheet(isPresented: $showModal, onDismiss: nil) {
ModalView()
}
버그를 회피할 수 있는 방법은 있습니다. 위와 같이 Menu 자체를 화면에 다시 그리도록 하면 되더라구요.
이런 버그는 애플이 빨리 고쳐줬으면 좋겠습니다 ㅜㅜ
'iOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] Naver Map에 Custom Marker 띄우기 (2) | 2022.02.16 |
---|---|
[SwiftUI] Custom Navigation Bar의 Back Swipe 액션 활성화하기 (2) | 2022.02.15 |
[SwiftUI] SwiftUI로 Naver Map iOS SDK 연동하기 (2) | 2022.02.11 |
[SwiftUI] SwiftUI View 캡쳐하기 (UIGraphicsImageRenderer) (0) | 2022.02.11 |
[SwiftUI] SwiftUI View를 UIView로 변환하기 (UIHostingController) (0) | 2022.02.10 |