CGAffineTransformMakeRotation вокруг внешней точки - PullRequest
5 голосов
/ 29 августа 2011

Есть ли способ повернуть UIImage вокруг внешней точки, используя CGAffineTranformMAkeRotation? TNX много!

Ответы [ 4 ]

18 голосов
/ 11 февраля 2012

Вот функция, которая использует тот же формат, что и API-интерфейс CoreGraphics CGAffineTransform.

Это работает именно так, как должны работать другие API-интерфейсы RotateAt ().

Операция представляет эквивалентследующей спецификации: перевод (pt.x, pt.y);вращаться (угол);translate (-pt.x, -pt.y);

CGAffineTransform CGAffineTransformMakeRotationAt(CGFloat angle, CGPoint pt){
    const CGFloat fx = pt.x, fy = pt.y, fcos = cos(angle), fsin = sin(angle);
    return CGAffineTransformMake(fcos, fsin, -fsin, fcos, fx - fx * fcos + fy * fsin, fy - fx * fsin - fy * fcos);
}

Как и в случае с CGAffineTransformMakeRotation(), угол указывается в радианах, а не в градусах.

2 голосов
/ 29 августа 2011

Установите для anchorPoint слоя представления изображения что-то вне (0,0) и (1,1), то есть view.layer.anchorPoint = CGPointMake (2, 2).

2 голосов
/ 05 сентября 2011

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

1 голос
/ 29 августа 2011

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

- (void)rotateView:(UIView *)view aroundPoint:(CGPoint)point withAngle:(double)angle{
    //save original view center
    CGPoint originalCenter = view.center; 

    //set center of view to center of rotation
    [view setCenter:point];

    //apply a translation to bring the view back to its original point
    view.transform = CGAffineTransformMakeTranslation(originalCenter.x, originalCenter.y);

    //multiply the view's existing rotation matrix (the translation) by a rotation and apply it to the view
    //thereby making it rotate around the external point
    view.transform = CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(angle));
}

Просто чтобы немного объяснить мои рассуждения ...

То, что мы в основном делаем, это физическое смещение вида в точку вращения, затем применение перевода, чтобы он выглядел так, как будто он остался в исходной точке. Затем, если мы умножим вращение на новый перевод представления, мы, по существу, вращаем весь вид и его систему координат, поэтому он выглядит как вращение вокруг заданной точки. Надеюсь, я это хорошо объяснил. : | Если нет, то я предлагаю поискать матрицы преобразований в Интернете, может быть, вы найдете более подробные объяснения того, как они там складываются!

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