360-degree photo viewer in mobile app

NOVASOLUTIONS.TECHNOLOGY is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.
Development and support of all types of mobile applications:
Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1 servicesAll 1735 services
360-degree photo viewer in mobile app
Medium
~3-5 business days
FAQ
Our competencies:
Development stages
Latest works
  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    445

360-Degree Photo Viewer in Mobile App

360° photo — equirectangular image: spherical projection where 360° horizontal and 180° vertical packed into rectangle with 2:1 aspect ratio. On phone need to "unwrap" back into sphere and let user view from inside. Task not just showing picture — task is rendering sphere without distortion artifacts and scrolling smooth even on 50 megapixel JPEG.

Why Standard UIImageView or ImageView Doesn't Work

UIImageView displays flat image. For spherical projection need 3D render: sphere with inverted normals (to view from inside), equirectangular texture on it, camera at center, rotation control via gyroscope or touch.

SceneKit (SCNSphere) — fastest path on iOS. Metal — if full shader control needed. OpenGL ES on Android via GLSurfaceView or Vulkan for modern devices. Most projects use SceneKit on iOS and Filament/OpenGL ES 3.0 on Android.

iOS Implementation with SceneKit

let sceneView = SCNView(frame: view.bounds)
let scene = SCNScene()

// Sphere with inverted normals
let sphere = SCNSphere(radius: 10.0)
sphere.segmentCount = 96 // more segments = less distortion at poles
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = UIImage(named: "pano.jpg")
sphere.materials = [material]

let sphereNode = SCNNode(geometry: sphere)
sphereNode.scale = SCNVector3(-1, 1, 1) // invert normals
scene.rootNode.addChildNode(sphereNode)

let camera = SCNCamera()
camera.fieldOfView = 90
let cameraNode = SCNNode()
cameraNode.camera = camera
scene.rootNode.addChildNode(cameraNode)
sceneView.scene = scene

Control via gyroscope — CMMotionManager → Euler angles → SCNNode.rotation. Via touch — UIPanGestureRecognizer with angle accumulation. Inertia on swipe via SCNAction with easing, not physics — SceneKit physics adds unpredictable damping.

Loading Large Images Without OOM

50 megapixel JPEG after decoding to RGB takes ~150 MB in memory. On iPhone SE 2nd gen with 3 GB RAM that's already third of available memory — background processes get SIGKILL for memory pressure.

Solution — tiled loading via CATiledLayer or downscale before SceneKit:

// Progressive loading: preview 2048px first, then full resolution
let thumbnail = image.preparingThumbnail(of: CGSize(width: 4096, height: 2048))
material.diffuse.contents = thumbnail
// Asynchronously load full resolution
Task.detached(priority: .background) {
    let full = await loadFullResImage(url: imageURL)
    await MainActor.run { material.diffuse.contents = full }
}

preparingThumbnail(of:) — async API (iOS 15+), decodes in background thread without main run loop blocking.

Google Photo Sphere XMP Metadata Support

Panorama cameras and Google Street View write JPEG XMP metadata with projection type and crop info (GPano:ProjectionType, GPano:CroppedAreaImageWidthPixels). Without reading incomplete panorama (270° instead 360°) shows as complete — with stretched edges.

Read via CGImageSourceCopyPropertiesAtIndex → XMP metadata → parse GPano:* fields, correct UV-mapping. This 30–50 lines code but without it third of real panoramas look wrong.

Android

Use Filament (Google's physically-based renderer) or Panorama360View via GLSurfaceView. Filament requires more setup but gives correct tone mapping for HDR panoramas.

Timeline

Basic viewer (iOS, SceneKit, gyroscope + touch): 1–1.5 weeks. Full implementation with tiled loading, XMP metadata, iOS + Android: 3–4 weeks. Cost calculated individually.