0

Я установил простой MKMapView (он предназначен только для отображения местоположения на карте и ничего более) в пределах одной ячейки раздела CollectionView и мне не удалось установите его область, используя setRegion. Значение MKMapViewDelegat e правильно установлено на UICollectionViewCell, как показано на контрольных точках, попадающих во все методы делегата.Внутри UICollectionViewCell setRegion не влияет на MKMapView

Я первый попытался установить область в cellForItemAtIndexPath в View Controller, но я предполагаю, что это слишком рано, т.е. до загрузки карты, так ничего не происходит, и он загружает местоположение по умолчанию в середине океана.

Я попытался передать CLCoordinateLocation2D с контроллера вида на CLCoordinateLocation2D в ячейке во время cellForItemAtIndexPath, чтобы установить регион в ячейке, но где это подходящее место для установки региона? В ViewController это должно быть сделано в ViewDidAppear, а не ViewDidLoad или ViewWillAppear, так что карта загружена, но я не могу найти эквивалентное событие для collectionviewcell. awakeFromNib явно слишком скоро. Я пробовал использовать различные делегаты mapView, такие как:

- (void)mapView:(MKMapView *)mapView1 
regionWillChangeAnimated:(BOOL)animated 
{ 
    MKCoordinateSpan span = {.latitudeDelta = 0.0025, .longitudeDelta = 0.0025}; 
MKCoordinateRegion adjustedRegion = [mapView1  regionThatFits:MKCoordinateRegionMakeWithDistance(coords, 200, 200)]; 
    [mapView1 setRegion:adjustedRegion animated:YES]; 
} 

, который бежит, но снова не меняет регион. Я попытался

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView and 
- (void)mapViewWillStartRenderingMap:(MKMapView *)mapView 

, который, казалось, лучшие ставки, но контрольную точку до и после того, как setRegion линия показывает область никогда не обновляется в регион я заходящего его. Все события должны быть в тот момент, когда карта полностью загружена, поэтому почему setRegion просто не имеет никакого эффекта?

Cell ч Файл:

@interface BasicsCollectionViewCell : UICollectionViewCell 
@property (strong, nonatomic) IBOutlet MKMapView *mapView; 
@property (nonatomic) CLLocationCoordinate2D coords; 
@end 

Cell м файла:

@interface BasicsCollectionViewCell() <MKMapViewDelegate> 
@end 

@implementation BasicsCollectionViewCell 
@synthesize mapView; 
@synthesize coords; 

- (void)mapView:(MKMapView *)mapView1 
regionWillChangeAnimated:(BOOL)animated 
{ 
    MKCoordinateSpan span = {.latitudeDelta = 0.0025, .longitudeDelta = 0.0025}; 
MKCoordinateRegion adjustedRegion = [mapView1  regionThatFits:MKCoordinateRegionMakeWithDistance(coords, 200, 200)]; 
    [mapView1 setRegion:adjustedRegion animated:YES]; 
} 

И соответствующая часть cellForItemAtIndexPath:

cell0 = (BasicsCollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"BasicsCell" forIndexPath:indexPath]; 
    CLLocationCoordinate2D coord = {.latitude = self.latitude, .longitude = self.longitude}; 
    [cell0 setCoords:coord]; 
    cell0.mapView.delegate = cell0; 
    MKCoordinateSpan span = {.latitudeDelta = 0.0025, .longitudeDelta = 0.0025}; 
    MKCoordinateRegion adjustedRegion = [cell0.mapView regionThatFits:MKCoordinateRegionMakeWithDistance(coord, 200, 200)]; 
    [cell0.mapView setRegion:adjustedRegion animated:YES]; 
    return cell0; 

EDIT:

Если я ставлю точки останова в следующем коде до и после setRegion линия в asterixed точках ...

- (void)mapViewWillStartRenderingMap:(MKMapView *)mapView 
{ 
    MKCoordinateSpan span = {.latitudeDelta = 0.0025, .longitudeDelta = 0.0025}; 
    MKCoordinateRegion adjustedRegion = [mapView  regionThatFits:MKCoordinateRegionMakeWithDistance(coords, 200, 200)]; 
    *****[mapView setRegion:adjustedRegion animated:YES]; 
    *****} 

то отладчик дает следующее в первой контрольной точке:

po self.mapView.region 
{ 
    (latitude = -41.508575000000008, longitude = 174.19921900000011) 
    (latitudeDelta = 13.733789001832008, longitudeDelta = 59.305518116231042) 
} 

То же самое в точке останова сразу после:

po self.mapView.region 
{ 
    (latitude = -41.508575000000008, longitude = 174.19921900000011) 
    (latitudeDelta = 13.733789001832008, longitudeDelta = 59.305518116231042) 
} 

Хотя на обоих контрольные точки, следующие является (правильное) значение adjustedRegion:

po adjustedRegion 
    { 
     (latitude = -0.13506928037132482, longitude = 51.518398284912109) 
     (latitudeDelta = 0.0018087389042361623, longitudeDelta = 0.0058458603824931288) 
    } 

Так просто, что либо setRegion игнорируется по какой-то причине он переопределен чем-то другим. Любые идеи, которые?

+0

Запишите значение 'coord.latitude' и' coord.longitude' сразу после того, как оно установлено в 'cellForItemAtIndexPath'. Кстати, вызов 'setRegion' _inside_ измененных в регионе методов делегатов может привести к бесконечной рекурсии и переполнению стека. Для ваших целей вам не следует вызывать setRegion из этих методов делегата. Убедитесь, что координата установлена ​​правильно. – Anna

+0

Привет, Анна, это правильно, и в последней точке также верно, что setRegion запущен. Я знаю о проблемах с измененным регионом с измененным регионом, но я попробовал его в качестве последнего средства после того, как потратил так много часов, пытаясь решить эту проблему, - до того, как я использовал mapViewWillStartRenderingMap. Я редактировал свой вопрос, чтобы дать более полезную информацию о значениях переменных. Надеюсь, это может помочь уточнить – user3775501

+0

Координаты -41.xxx, 174.xxx находятся в воде у Новой Зеландии. Координаты -0,51 находятся в Индийском океане. Вы также устанавливаете ширину области всего в 200 метров. – Anna

ответ

0

Я столкнулся с подобным, где область карты не была изменена. Так я вручную называется MAPview метод делегата

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 

в - (void) viewDidAppear:(BOOL)animated зрения контроллера.

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

    // Manually called delegate method to forcefully set region. 
    [self mapView:self.mapView regionDidChangeAnimated:YES]; 
} 

В вашем случае позвоните по этому методу сразу после установки региона карты. Из приведенного выше кода, например, в методе cellForItemAtIndexPath. Например:

cell0 = (BasicsCollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"BasicsCell" forIndexPath:indexPath]; 
CLLocationCoordinate2D coord = {.latitude = self.latitude, .longitude = self.longitude}; 
[cell0 setCoords:coord]; 
cell0.mapView.delegate = cell0; 
MKCoordinateSpan span = {.latitudeDelta = 0.0025, .longitudeDelta = 0.0025}; 
MKCoordinateRegion adjustedRegion = [cell0.mapView regionThatFits:MKCoordinateRegionMakeWithDistance(coord, 200, 200)]; 
[cell0.mapView setRegion:adjustedRegion animated:YES]; 

[cell0.mapView setRegion:adjustedRegion animated:YES]; 

// Force call of delegate method 
[self mapView:cell0.mapView regionDidChangeAnimated:YES]; 


return cell0; 

Примечание:

Не забыл переопределить метод в regionDidChangeAnimated зрения контроллера.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 
} 
Смежные вопросы