/arcorelocation

A lightweight iOS framework for displaying AR content at real-world coordinates

Primary LanguageSwiftMIT LicenseMIT

ARCoreLocation

ARCoreLocation is a lightweight and configurable iOS framework for displaying AR content at real-world coordinates.

Features:

• Easily create AR scenes that place AR objects in the real world

• Place AR objects at any geographic location without worrying about ARKit's implementation details

• Receive tap events on your AR content

• Receive events when AR content overlaps on-screen

Installation

CocoaPods

Enter this in your Podfile:

pod 'ARCoreLocation', '~> 0.1.10'

Then run pod install. Remember to import ARCoreLocation in any file where you want to use it!

Usage

Setup

Create the ARLandmarker and add its view:

let landmarker = ARLandmarker(view: ARSKView(), scene: InteractiveScene(), locationManager: CLLocationManager())
landmarker.view.frame = self.view.bounds
landmarker.scene.size = self.view.bounds.size
self.view.addSubview(landmarker.view)

Add Landmarks to the scene:

let landmarkLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 75, height: 20))
landmarkLabel.text = "Statue of Liberty"
let location = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 40.689234, longitude: -74.044524), altitude: 30, horizontalAccuracy: 5, verticalAccuracy: 5, timestamp: Date())
landmarker.addLandmark(view: landmarkLabel, at: location, completion: nil)

User Interaction

Get User Interaction events:

landmarker.delegate = self

...

extension ViewController: ARLandmarkerDelegate {
    func landmarkDisplayer(_ landmarkDisplayer: ARLandmarker, didTap landmark: ARLandmark) {
        ...
    }
    
    func landmarkDisplayer(_ landmarkDisplayer: ARLandmarker, didFailWithError error: Error) -> Void {
        ...
    }
}

Overlapping Landmarks

Use different strategies for overlapping landmarks:

landmarker.overlappingLandmarksStrategy = .showAll
landmarker.overlappingLandmarksStrategy = .showNearest
landmarker.overlappingLandmarksStrategy = .showFarthest
landmarker.overlappingLandmarksStrategy = .custom(callback: { (overlappingLandmarkGroups, notOverlappingLandmarks) in
    // Check overlapping groups and react accordingly
})

Request the landmarker to check for overlapping landmarks at a given interval:

// Check for overlaps every second
landmarker.beginEvaluatingOverlappingLandmarks(atInterval: 1)
...
landmarker.stopEvaluatingOverlappingLandmarks()

Or check for overlapping landmarks immediately

// ... Or check immediately
landmarker.evaluateOverlappingLandmarks()