Atualmente estou trabalhando com o mapkit e estou preso.
Estou usando uma visualização de anotação personalizada e desejo usar a propriedade image para exibir o ponto no mapa com meu próprio ícone. Eu tenho isso funcionando bem. Mas o que eu também gostaria de fazer é substituir a visualização de texto explicativo padrão (a bolha que aparece com o título / subtítulo quando o ícone de anotação é tocado). Eu quero ser capaz de controlar o texto explicativo em si: o mapkit fornece acesso apenas às visualizações de texto explicativo auxiliares esquerda e direita, mas nenhuma maneira de fornecer uma visualização personalizada para o balão de texto explicativo, ou dar a ele tamanho zero, ou qualquer outra coisa.
Minha ideia era substituir selectAnnotation / deselectAnnotation em my MKMapViewDelegate
e, em seguida, desenhar minha própria visualização personalizada fazendo uma chamada para minha visualização de anotação personalizada. Isso funciona, mas apenas quando canShowCallout
está definido como YES
na minha classe de visualização de anotação personalizada. Esses métodos NÃO são chamados se eu tiver definido como NO
(que é o que eu quero, para que o balão de texto explicativo padrão não seja desenhado). Portanto, não tenho como saber se o usuário tocou em meu ponto no mapa (o selecionou) ou tocou em um ponto que não faz parte de minhas visualizações de anotação (o excluiu) sem que a visualização de bolha de texto explicativo padrão apareça.
Tentei seguir um caminho diferente e apenas lidar com todos os eventos de toque no mapa, e não consigo fazer isso funcionar. Eu li outras postagens relacionadas à captura de eventos de toque na visualização do mapa, mas não são exatamente o que eu quero. Existe uma maneira de explorar a visualização do mapa para remover o balão de texto explicativo antes de desenhar? Estou perdida.
Alguma sugestão? Estou perdendo algo óbvio?
Respostas:
Existe uma solução ainda mais fácil.
Crie um personalizado
UIView
(para sua frase de destaque).Em seguida, crie uma subclasse de
MKAnnotationView
e substitua dasetSelected
seguinte maneira:Boom, trabalho feito.
fonte
detailCalloutAccessoryView
Antigamente isso era uma dor, mas a Apple resolveu, basta verificar a documentação em MKAnnotationView
Realmente, é isso. Tira qualquer UIView.
fonte
Continuando com a resposta brilhantemente simples de @TappCandy, se você quiser animar sua bolha da mesma forma que a bolha padrão, produzi este método de animação:
Parece bastante complicado, mas contanto que a ponta de sua bolha de texto explicativo seja projetada para ficar na parte central inferior, você deve apenas ser capaz de substituir
myBubbleWidth
emyBubbleHeight
com seu próprio tamanho para que funcione. E lembre-se de certificar-se de que suas subvisualizações tenham suasautoResizeMask
propriedades definidas como 63 (ou seja, "todas") para que sejam dimensionadas corretamente na animação.: -Joe
fonte
CABasicAnimation
... Há muito tempo para lembrar! Eu sei que teria que animar a propriedade y também, devido ao deslocamento central.CGRectMake
?Esta é a melhor solução para mim. Você terá que usar um pouco de criatividade para fazer suas próprias personalizações
Em sua
MKAnnotationView
subclasse, você pode usarE se
subview
for umUICalloutView
, então você pode mexer com ele e o que está dentro dele.fonte
if ([[[subview class] description] isEqualToString:@"UICalloutView"])
Acho que tem um jeito melhor, mas funciona.Eu tive o mesmo problema. Há uma série de postagens de blog sobre esse tópico neste blog http://spitzkoff.com/craig/?p=81 .
Apenas usar o
MKMapViewDelegate
não ajuda você aqui e criar subclassesMKMapView
e tentar estender a funcionalidade existente também não funcionou para mim.O que acabei fazendo é criar o meu próprio
CustomCalloutView
que estou tendo em cima do meuMKMapView
. Você pode definir o estilo dessa visualização da maneira que desejar.My
CustomCalloutView
tem um método semelhante a este:Ele pega um
MKAnnotation
objeto e define seu próprio título, depois chama dois outros métodos bastante feios que ajustam a largura e o tamanho do conteúdo do texto explicativo e, em seguida, desenha o balão de fala em torno dele na posição correta.Por fim, a visualização é adicionada como uma subvisualização ao mapView. O problema com esta solução é que é difícil manter o texto explicativo na posição correta quando a visualização do mapa é rolada. Estou apenas ocultando o texto explicativo no método de delegação de visualizações de mapa em uma alteração de região para resolver este problema.
Demorou um pouco para resolver todos aqueles problemas, mas agora o texto explicativo quase se comporta como o oficial, mas tenho meu próprio estilo.
fonte
Basicamente, para resolver isso, é necessário: a) Evitar que o balão de texto explicativo padrão apareça. b) Descubra qual anotação foi clicada.
Consegui fazer isso: a) definindo canShowCallout como NO b) subclassificando, MKPinAnnotationView e substituindo os métodos touchesBegan e touchesEnd.
Nota: Você precisa lidar com os eventos de toque para MKAnnotationView e não MKMapView
fonte
Acabei de apresentar uma abordagem, a ideia aqui é
Aqui - testview é um
UIView
tamanho de 320x100 - showCallout é BOOL -[self animateIn];
é a função que faz a visualização de animaçãoUIAlertView
.fonte
Você pode usar leftCalloutView, definindo annotation.text como @ ""
Encontre abaixo o código de exemplo:
fonte
Eu empurrei minha bifurcação do excelente SMCalloutView que resolve o problema com o fornecimento de uma visualização personalizada para textos explicativos e permitindo larguras / alturas flexíveis de forma bastante indolor. Ainda há algumas peculiaridades para resolver, mas é bastante funcional até agora:
https://github.com/u10int/calloutview
fonte