我在mapView上遇到了问题。我真的很抱歉提出这个问题,但是我已经搜寻了将近一天的时间来研究这个问题,但是没有找到解决此问题的解决方案。

@interface MapViewController ()<CLLocationManagerDelegate, MKMapViewDelegate, UITextFieldDelegate, CheckInDelegate, NotificationsViewControllerDelegate, ReportVCDelegate, TutorialViewControllerDelegate> {
    CLLocationManager *locationManager;

    NSTimer *refreshTimer;
    int rangeValue;
    CheckInViewController *checkInVC;
    TutorialViewController *tutorialVC1;
    TutorialViewController *tutorialVC2;
    UIImageView *imgAvatar;

    NSArray *markers;
}

@property (weak, nonatomic) IBOutlet UIView *viewSearch;
@property (weak, nonatomic) IBOutlet RateView *viewRate;
@property (weak, nonatomic) IBOutlet UIView *viewBottom;
@property (weak, nonatomic) IBOutlet UILabel *lblUsername;
@property (weak, nonatomic) IBOutlet UITextField *txtSearch;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *btnNotifications;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomSpace;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomHeight;
@property (weak, nonatomic) IBOutlet UIButton *btnBottom;
@property (weak, nonatomic) IBOutlet HandsawayMapView *mapView;
@property (weak, nonatomic) IBOutlet UIView *mapViewContainer;

@property (strong, nonatomic) MKPlacemark *searchMarker;
@property (strong, nonatomic) MKUserLocation *myMarker;
@property (weak, nonatomic) MapToolbarViewController *mapToolbar;

@property (strong, atomic) NSArray *allMapMarkers;
@property (strong, nonatomic) NSNumber *aggressionIdToCenter;

@end

@implementation MapViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

//    [[UserModel sharedModel] setUserHome:@(1)];

    rangeValue = 300;

    self.viewSearch.layer.masksToBounds = NO;
    self.viewSearch.layer.shadowRadius = 0.5f;
    self.viewSearch.layer.shadowColor = [UIColor blackColor].CGColor;
    self.viewSearch.layer.shadowOffset = CGSizeMake(0.0f, 0.5f);
    self.viewSearch.layer.shadowOpacity = 0.5f;

    self.viewRate.starCount = 4;
    self.viewRate.step = 1.0f;
    self.viewRate.starNormalColor = UIColorFromRGB(0xD8D8D8);
    self.viewRate.starFillColor = UIColorFromRGB(0xFF5B59);
    self.viewRate.rating = 3.0f;
    self.viewRate.starSize = 20.0f;
    self.viewRate.padding = 8.0f;

    locationManager = [[CLLocationManager alloc] init];
    [locationManager requestWhenInUseAuthorization];
    locationManager.delegate = self;

    [DbHelper saveActivationWithNumer:@(1)];

    imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    }];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSNumber *agressionID = [[NSUserDefaults standardUserDefaults] valueForKey:@"aggression_id"];
    if (agressionID && agressionID != 0)
    {
        self.aggressionIdToCenter = agressionID;
        [[NSUserDefaults standardUserDefaults] setValue:0 forKey:@"aggression_id"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    if (self.aggressionIdToCenter != nil) {
        [self centerOnAggressionWithId:self.aggressionIdToCenter];
        self.aggressionIdToCenter = nil;
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [locationManager stopUpdatingLocation];
    didSetLocation = NO;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



- (UIView*)locationPin {
    User *user = [DbHelper getCurrentUser];
    UIImage *pin = [UIImage imageNamed:@"marker-person"];
    if([user.isCurrent boolValue]) {
        pin = [UIImage imageNamed:@"my-pin"];
    }
    UIImageView *pinImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 39, 48)];
    [pinImageView setImage:pin];
    UIView *markerContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 39, 48)];
    [markerContainer addSubview:pinImageView];
    imgAvatar = [[UIImageView alloc] initWithFrame:CGRectMake(4.5, 4.5, 30, 30)];
    [imgAvatar setContentMode:UIViewContentModeScaleAspectFill];
    imgAvatar.layer.cornerRadius = 15;
    imgAvatar.clipsToBounds = YES;
    [markerContainer addSubview:imgAvatar];
    if([user.isPictureHidden boolValue]) {
        [imgAvatar setImage:[user avatarPlaceholder]];
    }
    else {
        [imgAvatar setImageWithURL:[NSURL URLWithString:user.pictureURL] placeholderImage:[user avatarPlaceholder]];
    }
    [pinImageView setBackgroundColor:[UIColor clearColor]];
    [imgAvatar setBackgroundColor:[UIColor clearColor]];
    [markerContainer setBackgroundColor:[UIColor clearColor]];
    return markerContainer;
}

