When the user drags the elevation chart it runs chart's `selected point` update mechanism by calling the `onSelectedPointChanged` inside the `ChartView`'s ` func chartPreviewView(_ view: ChartPreviewView, didChangeMinX minX: Int, maxX: Int)`. This updates may be quite often (tens/hundreds per sec) and may cause the `on point update` callback **recursion** and overloads the `layoutSubviews` method on the _short track_ because the ChartView doesnt have mechanism to skip excessive updates when the parameters the same. This situation produces fail with internal error `(null) in -[NSISEngine _flushPendingRemovals] ().` The fix include: 1. skip updates when the current point isn't changed 2. remove layoutSubviews overloading (this method should recalc the layout immediately and should not be called too frequent, the `setNeedsLayout` allows to batch the layout updates and redraw the view on the next runtime cycle) Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
Project Intro | Governance | FAQ | Contribute | Donate | Keep Connected
CoMaps
Hike, Bike, Drive Offline - Easy Map Navigation with Privacy
A community-led free & open source maps app based on OpenStreetMap, built for transparency, privacy, and not-for-profit values. A fork of Organic Maps, originally based on Maps.ME.
⚡️ Highlights
- Offline-first: Navigate without a connection
- Privacy-respecting: No tracking, ads or data collection
- Lightweight: Battery- and space-efficient
- Simple: Polished, user-focused interface
- Cross-platform: Available for Android, iOS, MacOS, and Linux.
- Community-built: Free, open source, and collaborative
- Transparent: Open finances and governance
🚀 Main Features
-
Downloadable detailed maps with places which are not available with Google Maps
-
Outdoor mode with highlighted hiking trails, campsites, water sources, peaks, contour lines, etc
-
Walking paths and cycleways
-
Points of interest like restaurants, gas stations, hotels, shops, sightseeings and many more
-
Search by name or an address or by point of interest category
-
Navigation with voice announcements for walking, cycling, or driving
-
Bookmark your favorite places with a single tap
-
Offline Wikipedia articles
-
Subway transit layer and directions
-
Track recording
-
Export and import bookmarks and tracks in KML, KMZ, GPX formats
-
A dark mode to use during the night
-
Improve map data for everyone using a basic built-in editor
-
Android Auto and CarPlay support
Freedom Is Here – Navigate the world with privacy and community at the forefront.
🤝 Contributing
You can help by donating, contributing code, translating, or by telling others about it. To build the best maps app there is a need for software development, design, product, community development, and other areas. Reach out to us and let us know how you want to help.
- Build instructions: docs/INSTALL.md
- Contribution guide: docs/CONTRIBUTING.md
There is a dedicated Zulip chat for active contributors.
💬 Feedback
- Rate us on App Store and Google Play
- Star our repos on Codeberg
- Report bugs or request features on the issue tracker
💸 Funding
CoMaps is free. To fund development, we rely on your voluntary support ♥️
Donate via OpenCollective or Liberapay.
The project's financial information is completely open and transparent at our Open Collective.
🔒 Privacy
The Android app has been reviewed by Exodus Privacy.
To verify the APK, use the following signing certificate fingerprints:
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
⚖️ License
Licensed under the Apache License 2.0.
See LICENSE, NOTICE, and data/copyright.html.





