我有一个有限区域的自定义地图,并设置它以正确显示用户的位置。该地图是UIScrollView中的1600 is正方形图像。
我有一个十字图来显示用户的当前位置,在zoomScale 1.0是所需的大小。当我捏和缩放scrollView时,交叉头发和它成比例。我希望屏幕上的子视图保持相同的大小。
我还没有找到任何关于这方面的信息,什么是最好的方法去做这件事?
如果有什么我能为你提供的帮助,请告诉我。
非常感谢!
编辑-
在进一步研究了这一点之后,有一个UIScrollViewDelegate方法- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale,我尝试使用它获取标记当前的中心和大小,然后进行调整,但这只是缩放结束时的缩放。我希望在用户缩放时,标记保持相同的大小。
编辑2-
蛋糕在下面给出了一个很好的答案,但我无法按照我想象的方式来实现它。
我将UIImageView作为占位符,并将alpha设置为0。此占位符相对于地图移动以显示用户位置。这就像我期望的那样运作。不幸的是,这与映射一起调整大小,因为它是映射的一个子视图(因此它保持在适当的位置)。
拿蛋糕的下面的答案,我已经创建了非缩放交叉头发图像,并添加了一个兄弟姐妹的子视图到滚动视图。一旦蛋糕指出了它们,数学就很简单,就可以得到新的交叉框架:
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:`)都隐藏了占位符,并重新显示了十字线.
发布于 2012-06-22 19:25:13
创建另一个与包含滚动视图的视图或视图控制器相关联的交叉图像。然后,让这个总是对中心交叉头发的形象,你已经有。然后,隐藏你原来的横发形象。然后,您可以避免滚动视图缩放断开相关的交叉,它应该保持相同的大小。
相对坐标系
可可触觉中的每一个视图都有一个具有起源的框架属性。为了正确地定位一个视图所拥有的对象相对于另一个视图,您所要做的就是找出它们的起源上的差异。如果一个视图是另一个视图的子视图,那么这并不太困难。
获取容器视图的起源,获取容器视图内部的子视图的位置,获取subview
H 115将您的交叉位置移动到H 216F 217)
发布于 2013-10-17 09:52:47
这个问题是老的,但对于未来类似的问题,我最近解决了一个类似的问题,应用另一篇文章的Andrew的暗示。
我有一个UIScrollView,里面有一个UIImageView。附加到UIImageView上,我有很多MKAnnotationView (这是我不想用superview缩放的子视图)。
我做了子类UIImageView,并实现了如下所示的setTransform:方法:
#import "SLImageView.h"
@implementation SLImageView
- (void)setTransform:(CGAffineTransform)transform
{
[super setTransform:transform];
CGAffineTransform invertedTransform = CGAffineTransformInvert(transform);
for (id obj in self.subviews)
{
if ([obj isKindOfClass:[MKAnnotationView class]])
{
[((UIView *)obj) setTransform:invertedTransform];
}
}
}
@end这是完美的!米克。
发布于 2016-06-16 11:25:53
与米克的回答相对应的是:
class MapContainerView:UIView {
@IBOutlet var nonScalingViews: [UIView]!
override var transform: CGAffineTransform {
didSet {
guard let nonScalingViews = nonScalingViews else {
return
}
let invertedTransform = CGAffineTransformInvert(transform)
for view in nonScalingViews {
view.transform = invertedTransform
}
}
}
}https://stackoverflow.com/questions/11158919
复制相似问题