iPhone UIImageView捏缩放 [英] iPhone UIImageView pinch zoom

查看:109
本文介绍了iPhone UIImageView捏缩放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试使用CGAffinTransformScale实现PhotoView(一个UIImageView实例)的缩放缩放/输入输出(计划使用旋转,因此不能指望用于缩放的帧,并且会添加子视图,因此UIScrollView会更复杂,我认为)。无论如何,这个概念很容易掌握并且代码很快就汇集在一起​​......从那以后我一直在尝试使用三种不同的方法来解决相同的两个(相关的?!)问题,并且无法做到这一点:
1-我的代码以某种方式失去了在缩放过程中触摸计数的跟踪,从count = 2到count = 1并返回iPhone,但不是模拟器。
2-触摸点1和2在每次移动时保持来回跳跃几个像素,导致图像连续快速地缩小和放大,即使整体效果是缩小或放大为用户意图(iPhone和模拟器)。

I have been trying to implement pinch zoom/in-out for PhotoView (a UIImageView instance) using CGAffinTransformScale (planing to use rotation so can not count on frames for the zoom and will add subviews so UIScrollView would be more complicated, I think). Anyhow, the concept was easy enough to grasp and the code came together very quickly...Since then I have been trying to solve the same two (related?!) problems, using three different approaches, and have not be able to do so: 1- My code somehow loses track of the touch count in the middle of the zoom, from count = 2 to count = 1 and back on the iPhone, but not the simulator. 2- The touch points one and two keep jumping back and forth a few pixels on every move, causing the image to shrink and enlarge successively and rapidly, even though overall the effect is one of zooming out or zooming in as the user intended (both iPhone and simulator).

这里是代码:

#import "PhotoView.h"


@implementation PhotoView;
@synthesize originalCenter, distance, zooming;
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
    // Initialization code
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = YES;
        zooming = NO;
    }
    return self;
}

float distanceBetweenTwoPoints(CGPoint point1, CGPoint point2)
{
 NSLog(@"point1 x: %5.2f point 2 x: %5.2f ---- point 1 y: %5.2f  point 2 y:    %5.2f",point1.x,point2.x,point1.y,point2.y);
    return (sqrt(pow(point1.x -point2.x,2) + pow(point1.y - point2.y,2)));
}
-(void) touchesBegan: (NSSet *) touches withEvent:(UIEvent *) event {

    if ([touches count] > 1) {

      NSLog(@"^^^^^^^^^^^^^^^Tocuhes began with double touch!");

      distance = distanceBetweenTwoPoints([[[touches allObjects] objectAtIndex:0] locationInView:self], 
        [[[touches allObjects] objectAtIndex:1] locationInView:self]);
      zooming = YES;
    }
    else {
       zooming = NO;
       origianlCenter = [[[touches allObjects] objectAtIndex:0] locationInView:self];
       NSLog(@">>>>>>>>>>>>Touches began with single touch");
    }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    if (zooming) NSLog(@"!!!!!!!!!end zoom!!!!!!!");

    zooming = NO;
    if ([[touches anyObject] tapCount] == 2) {
        UITouch *thisTouch = [touches anyObject];
        CGPoint thisPoint = [thisTouch locationInView:self];
    }
}

- (void) touchesMoved: (NSSet *) touches withEvent:(UIEvent *) event {
    if ([touches count] > 1 && zooming) { // ignore if user added a second finger touch
        float distanceNew = distanceBetweenTwoPoints([[[touches allObjects] objectAtIndex:0]     locationInView:self], 
                 [[[touches allObjects] objectAtIndex:1] locationInView:self]);  
        if (distance <= 0.f) {    // should never be true - but it is sometimes!!!
           distance = distanceNew;
        }  
        float delta = 1.0f + ((distanceNew-distance)/distance);
        self.transform = CGAffineTransformScale(self.transform, delta, delta);
        distance = distanceNew;
    }
    else {
       if (zooming) {
          NSLog(@"*************shouldn't be here********* %d",[touches count]);
          return;
       }
       CGPoint thisPoint = [[[touches allObjects] objectAtIndex:0] locationInView:self];
       self.transform = CGAffineTransformTranslate(self.transform, thisPoint.x-originalCenter.x, thisPoint.y-originalCenter.y);

    }
}
- (void)dealloc {
    [super dealloc];
}
@end

日志样本:

^^^^^^^^^^^^^^^Tocuhes began with double touch!
point1 x: 87.33 point 2 x: 235.63 ---- point 1 y: 322.30  point 2 y: 117.09
point1 x: 90.76 point 2 x: 232.02 ---- point 1 y: 318.29  point 2 y: 123.51
point1 x: 86.22 point 2 x: 236.71 ---- point 1 y: 323.30  point 2 y: 117.42
point1 x: 89.51 point 2 x: 232.38 ---- point 1 y: 319.47  point 2 y: 123.47
point1 x: 84.97 point 2 x: 237.02 ---- point 1 y: 324.48  point 2 y: 116.56
*************shouldn't be here********* 1
point1 x: 88.49 point 2 x: 232.52 ---- point 1 y: 321.27  point 2 y: 122.91
*************shouldn't be here********* 1
point1 x: 83.95 point 2 x: 237.11 ---- point 1 y: 327.21  point 2 y: 116.96
!!!!!!!!!end zoom!!!!!!!

我开始怀疑由于CGAffinTransformScale我正在失去对触摸点的追踪;但是,我没有在网上找到任何建议这是一个问题。任何线索(包括'阅读xyz'上的文档)都将不胜感激!

I am beginning to suspect that I am losing track of the touch points because of CGAffinTransformScale; however, I have not found anything online to suggest this to be an issue. Any clues (including 'read the documentation on xyz') would be appreciated!

提前致谢。

推荐答案

一般来说,无论何时实施连续的UI行为,都需要针对不会发生变化的事情进行衡量。

Generally speaking, whenever you implement a continuous UI behavior, you need to measure it against something that does not change.

所以如果你的触摸会导致View转换发生变化,你应该测量一些不会改变的东西 - 例如你的父视图。所以,而不是打电话:

So if your touches cause the View transformation to change, you should measure the touches against something that does not change - your parent view for instance. So, instead of calling :

[touch locationInView:self]

你应该使用

[touch locationInView:[self superview]]

我不确定这是否能解决您的问题,但它会消除您的一个可能原因麻烦。

I am not sure if this will fix your problem, but it will eliminate one possible cause of your troubles.

这篇关于iPhone UIImageView捏缩放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