Я установил простой 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
игнорируется по какой-то причине он переопределен чем-то другим. Любые идеи, которые?
Запишите значение 'coord.latitude' и' coord.longitude' сразу после того, как оно установлено в 'cellForItemAtIndexPath'. Кстати, вызов 'setRegion' _inside_ измененных в регионе методов делегатов может привести к бесконечной рекурсии и переполнению стека. Для ваших целей вам не следует вызывать setRegion из этих методов делегата. Убедитесь, что координата установлена правильно. – Anna
Привет, Анна, это правильно, и в последней точке также верно, что setRegion запущен. Я знаю о проблемах с измененным регионом с измененным регионом, но я попробовал его в качестве последнего средства после того, как потратил так много часов, пытаясь решить эту проблему, - до того, как я использовал mapViewWillStartRenderingMap. Я редактировал свой вопрос, чтобы дать более полезную информацию о значениях переменных. Надеюсь, это может помочь уточнить – user3775501
Координаты -41.xxx, 174.xxx находятся в воде у Новой Зеландии. Координаты -0,51 находятся в Индийском океане. Вы также устанавливаете ширину области всего в 200 метров. – Anna