#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 ())