2013-05-23 2 views
2

Во-первых, я новичок в Objective C, любая помощь будет оценена по достоинству. Я пытаюсь написать приложение Gauge (которое в конечном итоге покажет угол телефона). Проблема в том, что когда я поворачиваю изображение иглы, она поворачивается на правильный угол, но не от точки привязки - изображение перемещается в положение. Даже когда я двигаюсь, скажем от 0 до 90 и обратно до 0, изображение не возвращается в исходное положение! Код, который я использую, приведен ниже:. (PS Я только в настоящее время только работает приложение на тренажере)Вращающееся изображение вокруг фиксированной точки

*** Rotate Invoked by .... 
// Rotate Image 
[self rotateImage:_imgNeedle duration: vAnimationDuration curve: UIViewAnimationCurveLinear degrees:vValue]; 

-(void)rotateImage:(UIImageView *)image 
     duration:(NSTimeInterval)duration 
      curve:(int)curve 
     degrees:(CGFloat)degrees 
{ 
    // Setup the animation 
    [self setAnchorPoint:CGPointMake(.44,.85) forView:image]; 
    // image.transform = CGAffineTransformMakeRotation(d2r(degrees)); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:duration]; 
    [UIView setAnimationCurve:curve]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 

    // The transform matrix 
    CGAffineTransform transform = CGAffineTransformMakeRotation(d2r(degrees)); 

    image.transform = transform; 
    // Commit the changes 
    [UIView commitAnimations]; 
} 

// Set Anchor Point 
-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view 
{ 
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform); 

    CGPoint position = view.layer.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    view.layer.position = position; 
    view.layer.anchorPoint = anchorPoint; 
} 

ответ

0

Я не уверен в позиции слоя, но при изменении anchorPoint, изменения кадров, поэтому я буду корректировать кадр.

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view 
{ 
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform); 
    /* 
    CGPoint position = view.layer.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    view.layer.position = position; 
    */ 

    view.frame = CGRectOffset(view.frame, newPoint.x-oldPoint.x, newPoint.y-oldPoint.y); 
    view.layer.anchorPoint = anchorPoint; 
} 

А также, если вы хотите, чтобы вернуться в исходное положение с несколько призванием rotateImage, я думаю, вы должны установить только точку привязки один раз до этого. Поскольку, если вы создаете две отдельные анимации с одним и тем же методом rotateImage, опорная точка будет пересчитана с вашей текущей реализацией.

-(void)rotateImage:(UIImageView *)image 
     duration:(NSTimeInterval)duration 
      curve:(int)curve 
     degrees:(CGFloat)degrees 
{ 
    // Setup the animation 
    // [self setAnchorPoint:CGPointMake(.44,.85) forView:image]; 
    // image.transform = CGAffineTransformMakeRotation(d2r(degrees)); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:duration]; 
    [UIView setAnimationCurve:curve]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 

    // The transform matrix 
    CGAffineTransform transform = CGAffineTransformMakeRotation(d2r(degrees)); 

    image.transform = transform; 
    // Commit the changes 
    [UIView commitAnimations]; 
} 
+0

Благодарим за ответ. Я внес изменения, также заметила, что частота дискретизации была меньше, чем продолжительность анимации. но в то время как это лучше, к сожалению, это все еще не совсем правильно. В дизайне на Раскадке игла находится в центре циферблата, при движении она движется вертикально вверх. Меняя угол, я получаю горизонтальное движение. – user2413698

+0

@ user2413698 не уверен, что вам нужно. Возможно, вы можете уточнить свой вопрос с дополнительной информацией. Или задайте другой вопрос, если этот ответ решит конкретную проблему, с которой вы столкнулись. –

+0

Отключить автоматическую компоновку - Игла теперь правильно вращается вокруг оси - Исправлено! – user2413698

Смежные вопросы