Проблемы с MKMapRegion iOS 7.1

83
7

Я должен соответствовать контактам на видимой карте, поэтому я получаю MKMapRect с хорошо известными строками кода:

MKMapRect mapRect = MKMapRectNull;
for(id<MKAnnotation> annotation in [self.mapView annotations]){

if (![annotation isKindOfClass:[MKUserLocation class]]) {
MKMapPoint annotationPoint = MKMapPointForCoordinate([annotation coordinate]);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, delta, delta);
mapRect = MKMapRectUnion(mapRect, pointRect);
}

}

затем я получаю и устанавливаю MKCoordinateRegion с:

 MKCoordinateRegion region = MKCoordinateRegionForMapRect(newMapRect);
MKCoordinateRegion fitRegion = [self.mapView regionThatFits:region];
[self.mapView setRegion:fitRegion animated:animated];

Поскольку я использую два состояния (открытая и закрытая карта), то закрытие - это то, где карта не полностью видима (значение self.view на self.view отрицательно). Мне нужно перерисовать прямоугольник, когда вызывается метод "fitToAnnotations". Я использую [self.mapView setNeedsLayout]; поэтому я могу получить правильный self.mapView.frame (открыть или закрыть).

Теперь, если я использую этот код, с некоторыми другими строками, в iOS7 все работает хорошо, но с iOS 7.1 open-map-Region отличается тем, что имеет большой край Region без выводов и все установлены в центральной части.

Вот как я получаю правильную область, чтобы показать, полна ли карта или размер половинного экрана

MKMapRect newMapRect = mapRect;
if (mapFullScreen) {
newMapRect = [self.mapView mapRectThatFits:mapRect edgePadding:UIEdgeInsetsMake(200, 15, 30, 15)];
}else{
MKMapView *smallMap = [[MKMapView alloc] initWithFrame:self.homeViewController.tableView.tableHeaderView.frame];
newMapRect = [smallMap mapRectThatFits:mapRect edgePadding:UIEdgeInsetsMake(15, 60, 5, 60)];
smallMap = nil;
}

что пошло не так?

спросил(а) 2014-03-11T16:26:00+04:00 6 лет, 2 месяца назад
1
Решение
53

Я столкнулся с той же проблемой с iOS 7.1.

В моем приложении проблема происходит случайным образом, она, вероятно, зависит от скорости выполнения некоторых внутренних потоков карт.

Грязный взлом для меня заключался в том, чтобы добавить [NSThread sleepForTimeInterval: 1.0] в фоновом потоке непосредственно перед вызовом метода для увеличения области (что похоже на ваш код)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{  
//(generating annotions array here)
//ios 7.1 hack:
[NSThread sleepForTimeInterval:1.0];

dispatch_async(dispatch_get_main_queue(), ^{
[self zoomMapViewToFitAnnotations:self.mapView annotations:[annotationsToAddArray allObjects] animated:YES];
//(addding the generated annotations here)
});
});

ответил(а) 2014-03-17T20:15:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема