Как мне взаимодействовать с геометрией UIView, не обращая внимания на примененные преобразования? - PullRequest
3 голосов
/ 18 ноября 2008

У меня есть вид, что я бы хотел, чтобы пользователь вращался вокруг своего центра, нажав и удерживая его где-то, и просто двигая пальцем по кругу.

У меня все геометрия проработана; Что я делаю, так это сохраняю начальный угол касания относительно центра как 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 имеют одинаковый эффект.

Это пахнет, как будто я делаю что-то не так, но я не знаю, что мне делать.

Ответы [ 2 ]

2 голосов
/ 18 ноября 2008

Я бы использовал систему координат суперпредставления, так как на него не влияет вращение:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint location = [[touches anyObject] locationInView:self.superview];
    CGPoint relativeTouch = [MathHelper translatePoint:location relativeTo:self.center];
    CGPoint zero = CGPointMake(0, 0);
    float angle = [MathHelper getAngleForPoint:zero andPoint:relativeTouch];
    self.transform = CGAffineTransformMakeRotation(offsetAngle-angle);
}
0 голосов
/ 23 августа 2009

Просто сохраните исходное преобразование в ivar и назовите его день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...