Мультитач не работает идеально на UIImageView

Я делаю мультитач на UImageView, что означает увеличение и уменьшение масштаба изображения. Я использую следующий код, но он работает не очень хорошо. Может ли кто-нибудь посмотреть этот код,

#import "ZoomingImageView.h"
@implementation ZoomingImageView

@synthesize zoomed;
@synthesize moved;

define HORIZ_SWIPE_DRAG_MIN    24
define VERT_SWIPE_DRAG_MAX     24
define TAP_MIN_DRAG            10

CGPoint startTouchPosition;
CGFloat initialDistance;

- (id)initWithFrame:(CGRect)frame {
 if (self = [super initWithFrame:frame]) {
    // Initialization code
    moved = NO;
    zoomed = NO;
}
return self;
}

- (void)drawRect:(CGRect)rect {
// Drawing code
}


- (void)dealloc {
if([timer isValid])
    [timer invalidate];
[super dealloc];
}

- (void) setImage: (UIImage*)img
{
    zoomed = NO;
moved = NO;
self.transform = CGAffineTransformIdentity;
[super setImage:img];
}

- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint {

float x = toPoint.x - fromPoint.x;
float y = toPoint.y - fromPoint.y;

return sqrt(x * x + y * y);
}

- (CGFloat)scaleAmount: (CGFloat)delta {
CGFloat pix = sqrt(self.frame.size.width * self.frame.size.height);
CGFloat scale = 1.0 + (delta / pix);
return scale;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if([timer isValid])
    [timer invalidate];

moved = NO;
switch ([touches count]) {
    case 1:
    {
        // single touch
        UITouch * touch = [touches anyObject];
        startTouchPosition = [touch locationInView:self];
        initialDistance = -1;
        break;
    }
    default:
    {
        // multi touch
        UITouch *touch1 = [[touches allObjects] objectAtIndex:0];
     UITouch *touch2 = [[touches allObjects] objectAtIndex:1];
        initialDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:self] 
                                                 toPoint:[touch2 locationInView:self]];
        break;
    }

  }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
   UITouch *touch1 = [[touches allObjects] objectAtIndex:0];
   if([timer isValid])
      [timer invalidate];

   /*if ([touches count] == 1) {
    CGPoint pos = [touch1 locationInView:self];
    self.transform = CGAffineTransformTranslate(self.transform, pos.x -   startTouchPosition.x, pos.y - startTouchPosition.y);
    moved = YES;
    return;
}****/

if ((initialDistance > 0) && ([touches count] > 1)) {
    UITouch *touch2 = [[touches allObjects] objectAtIndex:1];
    CGFloat currentDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:self] 
                                                     toPoint:[touch2 locationInView:self]];
    CGFloat movement = currentDistance - initialDistance;
    NSLog(@"Touch moved: %f", movement);
             CGFloat scale = [self scaleAmount: movement];
        self.transform = CGAffineTransformScale(self.transform, scale, scale);
   // }
   }
 }

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
 UITouch *touch1 = [[touches allObjects] objectAtIndex:0];
 if ([touches count] == 1) {
    // double tap to reset to default size
    if ([touch1 tapCount] > 1) {
        if (zoomed) {
            self.transform = CGAffineTransformIdentity;
            moved = NO;
            zoomed = NO;
        }
        return;
    }
 }
 else {
    // multi-touch
    UITouch *touch2 = [[touches allObjects] objectAtIndex:1];
    CGFloat finalDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:self] 
                                                   toPoint:[touch2 locationInView:self]];
    CGFloat movement = finalDistance - initialDistance;
    NSLog(@"Final Distance: %f, movement=%f",finalDistance,movement);
    if (movement != 0) {
        CGFloat scale = [self scaleAmount: movement];
        self.transform = CGAffineTransformScale(self.transform, scale, scale);
        NSLog(@"Scaling: %f", scale);
        zoomed = YES;
    }
  }
}

- (void)singleTap: (NSTimer*)theTimer {
// must override
}

- (void)animateSwipe: (int) direction {
 // must override
}

Он не работает нормально на устройстве. может ли кто-нибудь сказать, где я ошибаюсь.


person iphonemobdev    schedule 19.10.2009    source источник
comment
это не очень хорошо работает. Что это обозначает? Это медленно? Он вообще не работает? Это сбой? Вместо этого он лениво наблюдает за работой других приложений? Если вы хотите, чтобы мы просмотрели ваш код, сообщите нам, что искать.   -  person mahboudz    schedule 19.10.2009
comment
Привет, когда мы уменьшаем или увеличиваем масштаб в это время, иногда изображения переворачиваются, иногда изображение растягивается, иногда оно становится слишком масштабным. Иногда на него не влияет действие мультитач.   -  person iphonemobdev    schedule 19.10.2009


Ответы (1)


При использовании любого CGAffinTransform.... значение свойства фрейма становится неопределенным. В вашем коде вы используете frame.size.width и frame.size.height для расчета изменения размера. После первой итерации CGAffinTransformScale вы не получите правильный коэффициент масштабирования. Согласно документации, границы будут правильным свойством для расчетов масштаба.

person cameron    schedule 25.01.2010