UIRotationGestureRecognizer - вращать вокруг точки привязки

Вот моя текущая реализация распознавателя жестов:

- (IBAction)handleRotate:(UIRotationGestureRecognizer *)recognizer {

if([recognizer state] == UIGestureRecognizerStateEnded) {

    _lastRotation = 0.0;
    return;
}

CGFloat rotation = 0.0 - (_lastRotation - [recognizer rotation]);

CGAffineTransform currentTransform = self.container.transform;
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation);

[self.container setTransform:newTransform];

_lastRotation = [recognizer rotation];

}

Работает отлично. Проблема в том, что self.container всегда вращается вокруг своего центра. Я бы хотел, чтобы он вращался вокруг средней точки двух касаний, чтобы при увеличении масштаба вы могли просто вращаться вокруг области, к которой вы прикасаетесь. Как мне это сделать?

2 ответа

Вы можете разместить центральную точку на любой CGPoint тип переменной с помощью кода

recognizer.view.center = CGPoint(x,y);

Для более подробного объяснения вы можете обратиться к этому примеру.

(В методе манипуляции pangesturerecognizer он показывает, как установить центр для просмотра)

Удачного кодирования:)

РЕДАКТИРОВАТЬ 1

Хорошо, я получил код для того, как получить сенсорные местоположения в представлении (любое) для того, что сначала требуется включить свойство множественного касания для представления. (см. рисунок ниже)

MultiPal Touch включен в XIB

Затем реализуйте метод делегата следующим образом

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Began %@",touches);
    NSUInteger touchCount = 0;
    for(UITouch *tu in touches)
    {
        CGPoint pt = [tu locationInView:self.view];
        NSLog(@"pt %f, %f",pt.x,pt.y);
        touchCount ++;
    }
    NSLog(@"touchCount %d",touchCount);
}

Этот метод показывает прикосновения в NSLog, я использую self.view просто для демонстрации вы можете использовать любой вид.

Измените этот метод в соответствии с вашими требованиями и получите центральную точку, используя координаты двух точек, используя расчеты, как показано ниже

p3.x = (p1.x + p2.x)/2; p3.y = (p1.y + p2.y)/2;

Здесь p1,p2 - это две точки касания, которые вы получили в вышеупомянутом методе делегата, а p3 - это центральная точка, которая вам требуется.

Удачного кодирования:)

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

Он принимает значения от 0,0-1,0 до левого верхнего до правого нижнего.

#import <QuartzCore/QuartzCore.h>

[[container layer] setAnchorPoint:myCGPoint];
Другие вопросы по тегам