- (void)ckeckUserImage
{
    User *user = [DbHelper getCurrentUser];
    if([user.isPictureHidden boolValue]) {
        [imgAvatar setImage:[user avatarPlaceholder]];
    }
    else {
        [imgAvatar setImageWithURL:[NSURL URLWithString:user.pictureURL] placeholderImage:[user avatarPlaceholder]];
    }

    if (self.mapToolbar.currentUser)
    {
        [self.mapToolbar setCurrentUser];
    }
}

 #pragma mark - Navigation

 // In a storyboard-based application, you will often want to do a little preparation before navigation
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
     if([segue.identifier isEqualToString:@"PresentInfo"]) {
         self.mapToolbar = segue.destinationViewController;
         self.mapToolbar.height = self.bottomHeight;
         self.mapToolbar.masterVC = self;
     } else if ([segue.identifier isEqualToString:@"NotificationsSegue"] && [segue.destinationViewController isKindOfClass:[NotificationsViewController class]]) {
         NotificationsViewController *destination = (NotificationsViewController *)segue.destinationViewController;
         destination.delegate = self;
     }
     else if([segue.identifier isEqualToString:@"ActionSheetMap"]) {
         self.VCactionSheetMap = segue.destinationViewController;
         self.VCactionSheetMap.delegate = self.mapToolbar;
     } else if ([segue.identifier isEqualToString:@"mapToReport"]) {
         self.reportVC = (ReportVC *)segue.destinationViewController;
         self.reportVC.delegate = self;
     }
 }


- (IBAction)onMenu:(id)sender {
    [self.frostedViewController presentMenuViewController];
}

-(IBAction)onLocate:(id)sender {
    self.txtSearch.text = @"";
    [self.mapView removeAnnotation:self.searchMarker];
    self.searchMarker = nil;
    didSetLocation = NO;
}

- (IBAction)onCheckIn:(id)sender {
    if([[NSUserDefaults standardUserDefaults] valueForKey:@"tutorials2"]) {
        self.btnCheckin.hidden = YES;

        checkInVC = [self.storyboard instantiateViewControllerWithIdentifier:@"NewCheckin"];
        checkInVC.delegate = self;
        checkInVC.model = [[CheckInModel alloc] init];

        if(_searchMarker != nil) {
            checkInVC.model.longitude = (double) _searchMarker.coordinate.longitude;
            checkInVC.model.latitude = (double) _searchMarker.coordinate.latitude;
        }
        else {
            checkInVC.model.longitude = (double) locationManager.location.coordinate.longitude;
            checkInVC.model.latitude = (double) locationManager.location.coordinate.latitude;
        }
        if([sender isKindOfClass:[NSNumber class]]) {
            checkInVC.agressionId = sender;
        }
        UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
        [currentWindow addSubview:checkInVC.view];
    }
    else {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if(![[NSUserDefaults standardUserDefaults] valueForKey:@"tutorials2"]) {
                [self.navigationController setNavigationBarHidden:YES animated:YES];
                [self.btnCheckin setAdjustsImageWhenHighlighted:NO];
                [self.btnCheckin setUserInteractionEnabled:NO];
                UIStoryboard *tutorials = [UIStoryboard storyboardWithName:@"Tutorial" bundle:nil];
                tutorialVC2 = (TutorialViewController *)[tutorials instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"Tutorial%ld", (long)2]];
                tutorialVC2.delegate = self;
                [[tutorialVC2 view] setFrame:self.view.bounds];
                [self.view insertSubview:[tutorialVC2 view] belowSubview:self.btnCheckin];

                [[NSUserDefaults standardUserDefaults] setValue:@YES forKey:@"tutorials2"];
            }
        });
    }
}

