Git Product home page Git Product logo

mytrack's Introduction

MyTrack

Приложение iOS для трекинга прогулок.

Shot

Начало

Я хотел научится работать с картой, получать координаты и обрабатывать их. Попытаться реализовать большинство возможных функций Google Maps SDK:

  • рисование и окрашивание сплайна;
  • установка маркера на картк;
  • перемещение камеры на карте;
  • обрабатывает получаемые данные и показывать их в понятном виде.

Содержание

Возможности

Главный экран реализован с использованием Google Maps SDK. Приложение по кнопке СТАРТ начинает создавать трек пользователя по координатам. Отображается путь полилинией, которая окрашивается в цвет исходя из скорости перемещения пользователя с устройством. Для понимания логики окрашивания, есть выбор настройки типа прогулки внизу экрана. При прогулке есть скорость, путь и время, эти данные приложение показывает в удобном отформатированном варианте. При завершении трекинга, по кнопке ФИНИШ, приложение сохраняет трек. Прогулки можно увидеть по кнопке список. В ячейках трека приводится сводная информация и название района прогулки.

Реализация

Библиотеки

UIKit

Интерфейс приложения реализован классическим способом. За координацию контроллеров отвечает Coordinator. У каждого flow есть свой storyboard. Передаются данные между контроллерами через замыкание.

private func showTrackModule(with track: Track? = nil) {
guard let controller = UIStoryboard(name: "Track", bundle: nil).instantiateViewController(withIdentifier: "TrackViewController") as? TrackViewController else { return }
controller.onUser = { [weak self] in
self?.showUserModule()
}
controller.onTracks = { [weak self] in
self?.showTracksModule()
}
if let track = track {
controller.trackManager = TrackManager(track: track)
}
let rootController = UINavigationController(rootViewController: controller)
setAsRoot(rootController)
self.rootController = rootController
}

Google Maps SDK

Показ карты на экране и навигацию по нему осуществляет Google Maps SDK. Код начальной настройки.

private func configureMap() {
mapView.isMyLocationEnabled = true
let camera = GMSCameraPosition.camera(withTarget: mapView.myLocation?.coordinate ?? CLLocationCoordinate2D(latitude: -180, longitude: -180), zoom: zoom)
mapView.camera = camera
mapView.padding = UIEdgeInsets(top: 64, left: 32, bottom: (uiView.frame.height + 32), right: 32)
mapView.delegate = self
mapView.settings.compassButton = true
mapView.settings.myLocationButton = true
}

Создание сплайна осуществляется следующей функцией

private func createRoute(for locations: [CLLocation]? = nil) {
route = GMSPolyline()
let spans: [GMSStyleSpan] = []
route?.spans = spans
routePath = GMSMutablePath()
route?.strokeWidth = strokeWidth
route?.map = mapView
locations?.forEach { location in
routePath?.add(location.coordinate)
let span = GMSStyleSpan.getColor(by: location.speed)
route?.spans?.append(span)
}
route?.path = routePath
}

Установка маркера на карту

private func marker(on coordinate: CLLocationCoordinate2D) -> GMSMarker {
let marker = GMSMarker(position: coordinate)
marker.appearAnimation = .pop
marker.map = mapView
return marker
}

RealmSwift

Хранения треков пользователя и точек локаций в нем

class Track: Object {
@Persisted var startTime: Date = Date.now
@Persisted var finishTime: Date = Date.now + 1
@Persisted var distance: Double = 0.0
@Persisted var locations: List<Location>
}

RxSwift

  • Подписки для обновления данных трека
  • Подписки для заполнение полей логина и пароля

Auth

TODO

  • Добавить FireBase для сохранения профиля пользователя и его координат
  • Добавить на окно профиля возможность загрузки фотографии пользователя и свойства

mytrack's People

Contributors

dendmitriev avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

ashikur09

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.