2014-10-24 4 views
1

У меня есть MKMapView, который отмечает определенный регион, используя MKPolygon. Я хочу, чтобы карта имела минимальный коэффициент масштабирования, который находится внутри экрана mapView/screen, означает полностью видимый.MKMapView visibleMapRect не полностью виден

Для достижения этой цели я попытался следующие

MKPolygon *overlay; 
[[self mapView] setVisibleMapRect:[overlay boundingMapRect] edgePadding:UIEdgeInsetsMake(16, 16, 16, 16) animated:YES]; 

К сожалению, мой MAPview не установлен весь прямоугольник видимым. Прямой заполняет карту вместо фитинг.

Это то, что мне нужно против того, что я получил:

what i want против enter image description here

Как я могу достичь своей цели?

+0

Это не может быть фактический код (наложение не объявлен как указатель, это не инициализирован, boundingRect должен быть boundingMapRect, и т.д.). В реальном коде вы уверены, что оверлей указывает на правый? Есть ли еще один вызов setRegion или setVisibleMapRect после этого? Кадр MKMapView установлен на экран или выходит за пределы экрана? Похоже, высота карты правильная, но ширина может быть слишком широкой. – Anna

+0

@Anna: Это единственный и единственный оверлей на mapView, и есть только один вызов '-setVisibleMapRect:'. Я написал несколько строк в методе '-viewDidLoad', чтобы увидеть, как это работает. Я исправил опечатку с 'boundingMapRect' и отсутствующим указателем –

+0

Спасибо, @Anna, вы дали мне правильную идею, см. Мой ответ ниже. У меня еще мало опыта с MKMapView, так что я не видел его =) –

ответ

3

Я наконец нашел ответ. Это не нужно было делать с MKMapView. Я только начал использовать классы размера в Xcode 6, и поэтому была моя проблема.

Звонок на [MKMapView -setVisibleMapRect:edgePanning:animated:] был сделан слишком рано, а именно в методе -viewDidLoad.

Когда я думал о Annas comment и немного исследовал, я обнаружил, что она совершенно права. Затем мне стало ясно, что я должен позже вызвать метод mapView, например. -viewDidLayoutSubviews.

Поскольку я двигался на одной линии, он работал просто отлично! Спасибо, Anna!

1

Вы хотите передать [overlay boundingMapRect] через -[[self mapView] mapRectThatFits:].

Картографический прямоугольник, который по-прежнему центрирован в одной и той же точке карты, но ширина и высота которого регулируются так, чтобы они соответствовали рамке вида карты.

+0

Это ничего не меняет .../Но я нашел решение сейчас. –

0

Если -setVisibleMapRect установлен в -viewDidLayoutSubviews, то видимый верст будет сброшен, когда карта будет увеличена.

Мое расширение: определение флага уровня класса и вызов -setVisibleMapRect только в том случае, если этот флаг включен. Когда вызывается -setVisibleMapRect, выключите флаг. С этого момента масштабирование в/из карты не приведет к сбросу видимого макета. Вот мой код в Swift:

var resetMapRect = true // class level variable 

override void viewDidLayoutSubviews() { 
    if resetMapRect { 
     // set visible maprect here 
     resetMapRect = false // no more setting maprect 
    } 
} 
+0

Спасибо за ваш вклад, но, как вы можете видеть, мы уже нашли правильный ответ, и это была другая проблема :-), но у нас также есть решение Swift ... –