- (IBAction)onNotifications:(id)sender {
    if([[NSUserDefaults standardUserDefaults] valueForKey:@"tutorials1"]) {
        [self performSegueWithIdentifier:@"NotificationsSegue" sender:nil];
    }
    else {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                if(![[NSUserDefaults standardUserDefaults] valueForKey:@"tutorials1"]) {
                    [self.navigationController setNavigationBarHidden:YES animated:YES];
                    UIStoryboard *tutorials = [UIStoryboard storyboardWithName:@"Tutorial" bundle:nil];
                    tutorialVC1 = (TutorialViewController *)[tutorials instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"Tutorial%ld", (long)1]];
                    tutorialVC1.delegate = self;

                    [[tutorialVC1 view] setFrame:self.view.bounds];
                    [self.view addSubview:[tutorialVC1 view]];


                    [[NSUserDefaults standardUserDefaults] setValue:@YES forKey:@"tutorials1"];
                }
            });
        });
    }
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    [manager startUpdatingLocation];
}

BOOL didSetLocation;

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray<CLLocation *> *)locations {
    if(locations.count > 0 ) {
        CLLocation *aUserLocation = locations[0];

        self.myMarker.coordinate = aUserLocation.coordinate;
//        if(_myMarker == nil) {
//            GMSMarker *marker = [[GMSMarker alloc] init];
//            marker.iconView = [[DbHelper getCurrentUser] locationPin];
//            marker.map = mapView_;
//            _myMarker = marker;
//        }
//        _myMarker.position = aUserLocation.coordinate;

        if(!didSetLocation) {

            didSetLocation = YES;
            MKCoordinateRegion region;
            MKCoordinateSpan span;
            span.latitudeDelta = 0.01557113906538632;
            span.longitudeDelta = 0.02284631241712987;
            CLLocationCoordinate2D location;
            location.latitude = aUserLocation.coordinate.latitude;
            location.longitude = aUserLocation.coordinate.longitude;
            region.span = span;
            region.center = location;

            [self.mapView setRegion:region animated:YES];

//            [APICLIENT locateUserWithCoordinates:location
//                                      completion:^(NSDictionary *result) {
//
//                                      } error:^{
//
//                                      }];
        }
    }
}

#pragma mark - Bottom bar

BOOL isBottomBarShown = YES;

}


#pragma mark - MKMapViewDelegate

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated {
    //    NSLog(@"longitured : %@, lattitude: %@", @(mapView.region.span.longitudeDelta), @(mapView.region.span.latitudeDelta));
    [self hideBottomView];
    [refreshTimer invalidate];

    refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.8
                                                    target:self
                                                  selector:@selector(refreshMapMarkersWithCoordinates:)
                                                  userInfo:@{@"longitude" : @(mapView.region.center.longitude), @"latitude" : @(mapView.region.center.latitude), @"range" : @(rangeValue)}
                                                   repeats:NO];
}


- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if(![annotation isKindOfClass:[MKPlacemark class]]) {
        MKAnnotationView * annotationView = [MKAnnotationView new];
        if([annotation isKindOfClass:[MKUserLocation class]]) {
            UIView *userView = [self locationPin];
            [annotationView setFrame:userView.frame];
            [annotationView addSubview:userView];

            self.myMarker = annotation;

            [self.mapView sendSubviewToBack:annotationView];
        }
        else {

            annotationView.annotation = annotation;
            Marker *dbmarker = ((MarkerAnnotation*)annotation).userData;

            if(dbmarker.agression != nil) {
                [annotationView setImage:[dbmarker markerImage]];

                [self.mapView bringSubviewToFront:annotationView];
            }
            else if(dbmarker.user != nil) {
                UIView *userView = [dbmarker userMarkerView];
                [annotationView setFrame:userView.frame];
                [annotationView addSubview:userView];

                [self.mapView bringSubviewToFront:annotationView];
            }
        }

        return annotationView;
    }

    return nil;
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
    if(view.annotation != self.searchMarker && view.annotation != self.myMarker) {
        if([view.annotation isKindOfClass:[MKUserLocation class]]) {

        }
        else {
            [self selectMarker:((MarkerAnnotation*)view.annotation).userData];
        }
    }
    else
    {
        if (view.annotation == self.myMarker)
        {
            [self.mapToolbar setCurrentUser];
        }
        [self showBottomView];
    }
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
    if(view.annotation != self.searchMarker && view.annotation != self.myMarker) {
        if([view.annotation isKindOfClass:[MKUserLocation class]]) {

        }
        else {
            [self hideBottomView];
        }
    }
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    [APICLIENT locateUserWithCoordinates:userLocation.location.coordinate
                              completion:^(NSDictionary *result) {

                              } error:^{

                              }];
}

