как сделать модальный вид с прозрачным фоном в SwiftUI?

Кто угодно знает, как сделать модальный вид с прозрачным фоном.

Точно так же, как приведенная ниже ссылка в быстром

​​Swift Modal View Controller с прозрачным фоном


person Community    schedule 23.08.2019    source источник
comment
Мой предыдущий комментарий исправлен, поэтому я удалил его (и проголосую за ваш вопрос). Прямо сейчас кажется, что вы можете задать фон модальному представлению, используя Rectangle внутри ZStack. НО ... значение по умолчанию для модального представления, похоже, основано на настройке светлого / темного режима. Если вы сделаете заливку прямоугольника Color.clear, у вас все равно будет фон, покрывающий нижележащий вид ...   -  person dfd    schedule 23.08.2019
comment
Надеюсь, в будущей версии SwiftUI будет ваша функция, но я думаю, что лучше всего не использовать модальное окно, а вместо этого создать полноэкранный режим с прозрачным фоном и убрать его на экран, а также предоставить способ его отклонить. Поскольку в прозрачном модальном окне не отображаются края, вы, по сути, имитируете модальное окно.   -  person dfd    schedule 23.08.2019
comment
mmh может быть чем-то вроде этого (это просто представление, которое появляется внутри ZStack) github.com/peppesapienza/random-code/blob/master/?   -  person Giuseppe Sapienza    schedule 24.08.2019


Ответы (4)


Я использую шаблон координатора, создавая вид в сборке

let view = UIHostingController(rootView: swiftuiview)
view.view.backgroundColor = .clear

внутри маршрутизатора просто представьте этот UIHostingController

module.modalPresentationStyle = .overCurrentContext
navigationController.present(module, animated: animated, completion: nil)
person saniaxxx26    schedule 17.09.2019
comment
К сожалению, кажется, что backgroundColor UIHostingController не содержит .clear - person Legolas Wang; 17.02.2020
comment
Найден способ сделать представление по крайней мере ясным, установив для view.view.background значение nil вместо .clear, тогда все, что вам нужно сделать, это установить непрозрачность на нулевой эфир на уровне хост-контроллера или в самом представлении SwftUI - person Ash-Bash32; 07.04.2020

Если вы хотите размыть фон SwiftUI из проекта UIKit и, возможно, используете представление SwiftUI для модального представления, тогда у меня недавно была такая же проблема, и я создал UIViewController, который принимает UIHostController (в основном UIViewController), а затем изменяет альфа-канал представления HostingController, помещает размытие сзади и представляет его родительскому представлению.

Я создал суть с файлом в нем для общественного использования https://gist.github.com/Ash-Bash/93fd55d89c1e36f592d3868f6b29b259

Вот рабочий пример:

// Initialises BlurredHostingController
var blurredHostingController = BlurredHostingController()

// Sets the Hosting View for the SwiftUI View Logic
blurredHostingController.hostingController = UIHostingController(rootView: ContentView())

// Blur Tweaks for blurredHostingController
blurredHostingController.blurEffect = .systemMaterial
blurredHostingController.translucentEffect = .ultrathin

// Presents View Controller as a Modal View Controller
self.present(blurredHostingController animated: true, completion: nil)

Вот результат macCatalyst  введите описание изображения здесь

person Ash-Bash32    schedule 07.04.2020

Подарок:

let rootView = Text("Hello world")
let controller = UIHostingController(rootView: rootView)
controller.view.backgroundColor = .clear
UIApplication.shared.windows.first?.rootViewController?.present(controller, animated: true)

Увольнять:

UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
person Lorenzo Fiamingo    schedule 16.05.2020

У меня не было идеального способа сделать это, но у меня есть обходной путь.

Итак, чтобы представить представление модально, вы можете взять ZStack, сгруппировать в нем несколько представлений и обработать его с помощью переменной @State, подобной этой.

Здесь я указал цвет фона для представления для лучшего объяснения.

struct ContentView : View {
   @State private var showModally = false
   var body : some View {
    ZStack {
        Color.red
        VStack {
            Button(action: {
                withAnimation{
                    self.showModally = true
                }
            }) {
                Text("Push Modally")
            }
        }
        
        ModalView(show: $showModally)
            .offset(y: self.showModally ? 0 : UIScreen.main.bounds.height)
            .animation(.spring())
        
    }
  }
}

struct ModalView: View {
  @Binding var show : Bool
  var body: some View {
    VStack {
        Spacer()
        
        VStack {
            Color.white
        }
        .frame(height : 400)
        .cornerRadius(10)
        .padding(.horizontal)
    }
    .background(Color.clear)
    .onTapGesture {
        self.show = false
    }
  }
}

В этом случае модальное представление будет представлено модально над представлением содержимого и будет закрыто касанием.

person Anshuman Singh    schedule 29.01.2020
comment
Как это можно изменить, чтобы охватить UITabBar? - person Luke Irvin; 30.06.2021
comment
включите TabView в ZStack и оставьте содержимое без изменений. примерно так: - ZStack {TabView {Content} ModalView} - person Anshuman Singh; 02.07.2021