Поворот UIView на основе UITouch - PullRequest
2 голосов
/ 16 октября 2010

Я работаю над приложением для рисования.

Я хочу, чтобы пользователь мог «перетаскивать» фигуру на экран, а затем перемещать, изменять ее размер или поворачивать по своему желанию.

Проблема заключается в повороте.У меня отлично работает перемещение и изменение размера.

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

Я искал иискал, но не нашел ответа, похожего на то, что я пытаюсь сделать.

По сути, скажем, пользователь отбрасывает квадрат на "поверхности".Затем они касаются его и получают несколько ручек.Они могут касаться в любом месте и перемещаться, чтобы переместить квадрат вокруг (уже работает), коснуться и перетащить ручку изменения размера, чтобы изменить размер квадрата (уже работает), или захватить ручку вращения, чтобы квадрат вращался вокруг своего центра.

Я посмотрел, как нарисовать квадрат с помощью UIBezierPath или просто заполнил его подклассом UIView.

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

Вот часть кода, который я пробовал (это не работает,и я пробовал много разных подходов к этому):

- (void) rotateByAngle:(CGFloat)angle
{

CGPoint cntr = [self center];

CGAffineTransform move  = CGAffineTransformMakeTranslation(-1 * cntr.x, -1 * cntr.y);
[[self path] applyTransform:move];

CGAffineTransform rotate = CGAffineTransformMakeRotation(angle * M_PI / 180.0);
[[self path] applyTransform:rotate];

[self setNeedsDisplay];
CGAffineTransform moveback = CGAffineTransformMakeTranslation(cntr.x, cntr.y);
[[self path] applyTransform:moveback];

}

В случае, если это не очевидно, мысль здесь, чтобы переместить представление в начало координат (0,0), вращаться вокругэту точку, а затем переместите ее назад.

Если вам интересно, «угол» рассчитывается правильно.Я также обернул приведенный выше код в блок [UIView beginAnimations:nil context:NULL] / [UIView commitAnimations].

Можно ли повернуть UIView на "пользовательскую" сумму?Я видел / делал это раньше, когда я анимировал элемент управления для вращения, но в этих примерах элемент управления всегда заканчивал «квадратом» (то есть он вращал 1 или более полных кругов и возвращался к своей начальной ориентации).

Можно ли выполнить это вращение "в реальном времени" в ответ на UITouches?Нужно ли рисовать квадрат как элемент в слое UIView и вместо этого вращать слой?

Просто чтобы вы знали, что раньше я работал с формой, нарисованной набором линий или UIBezierPaths.Я бы применил CGAffineTransform к данным, а затем вызвал метод drawRect:, который перерисовал бы объект внутри пользовательского UIView.Этот UIView будет содержать целый ряд этих элементов, каждый из которых необходимо будет перерисовывать всякий раз, когда один из них понадобится.

Итак, я пытаюсь сделать приложение более производительным, создав кучуподклассов UIView, которые получат команду для перерисовки, когда пользователь что-то с ними сделает.Apple Keynote для iPad, кажется, выполняет это с помощью UIGestureRecognizer, так как вам нужно использовать два пальца, чтобы вращать добавленную форму.Это путь?

Мысли?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 17 января 2011
-(void)rotate{
    CGAffineTransform transform;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationOptionBeginFromCurrentState];
    myView.alpha = 1;
    transform = CGAffineTransformRotate(myView.transform,0.5*M_PI);
    [myView setUserInteractionEnabled:YES];
    myView.transform = transform;
    [UIView commitAnimations];
}

Это может помочь.

1 голос
/ 29 февраля 2012

для простого поворота вы можете не включать анимацию:

-(void)rotate:(CGFloat)angle
{
    CGAffineTransform  transform = CGAffineTransformRotate( myView.transform, angle * M_PI / 180.0 );
    myView.transform = transform;
}

Я использую простой NSTimer для управления анимацией.

...