반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SwiftUI
- URL(string:)
- IOS
- init?
- operator
- typeorm
- RxCocoa
- @Binding
- Xcode
- Creating Operators
- RxSwift
- NavigationLink
- @EnvironmentObject
- nestjs
- SWIFT
- @State
- Operators
- RFC1738/1808
- subject
- dismiss
- @Environment
- init
- ios14
- Bug
- Operater
- nonisolated
- swift6
- vim
- NullObject
- graphql
Archives
- Today
- Total
Tunko Development Diary
SwiftUI) .sheet 배경 투명하게 만들기 (ios16.4 대응) 본문
출처 : https://stackoverflow.com/questions/63745084/how-can-i-make-a-background-color-with-opacity-on-a-sheet-view
SwiftUI .sheet를 이용한 View에서는 화면을 전부 채우지 않는 경우 배경이 투명하게 나타납니다.
의도적으로 이를 투명하게 해주기 위해서
View를 포함하고 있는 부모뷰의 백그라운드를 .clear로 설정합니다.
이를 SwiftUI에서 접근하기 위해서
UIViewRepresentable 를 사용하여 UIKit에 있는 UIView를 임시 생성해 줍니다.
struct ClearBackgroundView: UIViewRepresentable {
func makeUIView(context: Context) -> some UIView {
let view = UIView()
DispatchQueue.main.async {
view.superview?.superview?.backgroundColor = .clear
}
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
위 코드를 보면 비동기로 처리하여
뷰가 생성된 후
해당 뷰가 반환되어 sheet에 포함되고
DispatchQueue.main.async 를 이용해 비동기로 접근
부모뷰를 포함하고 있는 sheet뷰의 backgroundColor를 설정합니다.
해당 뷰를 편하게 사용하기위해 커스텀 모디파이어를 만들어 줍니다.
struct ClearBackgroundViewModifier: ViewModifier {
func body(content: Content) -> some View {
if #available(iOS 16.4, *) {
content
.presentationBackground(.clear)
} else {
content
.background(ClearBackgroundView())
}
}
}
extension View {
func clearModalBackground()->some View {
self.modifier(ClearBackgroundViewModifier())
}
}
iOS16.4 presentationBackground
https://developer.apple.com/documentation/swiftui/transformedshape/presentationbackground(_:)
iOS16.4 이상 버전에서는 sheet의 배경을 둘러싸고 있는 배경의 색상을 바꿀 수 있는 모디파이어를 제공합니다.
따라서
if #available(iOS 16.4, *) {
content
.presentationBackground(.clear) // 이 부분 추가
} else {
content
.background(ClearBackgroundView())
}
해당 코드로 분기시켜 처리해주었습니다.
감사합니다.
전체 코드를 남깁니다.
import SwiftUI
// MARK: 배경색을 투명하게 만들어주는 modifier - .clearModalBackground()
struct ClearBackgroundView: UIViewRepresentable {
func makeUIView(context: Context) -> some UIView {
let view = UIView()
DispatchQueue.main.async {
view.superview?.superview?.backgroundColor = .clear
}
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
struct ClearBackgroundViewModifier: ViewModifier {
func body(content: Content) -> some View {
if #available(iOS 16.4, *) {
content
.presentationBackground(.clear)
} else {
content
.background(ClearBackgroundView())
}
}
}
extension View {
func clearModalBackground()->some View {
self.modifier(ClearBackgroundViewModifier())
}
}
사용법
.sheet(isPresented: $isSheet) {
TestSheetView()
.clearModalBackground()
}
반응형
'Development > SwiftUI' 카테고리의 다른 글
SwiftUI) Null(nil) Object Pattern 활용하기 (0) | 2023.09.10 |
---|---|
SwiftUI - @StateObject, @ObservedObject 이해하기 (1) | 2023.09.09 |
xcode 14.2 - Info.plist contained no UIScene configuration dictionary (looking for configuration named "(no name)") 해결방법 (0) | 2023.01.20 |
SwiftUI) 알아두면 편한 FixedSize! (0) | 2022.10.12 |
SwiftUI) @Environment와 dismiss를 사용하는 올바른 방법 (0) | 2022.10.03 |
Comments