UIScrollView — Пользовательская карта — Предотвращение масштабирования подпредставления маркера на карте с картой

У меня есть пользовательская карта ограниченной области, и она настроена так, чтобы правильно отображать местоположение пользователей. Карта представляет собой квадратное изображение размером 1600 пикселей в UIScrollView.

У меня есть изображение в виде перекрестия, показывающее текущее местоположение пользователя, которое при zoomScale 1.0 является желаемым размером. Когда я сжимаю и масштабирую scrollView, перекрестие масштабируется вместе с ним. Я хотел бы, чтобы подвид оставался того же размера на экране.

Мне не удалось найти никакой информации по этому поводу. Как лучше всего это сделать?

Если я могу чем-то помочь вам с ответом, пожалуйста, дайте мне знать.

Большое спасибо!

РЕДАКТИРОВАТЬ -

Посмотрев на это дальше, есть метод UIScrollViewDelegate - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scaleкоторый я пытался использовать, чтобы взять текущий центр и размер маркера, а затем настроить, но это масштабируется только в конце масштабирования. Я бы предпочел, чтобы маркер оставался того же размера, пока пользователь увеличивает масштаб.

РЕДАКТИРОВАТЬ 2-

Cake предоставил отличный ответ ниже, но я не смог реализовать его так, как я себе представлял.

У меня есть UIImageView в качестве заполнителя с альфа-каналом, равным 0. Этот заполнитель перемещается относительно карты, чтобы показать местоположение пользователя.Это работает так, как я ожидаю. К сожалению, это изменяется вместе с картой, так как это подвид карты (поэтому он остается на месте).

Взяв ответ Cake ниже, я создал немасштабируемое изображение перекрестия и добавил его в качестве родственного подвида в вид прокрутки. Математика, как только Торт указал на них, была довольно простой, чтобы получить новую рамку для перекрестия:

    CGPoint ULPC = userLocationPlaceholder.center;
    float zs = scrollView.zoomScale;
    CGRect newFrame = CGRectMake(((ULPC.x * zs) - scrollView.contentOffset.x) - 20, ((ULPC.y * zs) - scrollView.contentOffset.y) - 20, 40, 40);

Где изображение имеет ширину 40 точек. Это идеально соответствует центрам.

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

Я попытался использовать самовызывающуюся анимацию как таковую:

-(void)animeUserLocationAttachment
{
[UIView animateWithDuration:0.05 
                      delay:0 
                    options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveLinear )
                 animations:^{
                     userLocationDotContainer.frame = newFrame;
               } completion:^(BOOL finished){
                     // Call self
                     [self animateUserLocationAttachment];
                 }];
}

Как только я начинаю прокручивать/масштабировать, анимация блокируется, так что перекрестие остается на месте до тех пор, пока я не отпущу прокрутку/масштабирование, после чего оно корректно обновится. его месторасположение.

Можно ли как-то обойти это или применить альтернативный метод?

Большое спасибо

РЕДАКТИРОВАТЬ 3 -

Я повторно принял ответ Торта, так как он охватывает 90% проблемы. В дополнение к его ответу я реализовал методы ScrollViewDelegate scrollViewWillBeginDragging:и scrollViewWillBeginDecelerating:, чтобы масштабировать заполнитель в соответствии с текущим размером перекрестия относительно карты, показать заполнитель (то есть часть изображения карты) и скрыть изображение перекрестия. Метод делегата scrollviewWillBeginZooming:withView:не показывает заполнитель, поскольку он масштабируется вместе с картой. Как рекомендует Торт, я создам новый вопрос для этого выпуска.

Аналогичные методы (scrollViewDidEndZooming:withView:atScale:, scrollViewDidEndDragging:willDecelerate:и -scrollViewDidEndDecelerating:`) скрывают местозаполнитель и повторно показывают перекрестие.

0
задан Pete C 28 June 2012 в 09:03
поделиться