#pragma mark - GMSMap delegate

//- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
//    [self selectMarker:marker];
//    return YES;
//}

- (void)selectMarker:(Marker *)marker {
    Marker *dbMarker = marker;

    if(dbMarker.agression != nil) {
        [APICLIENT getAgressionWithId:dbMarker.agression.webID
                           completion:^(Marker *newmarker) {
                               [APICLIENT getUserById:[newmarker.user.webID stringValue]
                                           completion:^(User *result) {
                                               self.mapToolbar.marker = newmarker;
                                               //[self showBottomView];
                                           } error:^{

                                           }];
                           } error:^{

                           }];
    }
    else {
        [APICLIENT getUserById:[dbMarker.user.webID stringValue]
                    completion:^(User *result) {
                        self.mapToolbar.marker = dbMarker;
                        [self showBottomView];
                    } error:^{

                    }];
    }
}



-(void)reloadMarkers {
    [APICLIENT getMapMarkersAroundMeWithCoordinates:self.mapView.region.center
                                              range:@(rangeValue)
                                         completion:^(NSArray *result) {
                                             [self updateDistance];
                                             NSArray *oldAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.class == %@", [MarkerAnnotation class]]];
                                             oldAnnotations = [oldAnnotations valueForKey:@"userData"];
                                             markers = [Marker MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", oldAnnotations]];
                                             //[self.mapView removeAnnotations:self.mapView.annotations];

                                             NSMutableArray *allMapMarkersMutable = [[NSMutableArray alloc] init];
                                             for(Marker *dbmarker in markers) {
                                                 MarkerAnnotation *marker = [[MarkerAnnotation alloc] init];
                                                 marker.coordinate = CLLocationCoordinate2DMake([dbmarker.latitude doubleValue], [dbmarker.longitude doubleValue]);
                                                 marker.userData = dbmarker;
                                                 [self.mapView addAnnotation:marker];
                                                 [allMapMarkersMutable addObject:marker];
                                             }
                                             self.allMapMarkers = [[allMapMarkersMutable copy] arrayByAddingObjectsFromArray:oldAnnotations];

                                             if(_searchMarker != nil && ![self.mapView.annotations containsObject:_searchMarker]) {
                                                 [self.mapView addAnnotation:_searchMarker];

                                             }

                                             if(self.aggressionIdToCenter != nil) {
                                                 [self centerOnAggressionWithId:self.aggressionIdToCenter];
                                                 self.aggressionIdToCenter = nil;
                                             }
                                         } error:^{
    }];

    /*NSArray *oldAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.class == %@", [MarkerAnnotation class]]];
    oldAnnotations = [oldAnnotations valueForKey:@"userData"];
    markers = [Marker MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", oldAnnotations]];
//    [self.mapView removeAnnotations:self.mapView.annotations];

    NSMutableArray *allMapMarkersMutable = [[NSMutableArray alloc] init];
    for(Marker *dbmarker in markers) {
        MarkerAnnotation *marker = [[MarkerAnnotation alloc] init];
        marker.coordinate = CLLocationCoordinate2DMake([dbmarker.latitude doubleValue], [dbmarker.longitude doubleValue]);
        marker.userData = dbmarker;
        [self.mapView addAnnotation:marker];
        [allMapMarkersMutable addObject:marker];
    }
    self.allMapMarkers = [[allMapMarkersMutable copy] arrayByAddingObjectsFromArray:oldAnnotations];

    if(_searchMarker != nil && ![self.mapView.annotations containsObject:_searchMarker]) {
        [self.mapView addAnnotation:_searchMarker];
    }

    if(self.aggressionIdToCenter != nil) {
        [self centerOnAggressionWithId:self.aggressionIdToCenter];
        self.aggressionIdToCenter = nil;
    }*/
}

//-(void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
//    [self hideBottomView];
//}

#pragma mark - UITextFieldDelegate and place search

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.view endEditing:YES];
    MKCoordinateRegion newRegion;
    newRegion.center.latitude = locationManager.location.coordinate.latitude;
    newRegion.center.longitude = locationManager.location.coordinate.longitude;

    // Setup the area spanned by the map region:
    // We use the delta values to indicate the desired zoom level of the map,
    //      (smaller delta values corresponding to a higher zoom level).
    //      The numbers used here correspond to a roughly 8 mi
    //      diameter area.
    //
    newRegion.span.latitudeDelta = 0.112872;
    newRegion.span.longitudeDelta = 0.109863;

    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];

    request.naturalLanguageQuery = textField.text;
    request.region = newRegion;

    MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:request];

    MKLocalSearchCompletionHandler completionHandler = ^(MKLocalSearchResponse *response, NSError *error) {
        if (error != nil) {
//            NSString *errorStr = [[error userInfo] valueForKey:NSLocalizedDescriptionKey];
//            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Could not find places"
//                                                            message:errorStr
//                                                           delegate:nil
//                                                  cancelButtonTitle:@"OK"
//                                                  otherButtonTitles:nil];
//            [alert show];
        } else {
            NSArray<MKMapItem *> *mapItems = [response mapItems];
            if(mapItems.count > 0) {
                MKCoordinateRegion boundingRegion = response.boundingRegion;
                MKMapItem *item = mapItems[0];
                self.searchMarker = item.placemark;

                [self.mapView addAnnotation:item.placemark];
                [self.mapView setRegion:boundingRegion animated:YES];

            }
        }
    };

    [localSearch startWithCompletionHandler:completionHandler];


