What is the equivalent of UIKit View's deinit for a SwiftUI view?
I have looked at .onDisappear... but, it does not seem to me that is the hook I should be using to know when a SwiftUI View is gone for good, for example during navigation etc...
Related
I have started learning swiftUI so I have question about Navigation View. My app starts with splash screen which is embedded in Navigation View and after that I have navigation link to the second screen which is Tab View. Do I need navigation views in child views of Tab View if I have some button etc and I also need to go to other screens from them or I use primary navigation view which tab view is embedded in?
When using both TabView and NavigationView, TabView should always be the parent view and should contain NavigationView inside it.
Hope this clarifies what you’re looking for?
What is the name of the SwiftUI View shown in the image (the side popup view on the top right of the screen)? If it's custom made, then what default SwiftUI view do I use to achieve this look in my own app?
I want to embed some SwiftUI in my UIKit-based UI, and unfortunately Apple doesn't provide UIHostingView, only UIHostingController. Can I more or less ignore that controller and just use its view, or do I really need to add it as a child view controller as well? What happens if I don't?
The problem is that finding the parent view controller can be difficult in some contexts. UIView itself doesn't know anything about view controllers, so I'd have to come up with my own way of keeping track of which is the "current" view controller. And I'd rather not do that unless it's actually necessary.
So far in my experiments it's working fine without adding UIHostingController as a child. Device rotation is handled appropriately, and SwiftUI's dark mode override (.colorScheme()) even works through the embedding.
With UIHostingController(rootView:) you just pass in a SwiftUI View.
You can treat it as a UIView by doing:
let myView = UIHostingController(rootView: Text("Hello world!")).view
And then add it as a subview for example:
let parent = UIView()
parent.addSubview(myView)
I followed Apple's guide on using UIPageViewController with SwiftUI. Their guide works fine. However I ran into an issue, where if I have my PageView inside a ScrollView - the height of the PageView is no longer respected and I have to set the frame manually. Not ideal, as the content inside PageView is dynamic and thus, heights will vary.
This seems to be an issue with ScrollView; as I have another view - UIViewRepresentable - that is a simple wrapper around WKWebView - with the same issue.
Is there a way to have these views size themselves, inside a SwiftUI ScrollView?
If I place these views outside of a ScrollView and into a simple VStack for example, they size themselves correctly.
In SwiftUI .pickerStyle(SegmentedPickerStyle()) will give you a SegmentedControl with all segments having equal size.
How do we do the SwiftUI equivalent to setting the UIKit property apportionsSegmentWidthsByContent = true
There is no equivalent apportionsSegmentWidthsByContent property in SwiftUI,
also the PickerStyle protocol its defined internally so you have 3 options
Set the property globally, all segmented controls in your SwiftUI project will be affected.
UISegmentedControl.appearance().apportionsSegmentWidthsByContent = true
Use UIViewRepresentable to wrap the UIKit segmented control
make your own picker, experiments
SwiftUI Custom PickerStyle