2010-03-25 6 views
0

J'ai une vue d'image que je veux pouvoir déplacer, et pince pour l'étirer. Tout fonctionne, mais c'est un peu nerveux quand je commence à faire des mouvements de pincement. La position va sauter d'avant en arrière entre les deux doigts.Déplacement en douceur et pincement de UIImageView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    startLocation = [[touches anyObject] locationInView:mouth_handle]; 
    if([touches count] == 2) { 
     NSArray *twoTouches = [touches allObjects]; 
     UITouch *first = [twoTouches objectAtIndex:0]; 
     UITouch *second = [twoTouches objectAtIndex:1]; 
     initialDistance = distanceBetweenPoints([first locationInView:mouth_handle],[second locationInView:mouth_handle]); 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint pt = [[touches anyObject] locationInView:mouth_handle]; 

    CGRect frame = [mouth_handle frame]; 

    frame.origin.x += pt.x - startLocation.x; 
    frame.origin.y += pt.y - startLocation.y; 

    frame.origin.x = (frame.origin.x < 58) ? 58 : frame.origin.x; 
    frame.origin.x = (frame.origin.x > (260 - mouth_handle.frame.size.width)) ? (260 - mouth_handle.frame.size.width) : frame.origin.x; 
    frame.origin.y = (frame.origin.y < 300) ? 300 : frame.origin.y; 
    frame.origin.y = (frame.origin.y > 377) ? 377 : frame.origin.y; 

    if(frame.origin.x - prevDistanceX > 2 && frame.origin.x - prevDistanceX < -2) 
     frame.origin.x = prevDistanceX; 
    if(frame.origin.y - prevDistanceY > 2 && frame.origin.y - prevDistanceY < -2) 
     frame.origin.y = prevDistanceY; 

    prevDistanceX = frame.origin.x; 
    prevDistanceY = frame.origin.y; 

    CGFloat handleWidth = mouth_handle.frame.size.width; 

    if([touches count] == 2) { 
     NSArray *twoTouches = [touches allObjects]; 
     UITouch *first = [twoTouches objectAtIndex:0]; 
     UITouch *second = [twoTouches objectAtIndex:1]; 
     CGFloat currentDistance = distanceBetweenPoints([first locationInView:mouth_handle],[second locationInView:mouth_handle]); 

     handleWidth = mouth_handle.frame.size.width + (currentDistance - initialDistance); 
     handleWidth = (handleWidth < 60) ? 60 : handleWidth; 
     handleWidth = (handleWidth > 150) ? 150 : handleWidth; 
     if(initialDistance == 0) { 
      initialDistance = currentDistance; 
     } 

     initialDistance = currentDistance; 
    } 

    mouth_handle.frame = CGRectMake(frame.origin.x, frame.origin.y, handleWidth, 15); 
} 

Avez-vous des idées pour rendre ce processus plus fluide?

+0

Je collerais l'image dans un UIWebView, et ne prendrais pas la peine de réinventer la fonctionnalité de zoom de pincement. –

+0

Ne prenez pas le mot de Felix pour cela. Ce n'est certainement pas ce que les webviews sont pour. Vous devriez explorer 'UIScrollView'. –

+0

Comme je l'ai mentionné dans un commentaire ci-dessous, je n'utilise pas UIScrollView parce que je veux juste modifier la largeur de l'image, et le faire pour seulement une partie de l'image. Si j'utilise un UIScrollView, il s'agirait de mettre à l'échelle l'image entière. Connaissez-vous un moyen d'utiliser UIScrollView et encore atteindre mon objectif ici? – Jacob

Répondre

0

En sautant entre les doigts, voulez-vous dire que vous ne pouvez pas distinguer entre le premier et le deuxième doigt?

Ce que je ferais est de calculer l'angle entre les doigts. Par angle je veux dire que si vous dessinez un cercle avec un contact comme le centre et l'autre sur le bord du cercle, vous pouvez déterminer l'angle entre le point juste au-dessus du premier contact et le deuxième contact. Si la différence d'angle entre deux événements est supérieure à 0,5Pi (1/4 de cercle), vous pouvez supposer que les touches ont été commutées et vous pouvez corriger cela.

J'espère que vous comprenez ce que je veux dire.

0

Vous pouvez le faire en utilisant un UIScrollview; c'est intégré dans ça directement.

+0

L'image a une longue pièce étroite avec deux boules sur la fin. Quand je pince, je ne veux pas mettre à l'échelle l'image entière, je veux juste étirer la largeur de l'image, et le faire sans déformer les boules sur la fin. Donc, j'utilise un stretchableImageWithLeftCapWidth. Je veux la douceur de l'UIScrollView, mais je ne veux pas mettre à l'échelle l'image entière. – Jacob

Questions connexes