Post not yet marked as solved
I have pushed an UIHostingController which contains SwiftUI and set the navigationBar hidden:
class CoverVC : UIHostingController<AnyView>{
public init(shouldShowNavigationBar: Bool, rootView: ICloudSyncView) {
super.init(rootView: AnyView(rootView.navigationBarHidden(!shouldShowNavigationBar)))
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}
@objc required dynamic init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension CoverVC: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
But the InteractivePopGestureRecognizer is disabled.
How can I to solve this?
Post not yet marked as solved
Has anyone successfully persisted Color, particularly in SwiftData? So far my attempts have failed:
Making Color conform to Codable results in a run time error (from memory something about ColorBox).
Color.Resolved already conforms Codable but this results in "SwiftData/ModelCoders.swift:124: Fatal error: Composite Coder only supports Keyed Container"
None of the other color types conform to Codable (CGColor, NSColor and UIColor) so does the swift language really not have a persistable color type?
Post not yet marked as solved
This is a bug I have been trying to identify and fix for more than 3 weeks.
This bug mostly happens in production.
The stack trace doesn't help that much, because it looks like the app is crashing due to some SwiftUI internal methods.
I tried everything in my power to debug and find this bug, still nothing.
Due to the lack of 100% reproducibility, it made me think that this bug is either memory-pressure related or Swift concurrency related.
When does it happen:
This bug happens when presenting a SwiftUI modal (UIViewControllerRepresentable)[A]
which in terms presents a UIHostingController modal[B]
which then presents a modally a SwiftUI sheet [C]
The bug happens somewhere around staying in [C] or after dismissing it.
Context:
The app lifecycle is SwiftUI.
The main SwiftUI screen in the app body is a UIViewControllerRepresentable containing a UISplitViewController.
Here is a screenshot from the crash log in Xcode.
Anyone facing a similar issue?
Post not yet marked as solved
When the content exceeds 40 lines of text, crazy behaviour starts to happen. The content jumps up and down while typing. Is there any other way to implement simple editor that can handle around 200 lines without this crazy behaviour?
Post not yet marked as solved
I have a container view implementation that reads preference values from child views:
public struct Reader<Content>: View where Content: View {
public var content: () -> Content
public init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
public var body: some View {
content()
.onPreferenceChange(NumericPreferenceKey.self) { value in
// ...
}
}
}
This works fine until the content passed in to the container view is a Group. At that point the onPreferenceChanged modifier is applied to every child of the group, which leads to bugs in my situation.
One thing I can do is simply put the content in a VStack:
public var body: some View {
VStack(content: content)
.onPreferenceChange(NumericPreferenceKey.self) { value in
// ...
}
}
And that works fine to "Ungroup" before applying the onPreferenceChanged modifier. However, is this best practice? Is there a better way to apply a modifier to content as a whole instead of to each member of a potential group? Is it concerning that I might have an extra VStack in the view hierarchy with this fix?
I'm running into this error, when the underlying SwiftData object changes (gets an object added to it):
*" A NavigationLink is presenting a value of type “Project” but there is no matching navigationDestination declaration visible from the location of the link. The link cannot be activated.
Note: Links search for destinations in any surrounding NavigationStack, then within the same column of a NavigationSplitView. "*
For instance, when I first fire up the simulator, clicking on any existing project correctly takes me to its details page. However, as soon as I add a new project or delete a project, none of the navigation links work any more. If I reload the simulator, they all work again! Makes me suspect it's an error with not recomputing the links when the underlying data change, but I can't figure out what I need to change, as everything looks correct. Any help would be appreciated!
ContentView:
struct ContentView: View {
@Environment(\.modelContext) var modelContext
@Query(sort: \Project.endDate) var projects: [Project]
var body: some View {
NavigationStack {
Group {
if projects.isEmpty {
ContentUnavailableView("Enter your first project.", systemImage: "clipboard")
} else {
List {
ForEach(projects, id: \.id) { project in
NavigationLink(value: project) {
HStack {
DaysTile(
days: project.numWorkDaysNowUntilEnd,
description: "Work Days Remaining"
)
.padding(.trailing, 5)
VStack(alignment: .leading) {
Text(project.name)
.font(.title)
Text("Start: \(project.startDate.formatted(date: .abbreviated, time: .omitted))")
.foregroundStyle(.secondary)
Text("End: \(project.endDate.formatted(date: .abbreviated, time: .omitted))")
.foregroundStyle(.secondary)
}
}
}
}
.onDelete(perform: deleteProjects)
}
.navigationDestination(for: Project.self) { project in
ProjectDetailView(project: project)
}
}
}
.navigationTitle("Project Tracker")
.toolbar {
NavigationLink {
AddProjectView()
} label: {
Label("Add New Project", systemImage: "plus")
}
}
}
}
func deleteProjects(at offsets: IndexSet) {
for offset in offsets {
let project = projects[offset]
modelContext.delete(project)
}
}
}
#Preview {
ContentView()
.modelContainer(for: Project.self, inMemory: true)
}
Post not yet marked as solved
Hello, my production app is experiencing some crashes according to app store analytics. I cannot seem to reproduce it.
According to Xcode Orginzer the app is crashing
10 SwiftUI 0x000000018ec372a0 PlatformViewHost.updateNestedHosts(_:colorSchemeChanged:) + 332 (PlatformViewHost.swift:699)
Distributor ID: com.apple.AppStore
Hardware Model: iPhone13,4
Version: 2.0.3 (86)
AppStoreTools: 15E204
AppVariant: 1:iPhone13,4:16
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
OS Version: iPhone OS 17.4.1 (21E236)
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Termination Reason: SIGNAL 6 Abort trap: 6
Triggered by Thread: 0
Kernel Triage:
VM - (arg = 0x3) mach_vm_allocate_kernel failed within call to vm_map_enter
VM - (arg = 0x3) mach_vm_allocate_kernel failed within call to vm_map_enter
VM - (arg = 0x3) mach_vm_allocate_kernel failed within call to vm_map_enter
VM - (arg = 0x3) mach_vm_allocate_kernel failed within call to vm_map_enter
VM - (arg = 0x3) mach_vm_allocate_kernel failed within call to vm_map_enter
Thread 0 name:
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001d1bd6974 __pthread_kill + 8 (:-1)
1 libsystem_pthread.dylib 0x00000001e56590ec pthread_kill + 268 (pthread.c:1717)
2 libsystem_c.dylib 0x0000000191627c14 __abort + 136 (abort.c:159)
3 libsystem_c.dylib 0x0000000191627b8c abort + 192 (abort.c:126)
4 libswiftCore.dylib 0x000000018832a690 swift::fatalErrorv(unsigned int, char const*, char*) + 136 (Errors.cpp:387)
5 libswiftCore.dylib 0x000000018832a6b0 swift::fatalError(unsigned int, char const*, ...) + 32 (Errors.cpp:395)
6 libswiftCore.dylib 0x0000000188324a08 getNonNullSrcObject(swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*, swift::TargetMetadata<swift::InProcess> const*) + 256 (DynamicCast.cpp:144)
7 libswiftCore.dylib 0x0000000188326510 tryCastToObjectiveCClass(swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*, swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*, swift::TargetMetadata<swift::InPro... + 88 (DynamicCast.cpp:510)
8 libswiftCore.dylib 0x0000000188324068 tryCast(swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*, swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*, swift::TargetMetadata<swift::InProcess> const*&, sw... + 992 (DynamicCast.cpp:2281)
9 libswiftCore.dylib 0x0000000188323b14 swift_dynamicCast + 208 (CompatibilityOverrideRuntime.def:109)
10 SwiftUI 0x000000018ec372a0 PlatformViewHost.updateNestedHosts(_:colorSchemeChanged:) + 332 (PlatformViewHost.swift:699)
11 SwiftUI 0x000000018ec36bf4 PlatformViewHost.updateEnvironment(_:viewPhase:) + 412 (PlatformViewHost.swift:690)
12 SwiftUI 0x000000018ec37bf8 PlatformViewHost.init(_:host:environment:viewPhase:importer:) + 808 (PlatformViewHost.swift:132)
13 SwiftUI 0x000000018ec36cf8 PlatformViewHost.__allocating_init(_:host:environment:viewPhase:importer:) + 92 (PlatformViewHost.swift:0)
14 SwiftUI 0x000000018ec0132c closure #1 in closure #1 in closure #4 in closure #1 in PlatformViewChild.updateValue() + 444 (PlatformViewRepresentable.swift:559)
15 SwiftUI 0x000000018ec06c58 partial apply for closure #1 in closure #1 in closure #4 in closure #1 in PlatformViewChild.updateValue() + 24 (<compiler-generated>:0)
16 SwiftUI 0x000000018ea26910 RepresentableContextValues.asCurrent<A>(do:) + 156 (RepresentableContextValues.swift:43)
17 SwiftUI 0x000000018ec01124 closure #1 in closure #4 in closure #1 in PlatformViewChild.updateValue() + 176 (PlatformViewRepresentable.swift:558)
18 SwiftUI 0x000000018ec0104c closure #4 in closure #1 in PlatformViewChild.updateValue() + 128 (PlatformViewRepresentable.swift:557)
19 SwiftUI 0x000000018ec06b2c partial apply for closure #4 in closure #1 in PlatformViewChild.updateValue() + 24 (<compiler-generated>:0)
20 SwiftUI 0x000000018de7b7d0 closure #1 in _withObservation<A>(do:) + 44 (ObservationUtils.swift:26)
21 SwiftUI 0x000000018ec06b50 partial apply for closure #1 in _withObservation<A>(do:) + 24 (<compiler-generated>:0)
22 libswiftCore.dylib 0x0000000187fd0068 withUnsafeMutablePointer<A, B>(to:_:) + 28 (LifetimeManager.swift:82)
23 SwiftUI 0x000000018ebffbdc closure #1 in PlatformViewChild.updateValue() + 3040 (PlatformViewRepresentable.swift:556)
24 SwiftUI 0x000000018d5ecbf8 partial apply for implicit closure #1 in closure #1 in closure #1 in Attribute.init<A>(_:) + 32 (<compiler-generated>:0)
25 AttributeGraph 0x00000001b2150240 AG::Graph::UpdateStack::update() + 512 (ag-graph-update.cc:578)
26 AttributeGraph 0x00000001b2146f38 AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 424 (ag-graph-update.cc:719)
27 AttributeGraph 0x00000001b2146810 AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 720 (ag-graph.cc:1429)
Post not yet marked as solved
When I build app on Xcode 15.3 with SWIFT_STRICT_CONCURRENCY=complete, there are some warning.
Almost warning can be fixed, but not the TipKit code.
Here is the example.
Are there any good way to solve it?
Post not yet marked as solved
Hello, I am doing to load model from bundle and it is loaded successfully. Now I am scaling model using GestureExtension from apple demo code. (https://developer.apple.com/documentation/realitykit/transforming-realitykit-entities-with-gestures?changes=_8)
@State private var selectedEntityName : String = ""
@State private var modelEntity: ModelEntity?
var body: some View {
contentView
.task {
do {
modelEntity = try await ModelEntity.loadArcadeMachine()
} catch {
fatalError(error.localizedDescription)
}
}
}
@ViewBuilder
private var contentView: some View {
if let modelEntity {
RealityView { content, attachments in
modelEntity.position = SIMD3<Float>(x: 0, y: -0.3, z: -5)
print(modelEntity.transform.scale)
modelEntity.transform.scale = [0.006, 0.006, 0.006]
content.add(modelEntity)
if let percentTextAttachment = attachments.entity(for: "percentage") {
percentTextAttachment.position = [0, 50, 0]
modelEntity.addChild(percentTextAttachment)
}
} update: { content, attachments in
// I want here to get updated scaling value and it is showing in RealityView attachmnt text.
} attachments: {
Attachment(id: "percentage") {
Text("\(modelEntity.name) \(modelEntity.scale * 100) %")
.font(.system(size: 5000))
.background(.red)
}
}
// This method am using for gesture support
.installGestures()
} else {
ProgressView()
}
}
}
Below code from GestureExtension
let state = EntityGestureState.shared
guard canScale, !state.isDragging else { return }
let entity = value.entity
if !state.isScaling {
state.isScaling = true
state.startScale = entity.scale
}
let magnification = Float(value.magnification)
entity.scale = state.startScale * magnification
state.magnifyValue = magnification
magnifyScale = Double(magnification)
print("Entity Name ::::::: \(entity.name)")
print("Scale ::::::: \(entity.scale)")
print("Magnification ::::::: \(magnification)")
print("StartScale ::::::: \(state.startScale)")
> This "magnification" value I need to use in RealityView class. How can i Do it? Could you please guide it.
}
Post not yet marked as solved
Hey all,
I have a very simple view that offsets some view based on the value of a binding. To calculate that offset, I also need to have the previous value of the binding. To have that, am using withAnimation().
I am also using a custom animation. To keep things simple, my custom animation right now is just a linear progression. I added some code to keep track of the number of times animate<>(:::) gets called.
Turns out, when I add .background(Color.green) to my Text(), the number of calls gets increased by 60 (per second of animation).
If .background(Color.green) gets added last (more precisely, after .offset(x: newOffset)), the background is not animated and the extra calls do not happen.
After reading the documentation and watching 'Demystifying SwiftUI', 'Demystifying SwiftUI performance' and various general SwiftUI and SwiftUI animation related WWDC sessions I am still feeling like I miss some basic understanding of SwiftUI animations.
Who can explain to me what is happening here and why? Or is the fact that animate<>(:::) gets called a number of times that is increasing linearly with the number of modifiers and number of subviews OK, and I should not be worried at all?
Relevant code below:
View:
struct TestView: View
{
@Binding
var offset: Double
@State
private var previousOffset: Double = 0
@State
private var isAnimatingToNewOffset = false
private let valuesInView = 20
var body: some View
{
GeometryReader { geometry in
let headingHeight: CGFloat = 80
let newOffset = isAnimatingToNewOffset ?
-(offset - previousOffset) / CGFloat(valuesInView) * geometry.size.width :
0
Text("Some text")
.frame(width: geometry.size.width)
.frame(height: headingHeight)
.offset(y: (geometry.size.height - headingHeight) / 2)
.background(Color.green) // moving this around, or removing it will cause the animate<>(:::) to be called a different number if times
.offset(x: newOffset)
}
.background(Color.gray)
.onChange(of: offset) { (oldValue, newValue) in
/// entering an animated change
isAnimatingToNewOffset = true
withAnimation(Animation(MyAnimation(duration: 1)))
{
// before updating, keep the value of the current offset
previousOffset = offSet
} completion:
{
// now update the previous offset to be ready for a new animation
previousOffset = offset
// trigger another update of the body, but now without animation
isAnimatingToNewOffset = false
}
}
}
}
My custom animation:
struct MyAnimation: CustomAnimation
{
/// just for debugging to understand how often this method gets called
private static var count = 0
let duration: TimeInterval
func animate<V>(value: V, time: TimeInterval, context: inout AnimationContext<V>) -> V? where V : VectorArithmetic
{
let relativeProgress = CGFloat(time / duration)
// print out the number of times this function is called, and with what value
print("\(String(format: "%02i", MyAnimation.count)) - \(String(format: "%1.2f", relativeProgress))")
MyAnimation.count += 1
guard time < duration else { return nil }
// keeping things simple for now, returning linear progress
return value.scaled(by: relativeProgress)
}
}
Post not yet marked as solved
I encountered a problem while using ScrollView in SwiftUI. When I perform a refresh, the app crashes. I access the array using an index in a ForEach loop. This is done to create new data from the array in a commonly used view. The function to create data is adopted from a protocol in the view model. I access it by index because the type of the array is not specified; each view using it may have a different data type. Below is an example code. Is it possible to access data from the array using an index? Every time I refresh, I get an "index out of range" error.
import SwiftUI
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
ScrollView {
if !viewModel.testValues.isEmpty {
LazyVStack(spacing: 20) {
ForEach(Array(zip(viewModel.testValues.indices, viewModel.testValues)), id:\.1) { index, data in
test(index: index, data: data, viewModel: viewModel)
.onAppear {
if !viewModel.isLoading, viewModel.testValues.count - 2 == index {
viewModel.fetch()
}
}
}
}
} else {
Text("tesetsetsetsettse")
}
}
.onAppear {
viewModel.fetch()
}
.refreshable {
viewModel.refresh()
}
}
}
struct test: View {
let index: Int
let data: String
@ObservedObject var viewModel: ViewModel
var body: some View {
VStack(spacing: 8) {
test1(index: index, data: data, viewModel: viewModel)
Text("------------------------")
}
}
}
struct test1: View {
let index: Int
let data: String
@ObservedObject var viewModel: ViewModel
var body: some View {
VStack {
Text(viewModel.testValues[index])
.font(.system(size: 12))
.foregroundStyle(Color.red)
.padding(.horizontal, 40)
.padding(.vertical, 50)
.background {
RoundedRectangle(cornerRadius: 20)
.fill(Color.blue)
}
}
}
}
class ViewModel: ObservableObject {
@Published var isLoading = false
@Published var testValues: [String] = []
func fetch() {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.testValues += [
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
UUID().uuidString,
]
}
}
func refresh() {
testValues = []
fetch()
}
}
Post not yet marked as solved
I am trying to present a GroupActivitySharingController using SwiftUI. I am using a NSViewControllerRepresentable:
@State var event : Event
func makeNSViewController(context: NSViewControllerRepresentableContext<MeetingGroupActivitySharingRepresentableView>) -> GroupActivitySharingController {
return try! GroupActivitySharingController(MeetingGroupActivity(event: event))
}
func updateNSViewController(_ nsViewController: GroupActivitySharingController , context: NSViewControllerRepresentableContext<MeetingGroupActivitySharingRepresentableView>) {
print("Updating VC")
}
}
I present it as following :
.sheet(isPresented: $showGroupActivitySharingView) {
MeetingGroupActivitySharingRepresentableView(event: observedEvent.event)
}
It works fine on iOS, however on MacOS, I cannot dismiss the view. I see the following error:
dismissViewController:: Error: maybe this view controller was not presented?
(
0 CoreFoundation 0x000000019d75accc __exceptionPreprocess + 176
1 libobjc.A.dylib 0x000000019d242788 objc_exception_throw + 60
2 Foundation 0x000000019e8cbc6c -[NSCalendarDate initWithCoder:] + 0
3 AppKit 0x00000001a145a77c -[NSViewController dismissViewController:] + 224
4 _GroupActivities_AppKit 0x0000000232d65cf0 $s23_GroupActivities_AppKit0A25ActivitySharingControllerC011dismissViewG06resultyAA0aeF6ResultO_tFyyYaYbScMYccfU_TY0_ + 444
5 _GroupActivities_AppKit 0x0000000232d67b65 $s23_GroupActivities_AppKit0A25ActivitySharingControllerC011dismissViewG06resultyAA0aeF6ResultO_tFyyYaYbScMYccfU_TATQ0_ + 1
6 _GroupActivities_AppKit 0x0000000232d68bd9 $sIeghH_ytIeghHr_TRTQ0_ + 1
7 _GroupActivities_AppKit 0x0000000232d68bdd $sIeghH_ytIeghHr_TRTATQ0_ + 1
8 _GroupActivities_AppKit 0x0000000232d66931 $sxIeghHr_xs5Error_pIegHrzo_s8SendableRzs5NeverORs_r0_lTRyt_Tg5TQ0_ + 1
9 _GroupActivities_AppKit 0x0000000232d68ba5 $sxIeghHr_xs5Error_pIegHrzo_s8SendableRzs5NeverORs_r0_lTRyt_Tg5TATQ0_ + 1
10 libswift_Concurrency.dylib 0x0000000263cfb0f9 _ZL23completeTaskWithClosurePN5swift12AsyncContextEPNS_10SwiftErrorE + 1
)
Any idea what is going on?
Post not yet marked as solved
Hello everyone!
I recently started to think to introduce in my app SplitView for iPads instead of TabView which I currently have. But I would like to keep the TabView for iPhone and compact size class of iPad. I took my inspiration from a lot of Apple apps, like Apple Music or Photos.
I was also looking at the Fruta app where similar technique is implemented, but that particular implementation does not fit my needs.
The problem I’m having is that every time SplitView changes to TabView or vise versa the whole state of the app resets. I tried everything I could imagine, I couldn’t find a way to overcome this issue. The only thing I was able to fix is to maintain the same tab/list item selection, but everything else resets.
Could anybody help me to resolve this issue?
Thanks!
Everything works as expected until I add the paging behavior to the scrollView with a non-zero content margin. The paging behavior ends up not being centered on the cards.
Here is a simple example:
import SwiftUI
struct CarouselView: View {
var body: some View {
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 0) {
ForEach(0 ..< 5, id: \.self) { _ in
RoundedRectangle(cornerRadius: 25)
.fill(.ultraThinMaterial)
.containerRelativeFrame(.horizontal)
.scrollTransition(axis: .horizontal, transition: {
content, phase in
content
.scaleEffect(x: phase.isIdentity ? 1 : 0.8, y: phase.isIdentity ? 1 : 0.8)
})
}
}
.scrollTargetLayout()
}
.scrollTargetBehavior(.paging)
.contentMargins(60) // NOTE: I want to see the sides of the next and previous card
.background(Gradient(colors: [.purple, .red]))
}
}
Thanks!
Post not yet marked as solved
Hi,
I'm developing an app using SwiftUI for both iOS and Mac OS and use onOpenURL to handle external links. However, this doesn't seem to work after switching to a single window app on Mac OS.
This code works:
WindowGroup {
Text("Hi").onOpenURL { url in
print("Open URL", url)
}
}
But this doesn't:
Window("My App", id: "my_app") {
Text("Hi").onOpenURL { url in
print("Open URL", url)
}
}
Anyone knows a workaround? Thanks!
Post not yet marked as solved
Hey folks,
Having some trouble getting Animations to behave properly. I'll try to explain what I am doing, but maybe it is easier to run the project, which you can clone from github here. The key is in commenting out line 32/33 and uncommenting lines 34/35 in GaugeView.swift
Otherwise: here is the high-level goal I'm aiming for:
I'd like to see a horizontal gauge, akin to a tape measure (ignore the colors in this example image ), but (initially) centered on zero, and extending both to negative and positive measures.
It will represent some value and that value can go up to a positive maximum number, and a minimum negative number. On overflow on either side, the tape measure should wrap-around.
For this, I would like to create the illusion of an infinite tape measure, that keeps moving as the values change.
There will be NO user interaction at all, the values are coming in from some device, and simply need to be displayed.
Now, the basic logic seems to work:
There is a tapemeasure view, which shows zero in the center. As a new value comes in, the view's offset gets animated to have the new value be in the center. At the end of the animation. The view's offset is reset to zero (without animation), and the view's content is updated to reflect the new center value.
In the current project there is only a single view, but the idea it that to the left and right of the visible view, there will be two other views to fill in the other parts. However, that is not relevant at the moment.
To support changes mid-animation, I've implemented a basic custom animation myself. This one allows me to measure how often animate<>(:::) gets called for now, but will be needed to make sure animations remain smooth when merging them.
The issue I run into is that that view with the actual contant contains a ForEach. And because of that, animate<>(:::) seems to be called many more times than I would expect. That number seems to be linearly related to the number of items in the ForEach. So I watched the WWDC session on view identy (Demystify SwiftUI), watched all animation-related sessions and tried to find some documatation on animations. Couldn't find what I was looking for.
When I replace the content view with a Rectangle(), the issue disappears.
So my question is: how to prevent a subview's changes to call animate(:::) so many times when a ForEach is present? Or maybe just block all internal animations of a subview? In essence I never need the content of the subview to be animated, only it's offset in the superview.
Post not yet marked as solved
I am trying to add capabilities in my Vision OS application but ending up in failure it doesn't add any with out any error or notifications is Apple disabled this feature or potentially a BUG
Post not yet marked as solved
Using a NavigationStack and manipulating the NavigationPath “too fast” compared to the animation of the screen can leed visual artifacts and invalid state.
For example, let's create simple stack and create a custom back button.
struct StepView: View {
let value: Int
let action: () -> Void
var body: some View {
VStack {
Text("\(value)")
Button("Next", action: action)
}
}
}
struct ContentView: View {
@State var navigationPath: [Int] = []
var body: some View {
VStack {
if !self.navigationPath.isEmpty {
Button("Back customg") {
self.navigationPath.removeLast()
}
}
Divider()
NavigationStack(path: self.$navigationPath) {
Text("Root")
Button("Next") {
self.navigationPath.append(1)
}
.navigationDestination(for: Int.self) { integer in
StepView(value: integer) {
self.navigationPath.append(integer + 1)
}.navigationBarBackButtonHidden()
}
}
}
.padding()
}
}
Clicking fast on the custom back button will displays some blank screens and may leed to a crash.
Is something missing the API usage ? 🤔
Post not yet marked as solved
I have view hierarchy like this:
NavigationView {
VStack {
ScrollView {
// some content
}
.background(NavigationLink(destination:
MyView(),
isActive: $isActive) {
EmptyView()
})
// snipped
}
}
When the user follows the navigation link to MyView, by default NavigationBar and MyView is laid out like in a VStack. How can I make them like in a ZStack(alignment: .topLeading) ? i.e. I like MyView extends beneath the NavigationBar.
Here is the MyView:
GeometryReader { geo in
HStack {
// some content
}
.onAppear {
hideNavigationbar = false
}
.onTapGesture(perform: {
hideNavigationbar.toggle()
})
.navigationBarHidden(hideNavigationbar)
.navigationBarTitleDisplayMode(.inline)
// snipped
}
The problem is, when hideNavigationbar toggles, MyView would shift up and down because its height would change. I want NavigationBar sits on top of MyView like in a ZStack so that when NavigationBar hides, MyView will not shift (only uncover its top portion).
What is the proper way to achieve that?
XCode: 15.3 using SwiftUI
iOS: 15
Post not yet marked as solved
Hi,
I am running into an error on XCode 15 (iOS 17+). When I am trying to play an iframe on the app. I see this error popup.
Warning: -[BETextInput attributedMarkedText] is unimplemented
Failed to request allowed query parameters from WebPrivacy.
How do I fix this issue? I never saw this before so I am sure it is new. The app use to run fine as well.