У меня есть пользовательская карта ограниченной области, и она настроена так, чтобы правильно отображать местоположение пользователей. Карта представляет собой квадратное изображение размером 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:`) скрывают местозаполнитель и повторно показывают перекрестие.