Est-ce que les limites d'un uiview changent quand un geste de pincement est utilisé dessus?

J'utilise UIPinchGestureRecognizer pour développer / réduire un uiview.

UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleElement:)]; [pinchGesture setDelegate:self]; [element addGestureRecognizer:pinchGesture]; [pinchGesture release]; 

// Méthode de l'élément d'échelle

 - (void)scaleElement:(UIPinchGestureRecognizer *)gestureRecognizer { UIView *element = [gestureRecognizer view]; [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; if ([gestureRecognizer state] == UIGestureRecognizerStateBegan){ lastTouchPosition = [gestureRecognizer locationInView:element]; } else if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged){ CGPoint currentTouchPosition = [gestureRecognizer locationInView:element]; CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition]; float distance = sqrt(deltaMove.x*deltaMove.x + deltaMove.y*deltaMove.y); float hScale = 1 - deltaMove.x/distance * (1-gestureRecognizer.scale); float vScale = 1 - deltaMove.y/distance * (1-gestureRecognizer.scale); if (distance == 0) { hScale = 1; vScale = 1; } element.transform = CGAffineTransformScale([element transform], hScale, vScale); CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale); element.bounds = CGRectApplyAffineTransform(element.bounds, transform); [gestureRecognizer setScale:1]; lastTouchPosition = currentTouchPosition; } if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { NSLog(@"scaling over"); NSLog(@"bounds = %@",NSSsortingngFromCGRect(element.bounds)); NSLog(@"frame = %@", NSSsortingngFromCGRect(element.frame)); } NSLog(@"scalePiece exit"); } //adjustAnchorPointForGestureRecognizer method - (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { UIView *elementToAdjust = gestureRecognizer.view; [self.view bringSubviewToFront:gestureRecognizer.view]; CGPoint locationInView = [gestureRecognizer locationInView:elementToAdjust]; CGPoint locationInSuperview = [gestureRecognizer locationInView:elementToAdjust.superview]; elementToAdjust.layer.anchorPoint = CGPointMake(locationInView.x / elementToAdjust.bounds.size.width, locationInView.y / elementToAdjust.bounds.size.height); elementToAdjust.center = locationInSuperview; } } 

Console d'printing:

 bounds = {{0, 0}, {178.405, 179.018}} frame = {{300.642, 566.184}, {192.899, 194.227}} 

Pourquoi les limites ne sont-elles pas ajustées lorsque le cadre change? Cela a-t-il quelque chose à voir avec les masques de redimensionnement automatique car j'ai des sous-vues pour cette vue?

Cela n'a rien à voir avec UIPinchGestureRecognizer . Cela a tout à voir avec votre réglage de la transform pour effectuer la mise à l'échelle. Changer la transform ne change pas les bounds . Cela modifie simplement la façon dont l'espace de coordonnées ( bounds ) de cette vue est mappé à l'espace de coordonnées de l'aperçu ( frame ). Si vous avez besoin de bounds pour correspondre à la frame , vous devez en changer directement, sans utiliser transform . Cela dit, vous devriez généralement utiliser transform parce que c'est beaucoup plus rapide.

MODIFIER

Si vous ne voulez pas resize, mais plutôt resize la vue, appelez setBounds: Vous pouvez find les nouvelles bounds en appliquant la transformation aux bounds plutôt qu'à l'élément.

 CGPoint currentTouchPosition = [gestureRecognizer locationInView:element]; CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition]; ... CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale); self.bounds = CGRectApplyAffineTransform(self.bounds, transform);