рдкрд┐рдВрдЪ рдЬреЗрд╕реНрдЪрд░ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдкрд┐рдВрдЪ рдЬреЗрд╕реНрдЪрд░ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдпрд╣ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдХреЗ рдЪрдпрдирд╛рддреНрдордХ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╛рдиреА рдпрджрд┐ рдЙрдВрдЧрд▓рд┐рдпрд╛рдВ рд▓рдВрдмрд╡рдд рдЪрд▓рддреА / рдмрдврд╝рддреА рд╣реИрдВ, рддреЛ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЗрд╡рд▓ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдорд╛рдкрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, UIPinchGestureRecognizer рдорд╛рдирдХ рдЬреЗрд╕реНрдЪрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред Google рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдкрд░ рдареЛрдХрд░ рдирд╣реАрдВ рдЦрд╛рддрд╛ рдерд╛ред тАЬрдареАрдХ рд╣реИ, рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦреЛред рдпрд╣ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ :) "- рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдФрд░ рдЕрдкрдиреА рдЪреБрдЯрдХреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред


рд╕рдВрдкрд╛рджрди


07/10/2010 - рд╕реНрд░реЛрдд рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ oScale рдкреНрд░реЙрдкрд░реНрдЯреА (CGPoint)ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░рдХ рд╣реЛрддрд╛ рд╣реИред UIPinchGestureRecognizer рдХреЗ рд╕рд╛рде рдкреИрдорд╛рдиреЗ рдХрд╛ рдПрдирд╛рд▓реЙрдЧред

рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕


рдЪреБрдЯрдХреА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЗ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдЙрдк-рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  1. рдкрд┐рдВрдЪ рдЬреЗрд╕реНрдЪрд░ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ
  2. рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЗ рдХреЛрдг рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВ

рдкрд╣рд▓реЗ рдЙрдкрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ UIGestureRecognizer рдФрд░ рдЗрд╕рд▓рд┐рдП UIPinchGestureRecognizer рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рд╣рдорд╛рд░реЗ "рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛" рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ ред
рджреВрд╕рд░реЗ рдЙрдкрд╡рд╛рдХреНрдпреЛрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛ред рдереЛрдбрд╝реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рдж
рдЫрд╡рд┐
рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛: рдмрд╕ рд╕реНрдХреНрд░реАрди рдХреЗ рдУрдП рдЕрдХреНрд╖ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рд░реЗрдЦрд╛ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:

рд╡рд┐рд╡рд░рдг:


