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
Хорошо, я получил код для того, как получить сенсорные местоположения в представлении (любое) для того, что сначала требуется включить свойство множественного касания для представления. (см. рисунок ниже)
Затем реализуйте метод делегата следующим образом
- (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];