Mam widok MAP w mojej aplikacji i chcę dodać pinezkę adnotacji (czerwona pinezka) na środku widoku mapy.
Teraz, gdy użytkownik przewinie widok mapy, powinien dopasować środek za pomocą tego.
Jak to zrobić?
DziękujęJak dodać adnotację do środka mapy w iPhonie?
Odpowiedz
Jeśli chcesz użyć rzeczywistej adnotacji zamiast zwykłym widoku umieszczony powyżej środka widoku mapy można:
- użyć klasy adnotacji z ustawianego współrzędnych obiektu (pre -definiowana klasa
MKPointAnnotation
np.). Pozwala to uniknąć konieczności usuwania i dodawania adnotacji, gdy centrum się zmienia. - tworzenia adnotacji w viewDidLoad
- zachować odniesienie do niej w nieruchomości, powiedzmy centerAnnotation
- zmiana jego współrzędnych (i tytuł, etc) w
regionDidChangeAnimated
metody delegata widoku mapy za (upewnij nieruchomość delegat widoku mapy jest ustawiony)
przykład:
@interface SomeViewController : UIViewController <MKMapViewDelegate> {
MKPointAnnotation *centerAnnotation;
}
@property (nonatomic, retain) MKPointAnnotation *centerAnnotation;
@end
@implementation SomeViewController
@synthesize centerAnnotation;
- (void)viewDidLoad {
[super viewDidLoad];
MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];
pa.coordinate = mapView.centerCoordinate;
pa.title = @"Map Center";
pa.subtitle = [NSString stringWithFormat:@"%f, %f", pa.coordinate.latitude, pa.coordinate.longitude];
[mapView addAnnotation:pa];
self.centerAnnotation = pa;
[pa release];
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
centerAnnotation.coordinate = mapView.centerCoordinate;
centerAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f", centerAnnotation.coordinate.latitude, centerAnnotation.coordinate.longitude];
}
- (void)dealloc {
[centerAnnotation release];
[super dealloc];
}
@end
teraz Przesuwa adnotacji ale gładko. Jeśli potrzebujesz adnotacji poruszać się płynnie, można dodać UIPanGestureRecognizer
i UIPinchGestureRecognizer
do widoku mapy, a także aktualizować adnotacji w przewodnika gest:
// (Also add UIGestureRecognizerDelegate to the interface.)
// In viewDidLoad:
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
panGesture.delegate = self;
[mapView addGestureRecognizer:panGesture];
[panGesture release];
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
pinchGesture.delegate = self;
[mapView addGestureRecognizer:pinchGesture];
[pinchGesture release];
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
{
centerAnnotation.coordinate = mapView.centerCoordinate;
centerAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f", centerAnnotation.coordinate.latitude, centerAnnotation.coordinate.longitude];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
//let the map view's and our gesture recognizers work at the same time...
return YES;
}
dziękuję za pracę perfect .. – dks1725
+1 ode mnie, wciąż powyżej rozwiązania nie daje "wciąż" adnotacji, ale jest doskonałym fundamentem, jak również wspomnianym zobacz powyżej rozwiązania mapy. –
Czy ktoś może napisać ten kod w szybkim tempie:)? –
odpowiedź Anny jest mądre podejście do utrzymywania adnotacji w środku mapuj przy użyciu adnotacji w standardowy sposób mapowania. Jednak, jak zauważył jeden z komentatorów, przewijanie i szczypanie, mimo że znacznie lepsze, nadal wykazuje zauważalne opóźnienie, a zalecanym podejściem byłoby dodanie widoku adnotacji jako podglądu widoku mapy. Oto, jak to wygląda.
@interface SHCenterPinMapViewController() <MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) MKPointAnnotation *centerAnnotaion;
@property (strong, nonatomic) MKPinAnnotationView *centerAnnotationView;
@end
@implementation SHCenterPinMapViewController
- (MKPointAnnotation *)centerAnnotaion
{
if (!_centerAnnotaion) {
_centerAnnotaion = [[MKPointAnnotation alloc] init];
}
return _centerAnnotaion;
}
- (MKPinAnnotationView *)centerAnnotationView
{
if (!_centerAnnotationView) {
_centerAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:self.centerAnnotaion
reuseIdentifier:@"centerAnnotationView"];
}
return _centerAnnotationView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapView.delegate = self;
[self.mapView addSubview:self.centerAnnotationView];
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self moveMapAnnotationToCoordinate:self.mapView.centerCoordinate];
}
// These are the constants need to offset distance between the lower left corner of
// the annotaion view and the head of the pin
#define PIN_WIDTH_OFFSET 7.75
#define PIN_HEIGHT_OFFSET 5
- (void)moveMapAnnotationToCoordinate:(CLLocationCoordinate2D) coordinate
{
CGPoint mapViewPoint = [self.mapView convertCoordinate:coordinate toPointToView:self.mapView];
// Offset the view from to account for distance from the lower left corner to the pin head
CGFloat xoffset = CGRectGetMidX(self.centerAnnotationView.bounds) - PIN_WIDTH_OFFSET;
CGFloat yoffset = -CGRectGetMidY(self.centerAnnotationView.bounds) + PIN_HEIGHT_OFFSET;
self.centerAnnotationView.center = CGPointMake(mapViewPoint.x + xoffset,
mapViewPoint.y + yoffset);
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
self.centerAnnotaion.coordinate = mapView.centerCoordinate;
[self moveMapAnnotationToCoordinate:mapView.centerCoordinate];
}
@end
Naprawdę jedyną ciekawą rzeczą jest to, że nie trzeba zrównoważyć MKPinAnnotationView przez pewną kwotę, aby uwzględnić odległości pomiędzy lewym dolnym rogu i główką sworznia. Nie lubię mieć stałych zależnych od zasobów w kodzie, więc jeśli ktokolwiek może znaleźć lepszy sposób na zrobienie tego, ja jestem uszy.
Stworzyłem projekt Github z kontrolerem map, który to robi, a także kilka innych rzeczy związanych z korzystaniem z widoku mapy, aby użytkownik wybrał lokalizację.Sprawdź tutaj: https://github.com/scottrhoyt/CenterPinMapViewController
To jest świetne. Dziękuję Ci. Masz pomysł, jak zablokować zoom na sworzniu? Dlatego podczas powiększania powiększasz tylko kołek, odwrotnie. http://stackoverflow.com/questions/25577813/make-mkmapview-only-zoom-in-on-the-centercoordinate/25577949#25577949 –
Swift wersję
W klasie:
var centerAnnotation = MKPointAnnotation()
var centerAnnotationView = MKPinAnnotationView()
W viewDidLoad:
if #available(iOS 9.0, *) {
centerAnnotationView.pinTintColor = customColor
} else {
// Fallback on earlier versions
centerAnnotationView.pinColor = MKPinAnnotationColor.Red
}
self.view.addSubview(centerAnnotationView)
W viewDidAppear:
self.moveMapAnnotationToCoordinate(self.mapView.centerCoordinate)
Następnie :
func moveMapAnnotationToCoordinate(locate : CLLocationCoordinate2D) {
let mapViewPoint : CGPoint = self.mapView.convertCoordinate(locate, toPointToView: self.mapView)
let pinWidth : CGFloat = 7.75
let pinHeight : CGFloat = 7
let xOffset : CGFloat = CGRectGetMidX(self.centerAnnotationView.bounds) - pinWidth
let yOffset : CGFloat = CGRectGetMidY(self.centerAnnotationView.bounds) - pinHeight
self.centerAnnotationView.center = CGPointMake(mapViewPoint.x - xOffset, mapViewPoint.y - yOffset)
}
Do korzystania zmianę lokalizacji, dodać delegata CLLocationManagerDelegate
a następnie:
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
self.centerAnnotation.coordinate = self.mapView.centerCoordinate
self.moveMapAnnotationToCoordinate(self.mapView.centerCoordinate)
}
- 1. Dodaj znacznik do środka statycznej mapy google
- 2. Dynamicznie dodać adnotację do istniejącej klasy
- 3. jak powiększyć i dodać znacznik do mapy mapy android
- 4. Android - jak dodać adnotację @hide w moim projekcie
- 5. dodaj adnotację do pdf
- 6. Jak programowo dodać fragment mapy?
- 7. jak dodać niestandardowy widok objaśnienia w widoku mapy
- 8. Nie zmieniaj środka mapy ani poziomu powiększenia podczas renderowania trasy.
- 9. Mapy Google: jak dodać cień do niestandardowego znacznika?
- 10. Jak dodać Mapy Google w mojej aplikacji w Qt?
- 11. Przybliżanie do środka na mapie w Google Maps API V3
- 12. Elementy wyrównania do środka w widoku Grid
- 13. PdfKit wyróżnij adnotację
- 14. Jak kręgi mapy Google pasują do mapy
- 15. Java: Czy powinienem dodać adnotację @Override podczas implementowania metod abstrakcyjnych?
- 16. Jak uzyskać adnotację zajęć w języku Java?
- 17. Jak przekazać adnotację jako parametr?
- 18. Jak dodać mapy bazowe Google w openlayers-3?
- 19. Jak mogę utworzyć nową adnotację?
- 20. Jak nagrać wideo w iPhonie?
- 21. jak uzyskać adnotację parametru w java?
- 22. Jak utworzyć adnotację niestandardową w języku Java?
- 23. Jak dodać obiekt do zakresu zastosowania wiosną
- 24. Jak wykonać ☆ obrót wokół środka?
- 25. Korzystając z SVG, można dodać tekst do środka ścieżki i wyrównać go w poziomie?
- 26. Przekazanie własności adnotację do meta-adnotacji
- 27. Tekst zastępczy środka w iPhone'ie
- 28. Semantyczne okno dialogowe UI wyrównane do środka?
- 29. Jak połączyć znak i ciąg na iPhonie?
- 30. Jak dodać wiele wpisów mapy Groovy bez nadpisywania bieżących wpisów?
oznacza to, że są zmiany położenia sworznia zmieniając środek. –
@Muhammad Zeeshan - tak, kiedy użytkownik przewinie mapę, czerwony pin (adnotacja) powinien się zmienić, aby dostosować się do nowego środka widoku mapy, który jest widoczny dla użytkownika. – dks1725
spróbuj umieścić adnotację na środku mapy –