如何在macOS中设置 Push/Pop 动画NavigationStack?因为目前没有动画,我想推送/弹出控制器向右滑动(向左滑动),类似于AppStore应用程序
enum Nav {
case a
}
struct MainView: View {
var body: some View {
NavigationStack {
NavigationLink(value: Nav.a) {
Text("Go to a")
}
.navigationDestination(for: Nav.self) { path in
switch path {
case .a:
Text("a")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 结合上述观点的正确方法是什么?
截至目前,NavigationStack我的应用程序底部有一个。它显示 aLaunchView作为 root。当用户通过身份验证时,主视图将添加到堆栈中,如果没有,登录/注册视图将添加到堆栈中。这很好用。
NavigationStack(path: self.$vm.path) {
LaunchView()
.navigationDestination(for: Authentication.self) { value in
switch value {
case .login:
LoginView(vm: LoginViewModel() { type, action in
...
})
case .verify: // let .verify(email)
VerifyMailView(vm: VerifyMailViewModel() { type, action in
...
})
case .authenticated:
AuthenticatedView() { type, action in
self.vm.set(type: type) { value in
...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它AuthenticatedView由一个具有三个视图的视图组成TabView。问题来了。我以为我可以直接在它们上设置三个视图的标题和工具栏,但事实并非如此。但是,我不想也不能在选项卡视图中设置标题或工具栏,因为它们需要来自视图视图模型的数据(拥有TabView且不应该拥有访问权限)。
TabView(selection: self.$vm.index) {
DiscoverView(vm: DiscoverViewModel(account: self.vm.$account, type: self.type))
.tabItem {
Image(self.vm.index == …Run Code Online (Sandbox Code Playgroud) 我试图弹回到特定的视点或根视图,并使用 navigationDestination(isPresented) 来推送视图。
这是我正在使用的代码的更简单版本
import SwiftUI
struct View1: View {
@State var goToView2 = false
@State var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
VStack {
Text("View 1")
Button("Go to View 2") {
goToView2 = true
}
}.navigationDestination(isPresented: $goToView2) {
View2(path: $path)
}
}
}
}
struct View2: View {
@State var goToView3 = false
@Binding var path: NavigationPath
var body: some View {
VStack {
Text("View 2")
Button("Go to View 3") {
goToView3 = true …Run Code Online (Sandbox Code Playgroud) 我尝试过苹果示例 为您的 SwiftUI 应用程序带来强大的导航结构
所以我的代码看起来像这样
NavigationSplitView(
columnVisibility: $navigationModel.columnVisibility
) {
List(
categories,
selection: $navigationModel.selectedCategory
) { category in
NavigationLink(category.localizedName, value: category)
}
.navigationTitle("Categories")
.toolbar {
ExperienceButton(isActive: $showExperiencePicker)
}
} detail: {
NavigationStack(path: $navigationModel.recipePath) {
RecipeGrid(category: navigationModel.selectedCategory)
}
}
Run Code Online (Sandbox Code Playgroud)
详情查看
struct RecipeGrid: View {
var category: Category?
var dataModel = DataModel.shared
var body: some View {
ZStack {
if let category = category {
ScrollView {
LazyVGrid(columns: columns) {
ForEach(dataModel.recipes(in: category)) { recipe in
NavigationLink(value: recipe) {
RecipeTile(recipe: recipe)
}
.buttonStyle(.plain) …Run Code Online (Sandbox Code Playgroud) swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack
我制作了一个简单的 macOS 应用程序,并NavigationStack使用NavigationLink(value:label:). 它的效果非常好,只是根本没有动画。是否可以通过这种方式添加动画NavigationStack?我无法使用withAnimation {},因为这不是NavigationLink工作原理。
我正在尝试使用NavigationStack内部NavigationSplitView。
struct ContentView: View {
@State var mainMenu: MenuItem?
@State var subMenu: SubMenuItem?
var body: some View {
NavigationSplitView {
List(MenuItem.allCases, selection: $mainMenu) { item in
NavigationLink(value: item) {
Text(item.rawValue)
}
}
} detail: {
NavigationStack {
List(SubMenuItem.allCases, selection: $subMenu) { item in
NavigationLink(value: item) {
Text(item.rawValue)
}
}
.navigationDestination(for: SubMenuItem.self) { selected in
DetailView(item: selected)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
struct DetailView: View {
let item: SubMenuItem
var body: some View {
Text(item.id)
}
} …Run Code Online (Sandbox Code Playgroud) ios swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack
这应该很简单,但我不知道如何在 NavigationStack 后面放置背景。对于 NavigationView,只需嵌入 ZStack 中,并在 NavigationView 之前调用背景视图即可(如旧文章中所述:如果在 SwiftUI 中使用 NavigationView,如何更改背景颜色?)相同的技术对我来说不适用于 NavigationStack 。这是我所拥有的:
struct MyAngularGradient: View {
var body: some View {
ZStack {
AngularGradient(gradient: Gradient(colors: [.red, .orange , .yellow, .green, .cyan, .blue, .indigo, .purple, .red]), center: .leading)
AngularGradient(gradient: Gradient(colors: [.red, .orange , .yellow, .green, .cyan, .blue, .indigo, .purple, .red]), center: .leading)
.offset(x: -8)
}
.ignoresSafeArea()
}
}
var body: some View {
ZStack{
MyAngularGradient()
NavigationStack {
...
}
.navigationViewStyle(.stack)
} // end ZStack
Run Code Online (Sandbox Code Playgroud)
仅供参考,我在其他应用程序(带有 NavigationView)中使用了相同的 MyAngularGradient() 有什么想法吗?谢谢。
我知道使用 AttributedString,我可以使用以下内容链接到外部网站:
Text("To learn more about AttributedString visit [this page](https://developer.apple.com/documentation/foundation/attributedstring/)")
我可以使用它在同一个应用程序中从 ViewA 转到 ViewB,有点像 Twitter 中的这个示例吗?
我有 NavigationStack 及其自己的导航链接,用于 iOS16 开发。
如何更改要显示的默认幻灯片过渡或自定义过渡?
另外,您是否在 NavigationStack 或 NavigationLink 上应用转换?
这是我的代码:
import SwiftUI
struct TestView: View {
var body: some View {
NavigationStack() {
NavigationLink ("Link", value: "Any Value")
.navigationDestination(for: String.self) { textValue in
destinationView(textValue: textValue)
}
}
}
}
struct destinationView: View {
let textValue: String
var body: some View {
Text(textValue)
}
}
Run Code Online (Sandbox Code Playgroud)
如何更改默认转换?
swiftui swiftui-navigationlink swiftui-animation swiftui-navigationsplitview swiftui-navigationstack
我正在尝试在 SwiftUI 中重新创建许多社交媒体应用程序中看到的帐户关注者流程。
\n步骤 3 和 4 可以永远继续下去(下面是另一个例子):
\nMyProfile -> Followers (my followers list) -> FollowerView -> Followers (their followers list) -> FollowerView -> Followers (their followers list) -> FollowerView and so on...\nRun Code Online (Sandbox Code Playgroud)\n然而,通过运行下面的实现,XCode 控制台会打印:
\n\n\n\xe2\x80\x9cmyApp.SomeProfile\xe2\x80\x9d 的 navigationDestination 已在堆栈的较早位置声明。仅使用最接近堆栈根视图声明的目标。
\n
我知道为什么会这样,但不确定如何解决这个问题。我也认为用作值的类型是否NavigationLink合适,因为它是Int。将其替换为更自定义的类型会更好吗?
任何帮助将不胜感激。
\n// Enum with custom options\nenum ViewOptions: Hashable {\n case followers(Int)\n \n @ViewBuilder func view(_ path: Binding<NavigationPath>, …Run Code Online (Sandbox Code Playgroud) ios swift swiftui swiftui-navigationlink swiftui-navigationstack