// // UIOrientedPinchGestureRecognizer.h //  .. // #import <Foundation/Foundation.h> #import "UIKit/UIGestureRecognizerSubclass.h" typedef enum{ OrientationNone = 0, OrientationVertical = 1, OrientationHorizontal = 2, OrientationDiagonal = 3, OrientationInvertedDiagonal = 4 }Orientation; @interface UIOrientedPinchGestureRecognizer : UIPinchGestureRecognizer { Orientation _orientation; CGFloat _angle; CGPoint _lastScale; CGFloat _oldScale; } //  @property (nonatomic) Orientation orientation; // ,  OY.  .  0  PI.  angle==PI_2 orientation==OrientationHorizontal @property (nonatomic) CGFloat angle; @property (nonatomic) CGPoint oScale; @end #pragma mark c_func static inline CGFloat degToRad(CGFloat deg) {return deg*M_PI/180;} static inline CGFloat radToDeg(CGFloat rad) {return rad*180/M_PI;} //     .     A, .   PointB-PointA-PointC static inline double getCosAngle(CGPoint pointA,CGPoint pointB, CGPoint pointC){ CGPoint vectorAB = CGPointMake(pointB.x-pointA.x, pointB.y-pointA.y); CGPoint vectorAC = CGPointMake(pointC.x-pointA.x, pointC.y-pointA.y); double dAB=sqrt(vectorAB.x*vectorAB.x+vectorAB.y*vectorAB.y); double dAC=sqrt(vectorAC.x*vectorAC.x+vectorAC.y*vectorAC.y); double scal = vectorAB.x * vectorAC.x +vectorAB.y * vectorAC.y; double angle = scal/(dAB*dAC); return angle; } //    .     A, .   PointB-PointA-PointC static inline double getAngle(CGPoint pointA,CGPoint pointB, CGPoint pointC){ if ((CGPointEqualToPoint(pointA, pointB))||(CGPointEqualToPoint(pointA, pointC))||(CGPointEqualToPoint(pointB, pointC))) return 0; //     3,  2     return acos(getCosAngle(pointA, pointB, pointC)); } #pragma - 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 // // UIOrientedPinchGestureRecognizer.m // #import "UIOrientedPinchGestureRecognizer.h" @implementation UIOrientedPinchGestureRecognizer @synthesize angle=_angle, orientation=_orientation,oScale=_lastScale; #pragma mark init/dealloc -(void) dealloc{ [super dealloc]; } -(id) init{ self = [super init]; if (self) { _orientation = OrientationNone; _angle = 0; } return self; } #pragma mark - Methods -(void) detectAngle:(NSArray *) touches{ if ([touches count]!=2) { _orientation= OrientationNone; _angle = 0; //     //  .   _lastScale.x *= self.scale/_oldScale; _lastScale.y *= self.scale/_oldScale; _oldScale = self.scale; return; } //   CGPoint firstPoint =[[touches objectAtIndex:0] locationInView:self.view]; CGPoint secondPoint = [[touches objectAtIndex:1] locationInView:self.view]; //   OY if (secondPoint.x<firstPoint.x) { CGPoint tmp = secondPoint; secondPoint = firstPoint; firstPoint = tmp; } //  _angle = getAngle(firstPoint,secondPoint,CGPointMake(firstPoint.x,firstPoint.y-100.0f)); //    if ((_angle> M_PI_4/2.0f)&&(_angle< M_PI_4+M_PI_4/2.0f)) { _orientation= OrientationDiagonal; _lastScale.x *= self.scale/_oldScale; _lastScale.y *= self.scale/_oldScale; }else if ((_angle> M_PI_4+M_PI_4/2.0f)&&(_angle<M_PI_2+M_PI_4/2.0f)) { _orientation = OrientationHorizontal; _lastScale.x *= self.scale/_oldScale; }else if ((_angle>M_PI_2+M_PI_4/2.0f)&&(_angle<M_PI_2+M_PI_4+M_PI_4/2.0f)){ _orientation = OrientationInvertedDiagonal; _lastScale.x *= self.scale/_oldScale; _lastScale.y *= self.scale/_oldScale; }else{ _orientation=OrientationVertical; _lastScale.y *= self.scale/_oldScale; } _oldScale=self.scale; return; } -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ _lastScale = CGPointMake(1.0f, 1.0f); _oldScale = 1.0f; [self detectAngle:[touches allObjects]]; [super touchesBegan:touches withEvent:event]; } -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ [self detectAngle:[touches allObjects]]; [super touchesMoved:touches withEvent:event]; } @end 


UIPinchGestureRecognizer рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 UIOrientedPinchGestureRecognizer *pinchGesture = [[UIOrientedPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)]; [pinchGesture setDelegate:self]; pinchGesture.cancelsTouchesInView=NO; [self.view addGestureRecognizer:pinchGesture]; 


рдкреНрд░реЛрд╕реЗрд╕ рд╣реЛ рд░рд╣рд╛ рд╣реИ:


 - (IBAction)handlePinchGesture:(UIOrientedPinchGestureRecognizer *)sender { NSLog(@"angle: %f orientation: %i scale.x:%f scale.y:%f",radToDeg(sender.angle),sender.orientation,sender.oScale.x,sender.oScale.y); } 


рдиреБрдХрд╕рд╛рди:


рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддреАрди / рдЪрд╛рд░, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреЛрдг рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИред рдЙрдВрдЧрд▓рд┐рдпреЛрдВред

рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ



рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In123644/


All Articles