Código: com este código estou navegando para visualizações entre (ProfileView(), HomeNew, NotificationsTabView, MessageTabView) muito nítidas, quero dizer algo como uma mudança muito rápida, mas preciso que seja mais suave mudar de uma visualização para outra
por causa do meu código, se eu mudar rapidamente as visualizações uma por uma, um pouco antes de visualizar o design de dados fictícios por um segundo, mostrando na visualização atual.
então preciso de uma navegação muito suave entre as visualizações . então, como conseguir uma navegação suave entre as visualizações. por favor me guie.
struct TabContainerViewNew: View {
@Binding var index: Int?
@State private var showSideMenu = false
@State private var gotoSearch = false
init(index: Binding<Int?>) {
self._index = index
UITabBar.appearance().isHidden = true
}
let tabs = [("Menu", "Menu_New"), ("My profile", "user"), ("Home", "MenuNew_Home"), ("Notification", "MenuNew_Notification"), ("Message", "MenuNew_Message")]
var body: some View {
ZStack(alignment: .bottom) {
if let index = index {
TabView(selection: Binding(
get: { index },
set: { newValue in
self.index = newValue
}
)) {
ProfileView()
.tabItem {
Label("My profile", image: "icn_settings_tab")
}
.tag(1)
HomeNew()
.tabItem {
Label("Home", image: "icn_home_tab")
}
.tag(2)
NotificationsTabView()
.tabItem {
Label("Notification", image: "icn_notifications_tab")
}
.tag(3)
MessageTabView()
.tabItem {
Label("Message", image: "icn_message_tab")
}
.tag(4)
}
.tint(.white)
.transition(.slide)
}
VStack(spacing: 0) {
HStack(spacing: 0) {
ForEach(0..<tabs.count) { i in
if tabs[i].0 == "Menu" {
VStack {
Button(action: {
withAnimation {
showSideMenu.toggle()
}
}) {
Image(tabs[i].1)
.renderingMode(.template)
.resizable()
.scaledToFit()
.tint(.white.opacity(0.6))
.frame(width: 24, height: 24)
.padding(8)
}
Text(tabs[i].0)
.foregroundColor(.white.opacity(0.6))
.font(.system(size: 11))
}
.frame(maxWidth: .infinity)
} else {
TabButton(image: tabs[i].1, title: tabs[i].0, item: i, index: $index)
.frame(maxWidth: .infinity)
}
}
}
.padding(.horizontal, 7)
.padding(.bottom, 15)
.padding(.top, 5)
.background(Color.appGreen2)
}
}
.sideMenu(isShowing: $showSideMenu) {
SideMenuView(isShowingMenu: $showSideMenu)
}
}
}
struct TabButton: View {
var image: String
var title: String
var item: Int
@Binding var index: Int?
var body: some View {
VStack {
Button(action: {
index = item
}) {
Image(image)
.renderingMode(.template)
.resizable()
.foregroundColor(index == item ? .white : .white.opacity(0.6))
.frame(width: 24, height: 24)
.padding(8)
}
Text(title)
.foregroundColor(index == item ? .white : .white.opacity(0.6))
.fontWeight(index == item ? .bold : .regular)
.font(.system(size: (index == item ? 11 : 11)))
}
.frame(maxWidth: .infinity)
}
}
Eu estava pedindo um MRE e não consegui, mas acho que pode haver uma solução simples aqui.
Como você já está usando uma barra de guias personalizada, tente usar
.page
como arquivo.tabViewStyle
. Isso fornece uma transição de slides entre visualizações:Essa é praticamente a única animação que você obtém com um arquivo
TabView
. Se você está atrás de uma.opacity
transição, ou qualquer outro tipo de transição, então você mesmo precisará implementar a mudança de visão. Na verdade, isso não é muito difícil, especialmente porque você já está usando uma barra de guias personalizada.Uma maneira é substituir a instrução
TabView
por aZStack
e aswitch
: