Как повернуть вид UIButton или UIImage, который следует за пальцем (нажмите и удерживайте)? - PullRequest
0 голосов
/ 12 февраля 2011

Мне нужна помощь. Как повернуть UIButton или UIImageView, который следует за пальцем (Touch and hold, UILongPressGestureRecognizer)?Thx 4 help

UPD: Не понимаете, что я делаю не так?

- (void)viewDidLoad {

UITapGestureRecognizer *tapgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
[self.view addGestureRecognizer:tapgr];
[tapgr release];    
[super viewDidLoad];

}

-(void)tap:(UITapGestureRecognizer *)gesture {

CGPoint touch = [gesture locationInView:self.view];
CGPoint center = myImage.center;
float dx,dy,wtf;
dx = touch.x-center.x;
dy = touch.y-center.y;
wtf = atan2f(dy, dx);

[self rotateImage:self.myImage withAngle:wtf];

}

 - (void)rotateImage:(UIImageView *)image withAngle:(float)newAngle

{image.transform = CGAffineTransformMakeRotation (newAngle);

}

Ответы [ 2 ]

0 голосов
/ 24 октября 2011
    - (void) LongPress:(UILongPressGestureRecognizer *)gesture {

    CGPoint p = [gesture locationInView:self.view];

    CGPoint zero;
    zero.x = self.view.bounds.size.width / 2.0;
    zero.y = self.view.bounds.size.height / 2.0;

    CGPoint newPoint;

    newPoint.x = p.x - zero.x;
    newPoint.y = zero.y - p.y;

    angle = atan2(newPoint.x, newPoint.y); 



    UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionAllowUserInteraction;

    [UIView animateWithDuration:0.2 delay:0.0 options:options
                     animations:^{myButton.transform = CGAffineTransformRotate(CGAffineTransformIdentity, angle);} 
                     completion:^(BOOL finished) {
                         [UIView animateWithDuration:1.0 delay:0.5 options:options animations:^{
                             myButton.transform = CGAffineTransformRotate(CGAffineTransformIdentity, [self detectQuarter:angle]);
                         } completion:nil];
                     }];
}

#define M_PI_3_4 3*M_PI_4

-(CGFloat)detectQuarter:(CGFloat)anAngle {
    if ((anAngle >= -M_PI_4)&&(anAngle <= M_PI_4)) return 0;
    if ((anAngle > M_PI_4) && (anAngle <= 3*M_PI_4)) return M_PI_2;
    if ((anAngle >= -M_PI_3_4) && (anAngle < -M_PI_4)) return -M_PI_2;
    else return M_PI;
}
0 голосов
/ 12 февраля 2011

Рад, что помню тригонометрию


-(void)degreesToRotateObjectWithPosition:(CGPoint)objPos andTouchPoint:(CGPoint)touchPoint{

   float dX = touchPoint.x-objPos.x;        // distance along X
   float dY = touchPoint.y-objPos.y;        // distance along Y
   float radians = atan2(dY, dX);          // tan = opp / adj

   //Now we have to convert radians to degrees:
   float degrees = radians*M_PI/360;

   return degrees;
}

Если у вас есть хороший метод, просто сделайте это в методе сенсорного события. (Я забыл, как это называется ...)

CGAffineTransform current = view.transform;

[view setTransform:CGAffineTransformRotate(current,<br>                 [self degreesTorotateObjectWithPosition:view.frame.origin <br>                                  andTouchPoint:[touch locationInView:<b>parentView</b>]]

//<b>Note: parentView = The view that your object to rotate is sitting in.</b>

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

Удачи,

Aurum Aquila

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...