Usando MapBox com RubyMotion e CocoaPods

Se você tentou a única linha, pod MapBoxsabe que seu aplicativo não compilará. Veja como consertar isso.


O problema e a solução

Usando cocoapods de movimento e cocoapods você esperaria que pod 'MapBox'funcionasse. Se você adicionar essas duas linhas após o app.pods do ...bloqueio, estará pronto para prosseguir:

app.libs.delete_if { |lib| lib =~ /Proj4/ }
app
.vendor_project('vendor/Pods/MapBox/Proj4', :static, products: ['libProj4.a'])

Pode ser necessário remover os diretórios vendore buildantes de compilar. Especialmente se você já tentou rakee fez explodir.

(Há um Rakefile e Gemfile de amostra completo no final desta página)

Versão mais longa: configuração do projeto

  1. Para experimentar em um novo projeto, execute motion create --template=ios someappname
  2. Certifique-se de ter uma referência de Gemfile cocoapodsemotion-cocoapods
  3. Execute bundle installna linha de comando
  4. Certifique-se de que seu Rakefile tenha pelo menos tudo no rakefile de amostra no final desta página

Fazendo um mapa

Para testá-lo, você precisa fazer um novo UIViewController (que exibe um mapa):

class MapViewController < UIViewController
def viewDidLoad
super

tiles
= RMMapBoxSource.alloc.initWithMapID "examples.map-z2effxa8"
map
= RMMapView.alloc.initWithFrame(UIScreen.mainScreen.bounds,andTilesource:tiles)
map
.zoom = 14
map
.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth
map
.delegate=self
self.view.addSubview(map)

center_co
= CLLocationCoordinate2D.new(40.7143528,-74.00597309999999)
map
.setCenterCoordinate(center_co,animated:true)

end
end

E mude seu app_delegate.rbarquivo para exibir o controlador:

class AppDelegate
def application(application, didFinishLaunchingWithOptions:launchOptions)
@window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)

mvc
= MapViewController.alloc.init

@window.rootViewController = mvc
@window.makeKeyAndVisible
true
end
end

Corra rakee pronto!

Cenário

Rastreamento de localização do usuário bônus em uma linha

Adicione isso ao seu controlador

map.userTrackingMode = 1

E obtenha um rastreador de localização em seu mapa:

Cenário


Notas

  • Às vezes map.setCenterCoordinate(CLLocationCoordinate2D.new(40.7143528,-74.00597309999999),animated:true)trava o REPL, mas sempre funciona bem em arquivos .rb.
  • Em app_delegate.rb, você pode substituir @windowpor $window, mas windownão funcionará.
  • Você não precisa map.delegate=selfsimplesmente mostrar um mapa em seu controlador, mas precisará configurá-lo para funcionar com marcadores e outros objetos de mapa.
  • As classes do pod que você adicionou não estão resolvendo? Removendo os vendore builddiretórios e re-executar rakegeralmente corrige isto.

Sample Rakefile

$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'
Bundler.require

Motion::Project::App.setup do |app|

app
.pods do
pod
'MapBox'
end
app
.libs.delete_if { |lib| lib =~ /Proj4/ }
app
.vendor_project('vendor/Pods/MapBox/Proj4', :static, products: ['libProj4.a'])


#Optional--will come in handy if you do a lot of mapping/geolocation.
app
.frameworks += ["QuartzCore","CoreLocation","CoreMedia","MapKit"]
app
.pods do
pod
'NSData+Base64'
end
end

Sample Gemfile

source 'https://rubygems.org'
gem
'cocoapods'
gem
'motion-cocoapods'

Versões

  • movimento (2.0)
  • rubi (2.0.0)
  • gema: cocoapods (0,20.2)
  • gema: cocoapods-core (0,20.2)
  • gem: motion-cocoapods (1.3.2)
  • pod: MapBox (1.0.2)