Estou usando o MKMapView e adicionei vários pinos de anotação ao mapa em uma área de 5 a 10 quilômetros. Quando executo o aplicativo, meu mapa começa com o zoom reduzido para mostrar o mundo inteiro, qual é a melhor maneira de aplicar zoom no mapa para que os pinos se ajustem à visualização?
Edição: Meu pensamento inicial seria usar MKCoordinateRegionMake e calcular o centro de coordenadas, longitudeDelta e latitudeDelta das minhas anotações. Tenho certeza de que isso funcionará, mas eu só queria verificar se não estava perdendo nada óbvio.
Código adicionado, BTW: FGLocation é uma classe em conformidade com MKAnnotation
, locationFake é um NSMutableArray
desses objetos. Comentários são sempre bem-vindos ....
- (MKCoordinateRegion)regionFromLocations {
CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];
// FIND LIMITS
for(FGLocation *eachLocation in locationFake) {
if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
}
// FIND REGION
MKCoordinateSpan locationSpan;
locationSpan.latitudeDelta = upper.latitude - lower.latitude;
locationSpan.longitudeDelta = upper.longitude - lower.longitude;
CLLocationCoordinate2D locationCenter;
locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
locationCenter.longitude = (upper.longitude + lower.longitude) / 2;
MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
return region;
}
ios
objective-c
iphone
cocoa-touch
mkmapview
fuzzygoat
fonte
fonte
Respostas:
Você acertou.
Encontre suas latitudes e longitudes máximas e mínimas, aplique aritmética simples e use
MKCoordinateRegionMake
.Para iOS 7 e superior, use
showAnnotations:animated:
, deMKMapView.h
:fonte
// Position the map such that the provided array of annotations are all visible to the fullest extent possible.
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
showAnnotations
também adiciona as anotações ao mapa, mesmo que já exista uma anotação para esse local.removeAnnotations(_ annotations:)
imediatamente apósshowAnnotations(_ annotations:animated)
Foi o que encontrei aqui que funcionou para mim:
(EDIT: eu atualizei a solução usando a sugestão de @ Micah para aumentar o pointRect em 0,1 para garantir que o rect não acabe sendo infinitesimalmente pequeno!)
Você também pode atualizar isso para incluir o pino userLocation substituindo a primeira linha por:
fonte
A Apple adicionou um novo método para o IOS 7 para simplificar um pouco a vida.
Você pode facilmente extrair de uma matriz armazenada na visualização do mapa:
e ajuste rapidamente a câmera também!
isso não funcionará, a menos que o usuário tenha o iOS 7+ ou OS X 10.9+ instalado. confira animação personalizada aqui
fonte
showAnnotations
isso não faz com que as anotações se aproximem mais do que a implementação manual, por isso fiquei com a manual.Eu uso este código e funciona bem para mim:
fonte
Em uso rápido
No objetivo c
fonte
mapView.showAnnotations(mapView.annotations, animated: true)
Eu converti a resposta por Rafael Moreira. O crédito vai para ele. Para aqueles que procuram a versão Swift, aqui está o código:
fonte
Swift 3 Esta é a maneira correta de ajustar todas as anotações no mapa.
fonte
A solução da @ jowie funciona muito bem. Uma captura, se um mapa tiver apenas uma anotação, você terminará com um mapa totalmente ampliado. Adicionei 0,1 ao tamanho de retângulo para garantir que setVisibleMapRect tenha algo para ampliar.
fonte
Se você procura o iOS 8 e superior , a maneira mais simples de fazer isso é definir a
var layoutMargins: UIEdgeInsets { get set }
visualização do mapa antes de ligarfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)
Por exemplo (Swift 2.1):
fonte
Criei uma extensão para mostrar todas as anotações usando algum código daqui e dali rapidamente. Isso não mostrará todas as anotações se elas não puderem ser mostradas, mesmo no nível máximo de zoom.
fonte
UIEdgeInsetsMake
parâmetros, valores entre 30 e 100 foram bons para mim. Eu estava testando usando o iPhone SE i) S 10.2 Simulator. Código exemplo:setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Como uma observação, este código funciona no Swift 3 e no XCode 8.2.1.Adicionado este loop If no loop for para excluir o pino de localização dos usuários desse método (obrigatório no meu caso e talvez outros)
fonte
Para iOS 7 e superior (referente ao MKMapView.h):
observação de - Abhishek Bedi
Você acabou de ligar para:
fonte
Na Swift
fonte
// Editado para o swift 5
fonte
Graças a jowie, atualizei minha categoria antiga para uma solução mais elegante. Compartilhamento de solução completa, quase copiar e colar
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
Espero que ajude alguém e obrigado novamente jowie!
fonte
fonte
Como Abhishek Bedi aponta em um comentário, para iOS7, a melhor maneira de fazer isso é:
Para o meu projeto pessoal (antes do iOS7), simplesmente adicionei uma categoria na classe MKMapView para encapsular a funcionalidade "área visível" para uma operação muito comum: configurando-a para poder ver todas as anotações atualmente carregadas na instância do MKMapView ( isso inclui quantos pinos você tiver colocado, bem como a localização do usuário). o resultado foi o seguinte:
arquivo .h
arquivo .m
Como você pode ver, adicionei dois métodos até agora: um para definir a região visível do mapa para a que se encaixa em todas as anotações atualmente carregadas na instância MKMapView e outro para defini-lo para qualquer matriz de objetos. Portanto, para definir a região visível do mapView, o código seria tão simples quanto:
Espero que ajude =)
fonte
Todas as respostas nesta página assumem que o mapa ocupa a tela inteira . Na verdade, eu tenho uma tela HUD (ou seja, botões espalhados na parte superior e inferior) que fornece informações sobre o mapa. Portanto, os algoritmos da página exibem os pinos corretamente, mas alguns deles aparecerão em os botões da tela HUD .
Minha solução amplia o mapa para exibir as anotações em um subconjunto da tela e funciona para diferentes tamanhos de tela (por exemplo, 3,5 "vs 4,0" etc):
Aqui está o que eu fiz no código (nota: eu uso
NSConstraints
com alguns métodos auxiliares para fazer meu código funcionar em diferentes tamanhos de tela .. enquanto o código é bastante legível .. minha resposta aqui explica melhor .. é basicamente o mesmo fluxo de trabalho :)Aqui está o código que obtém a região que se encaixa:
fonte
Fiz uma pequena modificação no código de Rafael para a categoria MKMapView.
fonte
Com base nas respostas acima, você pode usar o método universal para ampliar o mapa para caber em todas as anotações e sobreposições ao mesmo tempo.
E depois:
fonte
Apenas compartilhando minhas observações sobre isso:
Se você estiver usando xCode> 6 com tamanhos "inferidos" para as telas (consulte "métricas simuladas" no inspetor de arquivos) no storyboard, chamando
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated
in
viewDidLoad
resultará em um nível de zoom muito grande em iPhones de 4 polegadas, porque o layout do mapa ainda é do tamanho das telas mais amplas do storyboard.Você pode mover sua chamada para
showAnnotations...
paraviewDidAppear
. Em seguida, o tamanho do mapa já foi ajustado para a tela menor de um iPhone 4.Ou, alternativamente, altere o valor "inferido" no inspetor de arquivos em "métricas simuladas" para iphone de 4 polegadas.
fonte
Você pode selecionar quais formas deseja mostrar junto com as anotações.
fonte
@ "Não tenho certeza se isso é devido a alguns outros fatores na minha implementação, mas acho que showAnnotations não faz o zoom / ajuste das anotações mais do que a implementação manual, então fiquei com o manual. - Ted Avery 17 de abril às 0:35 "
Eu tive o mesmo problema, mas tentei fazer o showAnnotations duas vezes (como abaixo) e, por algum motivo, funcionou.
[mapView showAnnotations: yourAnnotationArray animated: YES]; [mapView showAnnotations: yourAnnotationArray animated: YES];
fonte
Uma maneira compatível com o iOS 7 é usar o seguinte. Primeira chamada
showAnnotation
para obter um retângulo, incluindo todas as anotações. Depois, crie eUIEdgeInset
com uma inserção superior da altura do pino. Assim, você garante mostrar o pino inteiro no mapa.fonte
Coloque isso no seu código de acordo:
fonte