2010-10-16 3 views
2

Я работаю над графическим приложением.Повернуть UIView на основе UITouch

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

Проблема с поворотом. У меня есть движущийся и изменяющий размер рабочий режим.

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

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

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

Я просмотрел квадрат с использованием 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 или более полных кругов и возвращался к начальной ориентации).

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

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

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

Мысли?

Спасибо!

+0

Пример приложения Apple [Touches_GestureRecognizers] (http://developer.apple.com/library/ios/#samplecode/Touches/Introduction/Intro.html) (а не Touches_Classic) показывает, как использовать панорамирование, зажим и поворот распознаватели жеста сделать все это легко. – Anna

+0

Yup ... Я нашел, что через 10 минут после публикации этого. Я отправил это после примерно 6 часов поиска. Сожалею. – mbm29414

ответ

4
-(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

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

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

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