У меня есть вид, что я бы хотел, чтобы пользователь вращался вокруг своего центра, нажав и удерживая его где-то, и просто двигая пальцем по кругу.
У меня все геометрия проработана; Что я делаю, так это сохраняю начальный угол касания относительно центра как offsetAngle, а затем мой метод touchesMoved выглядит так:
- (void) touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
self.transform = CGAffineTransformMakeRotation(0);
CGPoint location = [[touches anyObject] locationInView: self];
CGPoint actualCenter = [self convertPoint: self.center fromView: self.superview];
CGPoint relativeTouch = [MathHelper translatePoint:location relativeTo: actualCenter];
CGPoint zero = CGPointMake(0, 0);
float angle = [MathHelper getAngleForPoint:zero andPoint:relativeTouch];
self.transform = CGAffineTransformMakeRotation(offsetAngle-angle);
}
Гадкий бит - это первая строка, где мне нужно восстановить вращение, чтобы получить правильные позиции событий в представлении. Если я этого не сделаю, то места перепрыгнут повсюду, так как нет преемственности, так как вид вращается ...
Другая проблема возникает, когда вы хотите манипулировать рамкой представления (например, перемещая ее вниз), когда к представлению применено преобразование:
- (IBAction)toggleSettingsView {
BOOL state = [settingsSwitch isOn];
float height = optionsView.bounds.size.height;
CGRect polygonFrame = polygonView.frame;
[UIView beginAnimations:@"advancedAnimations" context:nil];
[UIView setAnimationDuration:0.3];
if (state) {
optionsView.alpha = 1.0;
polygonFrame.origin.y += height;
} else {
optionsView.alpha = 0.0;
polygonFrame.origin.y -= height;
}
polygonView.frame = polygonFrame;
[UIView commitAnimations];
}
Это сильно искажает вид.
Я должен упомянуть, что и преобразование CGTransform, и преобразование CALayer имеют одинаковый эффект.
Это пахнет, как будто я делаю что-то не так, но я не знаю, что мне делать.