我有一个有限区域的自定义地图,并将其设置为正确显示用户的位置。该地图是 UIScrollView 内的 1600 像素方形图像。
我有一个十字准线图像来显示用户的当前位置,在 zoomScale 1.0 是所需的大小。当我捏和缩放滚动视图时,十字准线会随之缩放。我想让子视图在屏幕上保持相同的大小。
我一直无法找到有关此的任何信息,最好的方法是什么?
如果有什么我可以为您提供帮助的答案,请告诉我。
非常感谢!
编辑 -
进一步研究后,- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
我尝试使用 UIScrollViewDelegate 方法来获取标记的当前中心和大小,然后进行调整,但这只会在缩放结束时缩放。我希望在用户缩放时让标记保持相同的大小。
编辑2-
Cake 在下面提供了一个很好的答案,但我无法以我想象的方式实现它。
我将 UIImageView 作为占位符,alpha 设置为 0。此占位符相对于地图移动以显示用户位置。这按我的预期运行。不幸的是,这会随着地图调整大小,因为它是地图的子视图(所以它保持在原地)。
采用 Cake 的以下答案,我创建了非缩放十字准线图像,并将其作为同级子视图添加到滚动视图中。数学,一旦 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 -
我重新接受了 Cake 的回答,因为它涵盖了 90% 的问题。除了他的回答,我还实现了 ScrollViewDelegate 方法scrollViewWillBeginDragging:
并scrollViewWillBeginDecelerating:
缩放占位符以匹配相对于地图的十字准线的当前大小,显示占位符(即地图图像的子视图)并隐藏十字准线图像。委托方法scrollviewWillBeginZooming:withView:
不显示占位符,因为它随地图缩放。正如 Cake 所建议的那样,我将为这个问题提出一个新问题。
对应的方法(scrollViewDidEndZooming:withView:atScale:
和scrollViewDidEndDragging:willDecelerate:
-scrollViewDidEndDecelerating:`)都隐藏占位符,并重新显示十字准线。