Hello. Im trying to make a scale up or down of a view with one finger only, by moving outwards and inwards a control view, which represent a virtual circled pad..
I have the following code in the control pad -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch * aTouch = [touches anyObject]; distAux = dist = [self getCurrentDistanceFromCenter:aTouch]; if((dist >= (radius - 20.0f) && dist <= radius + 30)){ canRotate = YES; startingAngle = [self getCurrentAngleFromCenter:aTouch center:CGPointMake(self.frame.size.width/2, self.frame.size.height/2)]; firstTouchPoint = [aTouch locationInView:self]; } ... this will save the initial point in the path, and I jsut calculate if the touch is in a specified area, so I can initiate the scaling. now in my touches moved I do the following, the first part applies a rotation, which is working properly, except that after the first move the angle is 180 from what the view has, so you see that the view turns 180 degrees!!, dunno why.. anyway, the second part Im trying to get the distance of the first touch point which i saved in the touchesbegan, and calculate a distance, then scale by transforming the bounds of the control pad and using an aux variable to reposition that initial distance. -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ ... CGPoint Location = [[touches anyObject] locationInView:self]; CGPoint p = [self convertPoint:self.center fromView:self.superview]; int x = p.x; int y = p.y; float dx = Location.x - x; float dy = Location.y - y; //CGPoint p1 = [aTouch locationInView:self]; //CGPoint distance = CGPointDelta(firstTouchPoint,[aTouch locationInView:self]); //atan2(p1.y - firstTouchPoint.y, p1.x - firstTouchPoint.x) CGFloat a = atan2(-dx,dy); //CGFloat a = atan2(p1.y - firstTouchPoint.y, p1.x - firstTouchPoint.x); bc_selectedItem.transform = self.transform = CGAffineTransformRotate(self.transform, a); actualAngle = a; rotating = YES; //Second Part //Now im gonna chekc if I should enlarge CGFloat newDistFromCenter = [self getCurrentDistanceFromCenter:aTouch]; CGFloat deltaCenter = newDistFromCenter - dist; CGFloat deltaCenter2 = newDistFromCenter - distAux; if([bc_selectedItem canScaleWithScale:deltaCenter]){ // CGRect b1 = bc_selectedItem.bounds; // b1.size.width += deltaCenter; // b1.size.height += deltaCenter; // bc_selectedItem.bounds = b1; // bc_selectedItem.transform = CGAffineTransformScale(bc_selectedItem.transform, [bc_selectedItem getCurrentScaleFrom:deltaCenter],[bc_selectedItem getCurrentScaleFrom:deltaCenter]); // modifying the bounds when scaling the control pad gave me better results because of the scale factor miscalculation CGRect b = self.bounds; b.size.width += deltaCenter; b.size.height += deltaCenter; self.bounds = b; dist = newDistFromCenter; } [self setNeedsDisplay]; .... So Im have tried applying an Affinetrasnform as shown in the commented lines, but because im not calculating properly the scale factor depending on the distance (delta) between the initial point and the actual point, the results are not as expected. also in the item that is being scaled using the control pad, this code calculates the actual scaling, but it seems to be wrong also... -(CGFloat)getCurrentScale{ CGAffineTransform t = self.transform; CGFloat a, c, b, d; a = t.a; c = t.c; b = t.b; d = t.d; CGFloat scaleX = sqrt(powf(a,2)+powf(c,2)); return scaleX; } because Im scaling on Sx and Sy with the same values, Im just calculating one value. Any idea how can I calculate the NEW scale factor using a single touch so the scaling will display smoothly and constant? Thanks a lot in advance for any help provided. Gustavo _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com