Просмотр дополнительного пространства в верхней части

#swift #swiftui

#swift #swiftui

Вопрос:

Я добавил панель навигации в свое расширение общего доступа. При добавлении NavigationView сверху появляется дополнительное пространство (изображение ниже).

В других ответах предлагалось удалить NavigationView.. без этого NavigationView панель не отображается.

Как я могу удалить это пространство, сохранив панель навигации?

 class ShareViewController: UIViewController {    
    override func viewWillAppear(_ animated: Bool) {
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.isTranslucent = true
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = .white

        let vc = UIHostingController(rootView: TempView())

        self.addChild(vc)
        self.view.addSubview(vc.view)
        vc.didMove(toParent: self)
        vc.view.translatesAutoresizingMaskIntoConstraints = false
        
        vc.view.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        vc.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
        vc.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        vc.view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        vc.view.heightAnchor.constraint(equalTo: self.view.heightAnchor).isActive = true
        vc.view.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
        vc.view.backgroundColor = UIColor.clear        
    }
}
  
 import SwiftUI

struct TempView : View {
    var body: some View {
        NavigationView {
            VStack {
                Text("Ok")
                Spacer()
            }
            .navigationBarTitle("Title", displayMode: .inline)
            .edgesIgnoringSafeArea(.top)
            .navigationBarItems(
              leading:
                Text("Close"),
              trailing:
                Text("Next")
            )
        }
    }
}

  

Дополнительное пространство на панели навигации

Комментарии:

1. Если вы используете SwiftUI NavigationView, вам не следует устанавливать UINavigationBar через UIKit, они не объединяются. Вместо этого либо используйте только NavigationView, либо попробуйте изменить UINavigationBar.appearance() перед отображением NavigationView.

2. @Asperi Спасибо за быстрый ответ. Интересно, если я очищу viewWillAppear и добавлю в NavigationController?.NavigationBar.height = true, тогда на панели SwiftUI NavigationView соответственно не будет места. Однако, если я ссылаюсь на другое представление, панель, к сожалению, не отображается.

Ответ №1:

Извините, я не соответствую своему чтению, вы пытаетесь использовать swiftui в расширении? Я рекомендую использовать ViewControllers. В любом случае попробуйте удалить вид навигации

 struct TempView : View {

var body: some View {
    // NavigationView {
        VStack {
            Text("Ok")
            Spacer()
        }
        .navigationBarTitle("Title", displayMode: .inline)
        .edgesIgnoringSafeArea(.top)
        .navigationBarItems(
          leading:
            Text("Close"),
          trailing:
            Text("Next")
        )
    }
// }
}
  

Комментарии:

1. Спасибо за комментарий, если вы удалите NavigationView, панель не отображается..

2. Потому что вы добавляете два. Один из них — ваш первый навигационный контроллер, который вы настраиваете в своем viewWillAppear, а другой — навигационный контроллер в представлении навигации. Я предлагаю вам добавить функциональность кнопок закрытия и следующего в контроллере представления, пожалуйста, прочтите эту ссылку, и если вам это удастся, дайте мне правильный ответ. diamantidis.github.io/2020/01/11/share-extension-custom-ui

3. Спасибо за ссылку, я хотел бы попытаться выяснить, как это сделать с помощью SwiftUI. Я комментирую конфигурацию viewWillAppear, пробел по-прежнему отображается следующим образом: imgur.com/a/31xVBem

4. Я не уверен, правильно ли я излагаю свою точку зрения. Вы добавляете 2 навигационных контроллера к своему представлению, один из которых находится на контроллере представления, а другой — в представлении навигации. Вы настраиваете его только в viewWillAppear.

5. Еще раз спасибо за разъяснение и обмен этой ссылкой. Я отмечу ваш ответ, как он работает. Для других мое решение, которое работает на данный момент, состояло в том, чтобы скрыть панель навигации UIKit, а затем использовать SwiftUI NavigationView и NavigationLink по умолчанию (т. Е. Без программного выбора и реализации EmptyView ())