double radians(double degrees) {
    return degrees * M_PI / 180.0;
}

double degrees(double radians) {
    return radians * 180.0 / M_PI;
}
const CLLocationDegrees kLatLonEarthRadius = 6371.0;

CLLocationCoordinate2D LatLonDestPoint(CLLocationCoordinate2D origin, double bearing, CLLocationDistance distance) {
    double brng = radians(bearing);
    double lat1 = radians(origin.latitude);
    double lon1 = radians(origin.longitude);

    CLLocationDegrees lat2 = asin(sin(lat1) * cos(distance / kLatLonEarthRadius) +
                                  cos(lat1) * sin(distance / kLatLonEarthRadius) * cos(brng));
    CLLocationDegrees lon2 = lon1 + atan2(sin(brng) * sinf(distance / kLatLonEarthRadius) * cos(lat1),
                                          cosf(distance / kLatLonEarthRadius) - sin(lat1) * sin(lat2));
    lon2 = fmod(lon2 + M_PI, 2.0 * M_PI) - M_PI;

    CLLocationCoordinate2D coordinate;
    if (! (isnan(lat2) || isnan(lon2))) {
        coordinate.latitude = degrees(lat2);
        coordinate.longitude = degrees(lon2);
    }

    return coordinate;
}

#pragma mark - CheckInDelegate

- (void)willRemoveCheckinView {
    [[UIApplication sharedApplication] setStatusBarHidden:NO
                                            withAnimation:UIStatusBarAnimationSlide];
    [self.navigationController setNavigationBarHidden:NO
                                             animated:YES];
}

最佳答案

问题是您在MKLocalSearchCompletionHandler中添加了标记,因此从MKLocalSearchCompletionHandler中删除以下行将解决您的问题。

[self.mapView addAnnotation:item.placemark];

关于ios - 当我搜寻地点时,会掉落图钉 map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40802266/

10-13 06:16