Thanks for the feedback!
I don't recommend combining GCD/DispatchQueue with SwiftUI’s state management or async/await. You should consider moving the showBanner logic to your model and using Task.Sleep for the delay.
Sure, I did this just for this demo example
Also, TabViews are navigation containers, so it's unclear why they are embedded in a VStack in your example.
In real app content is more complex, think a horizontal carousel embedded inside parent view controller. I guess we used it because it provided binding to selected view out of the box and worked for older iOS versions.
A better way to display the banner is to add it to the safe area.
This makes view code a bit cleaner indeed, thanks. Unfortunately it did not solve animation issue though.
I ended up just using paged ScrollView and scrollPosition provided binding to selected view, it worked like a charm although it's limited to iOS 17+