這里的思路:
(1)把圖片放到屏幕的中間,這樣在拖動的時候就不會跟隨着地圖移動了。
(2)百度地圖提供了,View坐標和地理坐標轉換的方法。正式這個方法的存在,方便我們及時的獲取拖動后的,屏幕中間的圖片所在位置的經緯度。
當拖動地圖的時候,定位的圖片一直在屏幕的中央,當拖動停止的時候會顯示出具體的信息
#import "HouseTypeMapVC.h" @interface HouseTypeMapVC ()<BMKMapViewDelegate,BMKLocationServiceDelegate,BMKGeoCodeSearchDelegate>{ BMKLocationService * _locService; } @property (nonatomic,strong) UIView * locationView; @property (nonatomic,strong) UIImageView * locImageView; @property (nonatomic,strong) UIView * messageView; @property (nonatomic,strong) UILabel * addressLabel; @property (nonatomic,strong) UIButton * sureButton; @property (nonatomic,strong) NSString * name; @property (nonatomic,assign) CLLocationCoordinate2D location2D; @property (nonatomic, strong)BMKGeoCodeSearch* searchAddress; @property (strong, nonatomic) IBOutlet BMKMapView *mapView; @property (nonatomic,strong)BMKUserLocation *userLocation; //定位功能 @end @implementation HouseTypeMapVC -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear: animated]; [_mapView viewWillAppear]; _mapView.delegate = self; // 此處記得不用的時候需要置nil,否則影響內存的釋放 _locService.delegate = self; } -(void)viewWillDisappear:(BOOL)animated{ [_mapView viewWillDisappear]; _mapView.delegate = nil; // 不用時,置nil _locService.delegate = nil; } - (void)viewDidLoad { [super viewDidLoad]; } - (void)initUI{ [self goBackBtn]; _mapView.mapType=BMKMapTypeStandard; [self initlocationService]; } #pragma mark --initlocationService--定位 -(void)initlocationService{ _locService = [[BMKLocationService alloc]init]; [_locService startUserLocationService]; _mapView.showsUserLocation = NO;//先關閉顯示的定位圖層 _mapView.userTrackingMode = BMKUserTrackingModeNone;//設置定位的狀態 _mapView.showsUserLocation = YES;//顯示定位圖層 _mapView.showMapScaleBar = YES;//顯示比例尺 _mapView.zoomLevel = 17;//地圖顯示的級別 _searchAddress = [[BMKGeoCodeSearch alloc]init]; _searchAddress.delegate = self; } //這里是創建中心顯示的圖片和顯示詳細地址的View - (void)createLocationSignImage{ //LocationView定位在當前位置,換算為屏幕的坐標,創建的定位的圖標 self.locationView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 28, 35)]; self.locImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 28, 35)]; self.locImageView.image = [UIImage imageNamed:@"myLocation"]; [self.locationView addSubview:self.locImageView]; //messageView 展示定位信息的View和Label和button self.messageView = [[UIView alloc]init]; self.messageView.backgroundColor = [UIColor whiteColor]; //把當前定位的經緯度換算為了View上的坐標 CGPoint point = [self.mapView convertCoordinate:_mapView.centerCoordinate toPointToView:_mapView]; //當解析出現錯誤的時候,會出現超出屏幕的情況,一種是大於了屏幕,一種是小於了屏幕 if(point.x > ScreenWidth || point.x < ScreenWidth/5){ point.x = _mapView.centerX; point.y = _mapView.centerY-64; } NSLog(@"Point------%f-----%f",point.x,point.y); //重新定位了LocationView self.locationView.center = point; [self.locationView setFrame:CGRectMake(point.x-14, point.y-18, 28, 35)]; //重新定位了messageView [self.messageView setFrame:CGRectMake(30, point.y-40-20, SCREEN_WIDTH-60, 40)]; //展示地址信息的label self.addressLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, self.messageView.frame.size.width - 80, 40)]; self.addressLabel.font = [UIFont systemFontOfSize:13.0f]; [self.messageView addSubview:self.addressLabel]; //把地址信息傳遞到上個界面的button self.sureButton = [[UIButton alloc]initWithFrame:CGRectMake(self.addressLabel.frame.origin.x + self.addressLabel.frame.size.width, 0,self.messageView.frame.size.width - self.addressLabel.frame.origin.x - self.addressLabel.frame.size.width, 40)]; [self.messageView addSubview:self.sureButton]; self.sureButton.backgroundColor = [UIColor colorWithHex:0x2ecb7d]; [self.sureButton setTitle:@"確定" forState:UIControlStateNormal]; self.sureButton.titleLabel.font = [UIFont systemFontOfSize:13.0f]; [self.sureButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [self.sureButton addTarget:self action:@selector(sureButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.mapView addSubview:self.messageView]; [self.mapView addSubview: