ios - current - mkmapview
iOS 8 MKAnnotaciĆ³nVer a la derechaCalloutAccessoryVer desalineado (7)
En Swift 3:
let infoButton = UIButton(type: .detailDisclosure)
annotationView.rightCalloutAccessoryView = infoButton
Todavía soy bastante nuevo en iOS en general y encontré un problema al probar nuestra aplicación para compatibilidad con iOS 8. En iOS 7 todo funcionó bien, pero en iOS 8, el rightCalloutAccessoryView está desalineado bajo ciertas circunstancias.
Primera captura de pantalla: alineada correctamente
Segunda captura de pantalla: alineación incorrecta
Como puede ver, el problema tiene lugar cuando InfoWindow tiene un título largo. Pero este no fue el caso en iOS 7 y no pude encontrar nada mencionando que esto ha cambiado.
Traté de entender por qué y encontrar una manera de resolver esto, pero no pude encontrar nada todavía. ¿Es esto solucionable por nuestra cuenta o tenemos que presentar un problema para Apple?
Cualquier ayuda / ideas sería muy apreciada, ya que de alguna manera tengo un gran desafío con este problema.
Código que agrega MKAnnotationViews
- (MKAnnotationView *)viewForStation:(id<MKAnnotation>)annotation {
static NSString *stationIdentifier = @"stao";
MKAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:stationIdentifier];
if (annotationView == nil) {
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:stationIdentifier];
annotationView.image = [UIImage bundleImageNamed:PIN_IMAGE];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}
return annotationView;
}
Como podría interesarle, (ahora mismo) también agregué esta pregunta a la sección de iOS 8 Beta en apple.developer.com: https://devforums.apple.com/thread/242282?tstart=0
Si recibo una respuesta aquí o en apple.developer.com, la reflejaré para que podamos encontrarla en ambos sitios.
Feo como el diablo, pero me las arreglé para encontrar una solución a este problema.
Establezca la altura de la vista accesoria en un valor igual al alto de la vista de la leyenda. Utilicé valores codificados:
- para iOS 7 objetivos: 45.0 px
- para iOS 8 objetivos: 54.0 px
(Probablemente hayas notado que la altura de la vista de la anotación de la anotación predeterminada es mayor en iOS 8 que en iOS 7).
En tu código, eso sería:
- (MKAnnotationView *)viewForStation:(id<MKAnnotation>)annotation {
static NSString *stationIdentifier = @"stao";
MKAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:stationIdentifier];
if (annotationView == nil) {
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:stationIdentifier];
annotationView.image = [UIImage bundleImageNamed:PIN_IMAGE];
annotationView.canShowCallout = YES;
UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
// N.B. In production code, you would need a more generic way to adjust
// height values instead of hard-coding values based on NSFoundationVersionNumber...
CGFloat height = (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) ? 55.f : 45.f;
detailButton.frame = CGRectMake(0.f, 0.f, 32.f, height);
annotationView.rightCalloutAccessoryView = detailButton;
}
return annotationView;
}
Además, por lo que he visto hasta ahora, si especifica las vistas de accesorios izquierda y derecha, deberá establecer ambas alturas en el mismo valor para obtener la alineación adecuada. Esperemos que este problema se solucione en versiones posteriores de iOS para evitar escribir este tipo de código ...
Hice que funcionase el mío configurando el delegado de mi vista de mapa antes de agregar la anotación y no tuve que cambiar nada en el del.
Pasando de lo siguiente:
self.mapView = [[MKMapView alloc] init];
NGAAnnotation *annotation = [[NGAAnnotation alloc] init];
annotation.coordinate = coordinates;
annotation.title = self.project.name;
[self.mapView addAnnotation:annotation];
self.mapView.delegate = self;
A:
self.mapView = [[MKMapView alloc] init];
NGAAnnotation *annotation = [[NGAAnnotation alloc] init];
annotation.coordinate = coordinates;
annotation.title = self.project.name;
self.mapView.delegate = self;
[self.mapView addAnnotation:annotation];
Me lo arregló Noté que se llama al método de delegado cuando se agrega la anotación, por lo que si el delegado no está configurado antes de agregar la anotación, no se llamará.
Hola, estaba teniendo exactamente el mismo problema aquí es lo que hice para resolverlo:
Parece ser un problema con la vista Llamada que tiene problemas para mostrar el texto del título MKAnnotation cuando es demasiado largo. Incluso desde su captura de pantalla puede ver que el problema solo ocurre cuando el título se truncó y se agregaron puntos suspensivos. Entonces, la MKAnnotation estándar no muestra las vistas correctamente y esto es un error en iOS8.
Mientras tanto, puedes crear tu propio rótulo personalizado siguiendo los pasos here .
Pensé que esto era demasiado trabajo para lo que necesitaba, así que recorté la cadena del título y agregué las elipsis para evitar que lo haga solo. (No es ideal, pero es una solución rápida, y el texto se truncaría de todos modos)
if (locTitle.length > 15)
{
locTitle = [NSString stringWithFormat:@"%@...", [locTitle substringToIndex:14]];
}
Lo resolví configurando la máscara de conversión automática para corregir el error vertical y frame.size.width para el error horizontal
UIButton* infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[infoButton setFrame:CGRectMake(0, 0, CGRectGetWidth(infoButton.frame)+10, CGRectGetHeight(infoButton.frame))];
[infoButton setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin];
[annotationView setRightCalloutAccessoryView:infoButton];
Por ahora, me estoy escondiendo correctamenteCalloutAccessoryView con
pin.rightCalloutAccessoryView.frame = CGRectZero;
y haz clic en Vista de anotación que sigue funcionando, simplemente no hay botón en el lado derecho. Probado en iOS7 e iOS8, no estoy seguro acerca de iOS6.
Una curiosidad que noté fue que mi primera llamada que se mostraría alinearía correctamente las vistas de accesorios, pero las selecciones posteriores no lo harían. [view setNeedsLayout]
una llamada a [view setNeedsLayout]
antes de devolver la vista de anotación eliminada de la cola, y todo comenzó a alinearse correctamente nuevamente.
Sin gastar más tiempo en esto, mi mejor suposición es que no se desencadena un re-diseño para una vista que ha sido eliminada porque la jerarquía de vista no ha cambiado.
Sin embargo, recomiendo enviar un radar para este problema. No debería ser necesario implementar soluciones para un caso de uso tan estándar.
EDITAR:
Si bien esto parece ser mejor para muchos casos, todavía encuentro este problema con anotaciones cuyo título es lo suficientemente largo como para ser truncado.