2013-10-24 4 views
0

я застрял с проблемой, когда мне нужно, чтобы изменить взгляды на заранее определенные места.Вычислить угол поворота для точки привязки

Все виды имеют UIPanGestureRecognizer и UIRotationGestureRecognizer и расположены/повернуты внутри вида контроллеров. На определенном событии точки зрения должны перейти в новую позицию с новым углом поворота.

Все работает нормально, но вскоре, когда один из распознавателей жестов был активным, и поэтому anchorPoint сменил репозиционирование/вращение.

Вот мой метод, который я пытаюсь использовать, чтобы принять во внимание сдвиг в anchorPoint.

- (CGPoint)centerPointWithInVisibleAreaForPoint:(CGPoint)point 
{ 
    CGPoint anchorP = self.layer.anchorPoint; 
     anchorP.x -= 0.5; 
     anchorP.y -= 0.5; 

    CGRect rect = self.bounds; 

    CGFloat widthDelta = CGRectGetWidth(self.bounds) * anchorP.x; 
    CGFloat heightDelta = CGRectGetHeight(self.bounds) * anchorP.y; 

    CGPoint newCenter = CGPointMake(point.x + widthDelta, point.y + heightDelta); 

    return newCenter; 
} 

Контроллер запрашивает исправленную центральную точку и устанавливает центральное значение вида. Затем преобразование вращения устанавливается с использованием CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(differenceAngle)).

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

ответ

0

Единственное решение, которое я нашел (и это самый простой из всех), заключается в том, чтобы сбросить привязку к 0.5/0.5 и соответствующим образом исправить положение.

- (void)resetAnchorPoint 
{ 
    if (!CGPointEqualToPoint(self.layer.anchorPoint, CGPointMake(0.5, 0.5))) { 

    CGFloat width = CGRectGetWidth(self.bounds); 
    CGFloat height = CGRectGetHeight(self.bounds); 

    CGPoint newPoint = CGPointMake(width * 0.5, height * 0.5); 
    CGPoint oldPoint = CGPointMake(width * self.layer.anchorPoint.x, height * self.layer.anchorPoint.y); 

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

    CGPoint position = self.layer.position; 
    position.x += (newPoint.x - oldPoint.x); 
    position.y += (newPoint.y - oldPoint.y); 

    [CATransaction setDisableActions:YES]; 
    self.layer.position = position; 
    self.layer.anchorPoint = CGPointMake(0.5, 0.5); 
    [CATransaction setDisableActions:NO]; 
    } 
} 
Смежные вопросы