Eu tenho várias anotações que quero adicionar ao meu MKMapView (poderia 0-n itens, onde n é geralmente em torno de 5). Posso adicionar as anotações sem problemas, mas quero redimensionar o mapa para caber todas as anotações na tela de uma vez e não tenho certeza de como fazer isso.
Estive olhando, -regionThatFits:
mas não tenho certeza do que fazer com ele. Vou postar algum código para mostrar o que tenho até agora. Acho que isso deve ser uma tarefa geralmente simples, mas estou me sentindo um pouco sobrecarregado com o MapKit até agora.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
location = newLocation.coordinate;
//One location is obtained.. just zoom to that location
MKCoordinateRegion region;
region.center = location;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];
// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
float ex = 0.01;
for (NSString *s in arr) {
JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
[mapView addAnnotation:placemark];
ex = ex + 0.005;
}
// What do I do here?
[mapView setRegion:[mapView regionThatFits:region] animated:YES];
}
Observe, tudo isso acontece quando recebo uma atualização de local ... Não sei se esse é um lugar apropriado para fazer isso. Se não, qual seria o melhor lugar? -viewDidLoad
?
Desde já, obrigado.
fonte
MKMapView
e alterei o método para- (void) zoomToFitAnnotations:(BOOL)animated
. Funciona perfeitamente!Por que tão complicado?
fonte
[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f) animated:animated];
CLLocationCoordinate2D *coords
array? Usandomalloc()
?r
que basicamenteCGFloat zoomOutPercent = 0.2f; r = MKMapRectMake(r.origin.x-r.size.width*zoomOutPercent, r.origin.y-r.size.height*zoomOutPercent, r.size.width*(1+zoomOutPercent*2), r.size.height*(1+zoomOutPercent*2));
Fiz algo semelhante a isso para diminuir o zoom (ou aumentar) em uma área que incluía uma anotação de ponto e a localização atual. Você pode expandir isso percorrendo suas anotações.
As etapas básicas são:
fonte
MKCoordinateRegionMake
: gist.github.com/1599700 no caso de alguém ainda querer fazer assim.Eu tenho uma resposta diferente. Eu ia implementar o algoritmo zoom-to-fit sozinho, mas percebi que a Apple deve ter uma maneira de fazer o que queríamos sem muito trabalho. Usar a API doco rapidamente mostrou que eu poderia usar MKPolygon para fazer o que fosse necessário:
Espero que isto ajude.
fonte
você também pode fazer assim ..
fonte
Com base nas informações e sugestões de todos, descobri o seguinte. Obrigado a todos nesta discussão por contribuírem :) Isso iria na visualização Controller que contém o mapView.
fonte
No meu caso, estou começando com objetos CLLocation e criando anotações para cada um deles.
Eu só preciso colocar duas anotações, então tenho uma abordagem simples para construir a matriz de pontos, mas ela poderia ser facilmente expandida para construir uma matriz com um comprimento arbitrário dado um conjunto de CLLocations.
Esta é minha implementação (não requer a criação de MKMapPoints):
fonte
Usando Swift, um polígono e algum preenchimento extra, usei o seguinte:
fonte
Há um novo método em 'MKMapView' a partir do iOS 7 que você pode usar
fonte
Eu sei que esta é uma pergunta antiga, mas se você quiser exibir todas as anotações JÁ NO mapa use isto:
fonte
Aqui está o equivalente SWIFT (trabalho confirmado em: Xcode6.1, SDK 8.2) para as respostas de Mustafa:
fonte
Uma solução possível pode ser medir a distância entre o local atual e todas as anotações e usar o método MKCoordinateRegionMakeWithDistance para fazer uma região que tem uma distância ligeiramente maior do que a anotação mais distante.
É claro que isso ficaria mais lento quanto mais anotações você adicionasse.
fonte
fonte
Com base na excelente resposta de
me2
(agora em Swift)fonte
Adicionada uma pequena cláusula if para lidar com 1 local - para adicionar ao trecho de código cound de mustufa. Usei a função zoomToAnnotation de pkclSoft para isso:
fonte
este código funciona para mim, mostra todos os pinos com a localização atual, espero que isso ajude você,
fonte
Espero que seja pelo menos relevante, é o que eu criei para Mono (baseado na resposta de pkclSoft):
fonte
fonte
Com base na resposta me2, escrevi uma categoria para MKMapView para adicionar algumas margens e pular a anotação de localização do usuário:
fonte
Como não posso comentar uma resposta, gostaria de acrescentar minha conveniência à resposta de @ me2 (pois achei que era a abordagem mais elegante encontrada aqui).
Para meu projeto pessoal, simplesmente adicionei uma categoria na classe MKMapView para encapsular a funcionalidade de "área visível" para uma operação muito comum: configuração para poder ver todas as anotações carregadas atualmente na instância MKMapView. o resultado foi este:
arquivo .h
arquivo .m
Como você pode ver, eu adicionei 2 métodos até agora: um para definir a região visível do mapa para aquele que se ajusta a todas as anotações carregadas atualmente na instância de MKMapView e outro método para defini-la para qualquer array de objetos. Portanto, para definir a região visível do mapView, o código seria tão simples como:
Espero que ajude =)
fonte
Considere esta extensão:
fonte
Uma versão 5 rápida:
fonte