- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个应用程序,其中多个页面/ View 嵌入到具有标签栏、菜单栏和标题的父 View 中,如下所示:
HeaderView()
MenuView()
TabView(selection: $selected){
HomeView()
Page2View()
Page3View()
Page4View()
}
当用户点击其中一个页面上的列表单元格时,我希望它以横向的详细 View 打开,而不是作为垂直打开的工作表/模态打开,即隐藏菜单栏、标题和标签栏。我已经尝试为此使用 FullScreenCover,但它总是自下而上显示,我无法弄清楚如何从侧面显示它。我也尝试过使用 NavigationLink,但是当我不希望它们显示时它会保留标签栏、菜单栏和标题,而且我不知道如何使详细 View 全屏显示。
您知道有什么方法可以让 FullsSreenCover 横向打开,或者让 NavigationLink 在另一个 View 内时填满整个屏幕吗?
最佳答案
在动画中使用overlay
父 View
struct ContentView: View {
@State var isShowSheet: Bool = false
var body: some View {
VStack{
Button("Show Sheet") {
withAnimation {
isShowSheet.toggle()
}
}
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.overlay(isShowSheet ? FullScreen(isShowSheet: $isShowSheet.animation()) : nil)
}
}
全屏 View
struct FullScreen: View {
@Binding var isShowSheet: Bool
var body: some View {
Color.blue
.transition(.move(edge: .leading))
.onTapGesture {
isShowSheet = false
}
.edgesIgnoringSafeArea(.all)
}
}
第二个选项是使用带有自定义动画的 UIViewController。我已经使用此链接 (//https://stackoverflow.com/a/58494173/14733292) 中的 viewControllerHolder 扩展并添加了 CATransition()
struct ViewControllerHolder {
weak var value: UIViewController?
}
struct ViewControllerKey: EnvironmentKey {
static var defaultValue: ViewControllerHolder {
return ViewControllerHolder(value: UIApplication.shared.windows.first?.rootViewController)
}
}
extension EnvironmentValues {
var viewController: UIViewController? {
get { return self[ViewControllerKey.self].value }
set { self[ViewControllerKey.self].value = newValue }
}
}
extension UIViewController {
func present<Content: View>(style: UIModalPresentationStyle = .automatic, @ViewBuilder builder: () -> Content) {
let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
toPresent.modalPresentationStyle = style
toPresent.rootView = AnyView(
builder()
.environment(\.viewController, toPresent)
)
self.presentController(toPresent)
}
func presentController(_ viewControllerToPresent: UIViewController) {
let transition = CATransition()
transition.duration = 0.25
transition.type = CATransitionType.push
transition.subtype = CATransitionSubtype.fromLeft
self.view.window?.layer.add(transition, forKey: kCATransition)
present(viewControllerToPresent, animated: false)
}
func dismissController() {
let transition = CATransition()
transition.duration = 0.25
transition.type = CATransitionType.push
transition.subtype = CATransitionSubtype.fromRight
self.view.window?.layer.add(transition, forKey: kCATransition)
dismiss(animated: false)
}
}
ContentView 和全屏
struct ContentView: View {
@Environment(\.viewController) private var viewControllerHolder: UIViewController?
var body: some View {
VStack{
Button("Show Sheet") {
viewControllerHolder?.present(style: .overFullScreen, builder: {
FullScreen()
})
}
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
}
}
struct FullScreen: View {
@Environment(\.viewController) private var viewControllerHolder: UIViewController?
var body: some View {
Color.blue
.onTapGesture {
viewControllerHolder?.dismissController()
}
.edgesIgnoringSafeArea(.all)
}
}
关于SwiftUI:如何横向呈现 FullScreenCover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65868660/
我正在制作一个应用程序,其中多个页面/ View 嵌入到具有标签栏、菜单栏和标题的父 View 中,如下所示: HeaderView() MenuView()
我需要从 View 组件内的按钮推送模态视图,但应该只覆盖屏幕高度的下半部分,上半部分是半透明背景(不透明度为 30% 的黑色)。在 fullscreenCover View 构建器中设置最顶层 Vi
所以从技术上讲,我想显示一个加载屏幕 View 。我正在使用 fullScreenCover . struct ContentView: View { @State private v
我想从一个 View 以全屏模式显示两个目的地 View 。 下面是我的代码示例。似乎该功能仅适用于单个演示文稿,如果我定义了第二个 fullScreenCover,第一个 fullScreenCov
ON外观不会触发。我意识到,当我关闭全屏封面时,onAppar并没有触发。
ON外观不会触发。我意识到,当我关闭全屏封面时,onAppar并没有触发。
ON外观不会触发。我意识到,当我关闭全屏封面时,onAppar并没有触发。
我创建了一个简单的集合,其中包含从最后一页到下一屏幕的导航。如果我需要将 .fullScreenCover 修饰符应用于最后一页数组索引上的按钮,如何正确编写转换条件?如果索引是第一个,我如何正确地将
.fullScreenCover(isPresented: , 内容: View#>) 我需要使用参数初始化 View 并将其传递给.fullScreenCover,我可以使用TesFullScre
我在 View 中有一个按钮(在 NavigationView 内),可以打开全屏封面 - 一些数据正在处理时的加载屏幕。当封面被关闭时,我想以编程方式自动路由到下一个 View 。我正在使用 Nav
我有一个在显示和关闭 fullScreenCover 或工作表之前工作正常的选择器。有谁知道这个示例代码有什么问题,或者有解决方法? 我也尝试使用 self.presentation.wrappedV
想象一下,您已经构建了一个使用 sheet 的屏幕。用于呈现模态表的 API,现在您想使用 SwiftUI 2.0 fullScreenCover而是在 iOS 14 上运行时。你是怎么做的? Xco
我是一名优秀的程序员,十分优秀!