gpt4 book ai didi

iphone - 在不缩放叠加层的情况下缩放背景图像

转载 作者:行者123 更新时间:2023-11-28 22:53:57 25 4
gpt4 key购买 nike

我是 iOS 开发的初学者,我正在尝试显示需要可缩放和平移的图像(实际上是 map )。我的问题是我不知道如何添加一个叠加层,它会跟随平移以始终代表相同的位置,但不会通过缩放进行缩放。将有多个叠加层,每个叠加层都必须是可点击的。

为了缩放和平移图像( map ),我在 UIScrollView 中添加了我的 UIImageView,效果很好,但我不知道如何添加此功能。

我找到了这个帖子,但它并不是真正的同一个问题,因为他的叠加层是静态的: UIScrollview with two images - Keeping 1 image zoomable and 1 image static (fixed size)

我在 android 中开发了相同的应用程序,为了完成这项工作,我正在转换屏幕坐标中的 map 像素,这要归功于变换矩阵,我覆盖了 onDraw 方法来显示它,但我没有我知道如何在 iOS 上做同样的事情,我不知道这是否是更好的解决方案。

感谢您的帮助。

最佳答案

好的,所以我找到了一种方法,如果它可以帮助任何人的话:

我在 scrollView 中添加了我的叠加层,带有背景图像( map )。

+CustomScrollView
----> UIImageView (map)
----> OverlayImageView (overlay)

为了缩放,自定义 ScrollView 需要一个具有以下方法的委托(delegate):

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
//The background image with the map
return mapView;
}

//When a zoom occurs, move the overlay
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
UIImageView* overlayView = [scroll.subviews objectAtIndex:1];
float x;
float y;
float width;
float height;

//keep the width and height of the overlay
width = overlayView.frame.size.width;
height = overlayView.frame.size.height;
//Move it to stay over the same pixel of the map, and centers it
x = (self.overlay.point.x * scroll.zoomScale - width/2);
y = (self.overlay.point.y * scroll.zoomScale - height/2);

overlayView.frame = CGRectMake(x,y,width,height);
}

有了这个,我们说缩放只发生在背景图像上,但由于覆盖在 UIScrollView 中,它会随之平移。所以我们唯一需要关心的是当缩放改变时移动 Overlay,我们通过 scrollViewDidZoom 方法知道它。

为了处理触摸事件,我们覆盖了 CustomScrollViewtouchEnded:withEvent:,如果只有一次点击,我们将其转发到覆盖层。我没有显示 OverlayImageView,因为它只是覆盖了相同的方法 (toucheEnded:withEvent:) 来处理触摸。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
// Coordinates in map view
CGPoint point = [touch locationInView:[self.subviews objectAtIndex:0]];

//forward
if(touch.tapCount == 1){
OverlayImageView* overlayView = [self.subviews objectAtIndex:1];
CGPoint newPoint = [touch locationInView:overlayView];

BOOL isInside = [overlayView pointInside:newPoint withEvent:event];

if(isInside){
[overlayView touchesEnded:touches withEvent:event];
}
}
// zoom
else if(touch.tapCount == 2){


if(self.zoomScale == self.maximumZoomScale){
[self setZoomScale:[self minimumZoomScale] animated:YES];
} else {
CGRect zoomRect = [self zoomRectForScrollView:self withScale:self.maximumZoomScale withCenter:point];

[self zoomToRect:zoomRect animated:YES];
//[self setZoomScale:[self maximumZoomScale] animated:YES];
}

[self setNeedsDisplay];

}
}

希望这会有所帮助。

关于iphone - 在不缩放叠加层的情况下缩放背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com