Post

Replies

Boosts

Views

Activity

Importing data via .csv file
I am relatively new to swiftUI and curious to hear what would be a good approach to import a csv file into an app. The file has around 3000 rows and 12 columns. The file will be updated with new information frequently (at least once or twice a week) so it is important that when a user launches the app the most updated data is always available. Appreciate any ideas or resources I can check to learn more about this. Thank you
5
0
4.9k
Sep ’20
Overlaying different swiftUI views depending on the image detected with ARkit app.
I have code that detects images via ARkit. When an image is detected, a swiftUI view is placed on top of the image. My code can detect the images, however I am only able to overlay one swiftUI view. I'd like the code to be responsive so that it can identify the image and place the appropriate view on top of it. Code below: Code for SwiftUI imageOne.swift file import SwiftUI struct imageOne: View { &#9;&#9;&#9;&#9;var body: some View { &#9;&#9;&#9;&#9;&#9; Text("hello imageOne") &#9;&#9;} } Code for SwiftUI imageTwo.swift file import SwiftUI struct imageTwo: View { &#9;&#9;&#9;&#9;var body: some View {&#9; &#9;&#9;&#9;&#9;&#9; Text("hello imageTwo") &#9;&#9;} } Code for ViewController.swift file import UIKit import SceneKit import ARKit import SwiftUI class ViewController: UIViewController, ARSCNViewDelegate { &#9;&#9;@IBOutlet var sceneView: ARSCNView! &#9;&#9; &#9;&#9;override func viewDidLoad() { &#9;&#9;&#9;&#9;super.viewDidLoad() &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;sceneView.delegate = self &#9;&#9;&#9;&#9; &#9;&#9;} &#9;&#9; &#9;&#9;override func viewWillAppear(_ animated: Bool) { &#9;&#9;&#9;&#9;super.viewWillAppear(animated) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;let configuration = ARImageTrackingConfiguration() &#9;&#9;&#9;&#9;guard let trackingImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;fatalError("Couldn't load tracking images") &#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;configuration.trackingImages = trackingImages &#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;configuration.maximumNumberOfTrackedImages = 2 &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;sceneView.session.run(configuration) &#9;&#9;} &#9;&#9;&#9;&#9; &#9;&#9; &#9;&#9;override func viewWillDisappear(_ animated: Bool) { &#9;&#9;&#9;&#9;super.viewWillDisappear(animated) &#9;&#9;&#9;&#9; &#9; &#9;&#9;&#9;&#9;sceneView.session.pause() &#9;&#9;} &#9;&#9; &#9;&#9;func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;guard let imageAnchor = anchor as? ARImageAnchor else {return nil} &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9; height: imageAnchor.referenceImage.physicalSize.height) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;let planeNode = SCNNode(geometry: plane) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;planeNode.eulerAngles.x = -.pi / 2 &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;imageOneController(for: planeNode) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;let node = SCNNode() &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;node.addChildNode(planeNode) &#9;&#9;&#9;&#9; &#9;&#9; &#9;&#9;&#9;&#9;return node &#9;&#9;&#9;&#9;&#9;&#9; } &#9; func imageOneController(for node: SCNNode) { &#9;&#9; &#9;&#9; &#9;&#9;let imageOneView = UIHostingController(rootView: imageOne()) &#9;&#9; &#9;&#9;DispatchQueue.main.async { &#9;&#9;&#9;&#9;imageOneView.willMove(toParent: self) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.addChild(imageOneView) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;imageOneView.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.view.addSubview(imageOneView.view) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.showImageOne(hostingVC: imageOneView, on: node) &#9;&#9;&#9;&#9; &#9;&#9;} &#9;&#9; &#9;&#9;} func imageTwoController(for node: SCNNode) { &#9;&#9; &#9;&#9; &#9;&#9;let imageTwoView = UIHostingController(rootView: imageTwo()) &#9;&#9; &#9;&#9;DispatchQueue.main.async { &#9;&#9;&#9;&#9;imageTwoView.willMove(toParent: self) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.addChild(imageTwoView) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;imageTwoView.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.view.addSubview(imageTwoView.view) &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.showImageTwo(hostingVC: imageTwoView, on: node) &#9;&#9;&#9;&#9; &#9;&#9;} &#9;&#9; &#9;&#9;} &#9;&#9; func showImageOne(hostingVC: UIHostingController<imageOne>, on node: SCNNode) { &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;let material = SCNMaterial() &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;hostingVC.view.isOpaque = false &#9;&#9;&#9;&#9;material.diffuse.contents = hostingVC.view &#9;&#9;&#9;&#9;node.geometry?.materials = [material] &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;hostingVC.view.backgroundColor = UIColor.clear &#9;&#9;&#9;&#9; &#9;&#9;} &#9; func showImageTwo(hostingVC: UIHostingController<imageTwo>, on node: SCNNode) { &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;let material = SCNMaterial() &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;hostingVC.view.isOpaque = false &#9;&#9;&#9;&#9;material.diffuse.contents = hostingVC.view &#9;&#9;&#9;&#9;node.geometry?.materials = [material] &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;hostingVC.view.backgroundColor = UIColor.clear &#9;&#9;&#9;&#9; &#9;&#9;} &#9;&#9; } &#9;&#9;&#9;&#9; The images on my AR Resource are also called imageOne and imageTwo, same each of the swiftUI views
4
0
1.7k
Aug ’20