gpt4 book ai didi

objective-c - 如何在没有 UIScrollView 的情况下放大和缩小 UIImageView?

转载 作者:太空狗 更新时间:2023-10-30 03:39:13 25 4
gpt4 key购买 nike

我正在为 iOS 4.2、iPhone 开发一个应用程序,在这个应用程序中我下载图像并将它们保存在内部存储 (NSDocuments) 中。

好吧,然后我在 UIImageView 中显示第一张图片。用户可以在 UIImageView (TouchesMoved) 上拖动他们的手指,当用户这样做时,我会加载其他图像。如果用户向下拖动,我加载一张图片,如果向上拖动,我加载其他图片,还有左右。

这一切都完成了。但我想实现缩放。到目前为止,这是我的代码:

initialDistance --> 第一次触摸时手指之间的距离
finalDistance --> 是手指每次移动时的距离
x --> 为 0
y --> 为 0

    // this method calculate the distance between 2 fingers
- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint {
float xPoint = toPoint.x - fromPoint.x;
float yPoint = toPoint.y - fromPoint.y;

return sqrt(xPoint * xPoint + yPoint * yPoint);
}

//------------------- Movimientos con los dedos ------------------------------------
#pragma mark -
#pragma mark UIResponder

// First Touch
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

NSSet *allTouches = [event allTouches];

switch ([allTouches count]) {
case 1: { //Single touch

//Get the first touch.
UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];

switch ([touch1 tapCount])
{
case 1: //Single Tap.
{
// Guardo la primera localización del dedo cuando pulsa por primera vez
//inicial = [touch1 locationInView:self.view];

} break;
case 2: {//Double tap.
//Track the initial distance between two fingers.
//if ([[allTouches allObjects] count] >= 2) {

// oculto/o no, la barra de arriba cuando se hace un dobleTap
//[self switchToolBar];

} break;
}
} break;
case 2: { //Double Touch

// calculo la distancia inicial que hay entre los dedos cuando empieza a tocar
UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];

initialDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]]
toPoint:[touch2 locationInView:[self view]]];
}
default:
break;
}
}

// when the finger/s move to
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

NSSet *allTouches = [event allTouches];

switch ([allTouches count])
{
case 1: {



} break;
case 2: {
//The image is being zoomed in or out.

UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];

//Calculate the distance between the two fingers.
CGFloat finalDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]]
toPoint:[touch2 locationInView:[self view]]];

NSLog(@"Distancia Inicial :: %.f, Ditancia final :: %.f", initialDistance, finalDistance);

float factorX = 20.0;
float factorY = 11.0;

// guardo la posicion de los 2 dedos
//CGPoint dedo1 = [[[touches allObjects] objectAtIndex:0] locationInView:self.view];
//CGPoint dedo2 = [[[touches allObjects] objectAtIndex:1] locationInView:self.view];

// comparo para saber si el usuario esta haciendo zoom in o zoom out
if(initialDistance < finalDistance) {
NSLog(@"Zoom In");

float newWidth = imagen.frame.size.width + (initialDistance - finalDistance + factorX);
float newHeight = imagen.frame.size.height + (initialDistance - finalDistance + factorY);

if (newWidth <= 960 && newHeight <= 640) {
/*
if (dedo1.x >= dedo2.x) {
x = (dedo1.x + finalDistance/2);
y = (dedo1.y + finalDistance/2);
} else {
x = (dedo2.x + finalDistance/2);
y = (dedo2.y + finalDistance/2);
}
*/

//x = (dedo1.x);
//y = (dedo1.y);

imagen.frame = CGRectMake( x, y, newWidth, newHeight);
} else {
imagen.frame = CGRectMake( x, y, 960, 640);
}



}
else {
NSLog(@"Zoom Out");

float newWidth = imagen.frame.size.width - (finalDistance - initialDistance + factorX);
float newHeight = imagen.frame.size.height - (finalDistance - initialDistance + factorY);

if (newWidth >= 480 && newHeight >= 320) {
/*
if (dedo1.x >= dedo2.x) {
x = (dedo1.x + finalDistance/2);
y = (dedo1.y + finalDistance/2);
} else {
x = (dedo2.x + finalDistance/2);
y = (dedo2.y + finalDistance/2);
}
*/
//x -= (finalDistance - initialDistance + factorX);
//y -= (finalDistance - initialDistance + factorX);

//x = (dedo1.x);
//y = (dedo1.y);

imagen.frame = CGRectMake( x, y, newWidth, newHeight);
} else {
imagen.frame = CGRectMake( 0, 0, 480, 320);
}



}

initialDistance = finalDistance;

} break;
}
}

#pragma mark -

非常感谢!!

PD:如果有可以在不同图像之间移动的 UIScrollView 方法,我也愿意看一看。

最佳答案

好的。如果只是为了实现缩放功能,您可以考虑使用 UIScrollView。

假设我们有一个 scrollView 和一个 imageView,它们都具有相同的边界。添加 imageView 作为 scrollView 的 subview 。

[scrollView addSubview:imageView];
scrollView.contentSize = imageView.frame.size;

要在 scrollView 中仅支持缩放而不支持平移,您的 viewController 必须采用 UIScrollViewDelegate 协议(protocol)。

// Disabling panning/scrolling in the scrollView
scrollView.scrollEnabled = NO;

// For supporting zoom,
scrollView.minimumZoomScale = 0.5;
scrollView.maximumZoomScale = 2.0;

...

// Implement a single scroll view delegate method
- (UIView*)viewForZoomingInScrollView:(UIScrollView *)aScrollView {
return imageView;
}

现在我们可以使用缩放功能。对于滑动,您可以使用适当配置的 UISwipeGestureRecognizers .创建用于处理每个滑动方向的手势并将其添加到 ScrollView 。

UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self selector:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
rightSwipe.numberOfTouchesRequired = 1;
[scrollView addGesture:rightSwipe];
[rightSwipe release];

并根据手势检索适当的图像并使用 imageView.image = yourImage; 进行设置。

关于objective-c - 如何在没有 UIScrollView 的情况下放大和缩小 UIImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048257/

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