How should I interact with UIView geometry without paying attention to any applicable transformations?

I have an opinion that I would like the user to rotate around his center by pressing and holding somewhere and just moving his finger in a circle.

I have all the geometry; What I am doing is to keep the initial angle of touch relative to the center as offsetAngle, then my touchhesMoved method looks like this:

- (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);
}

The ugly bit is the first line where I need to restore the rotation in order to get the correct position of the events in the view. If I don’t, then places jump everywhere, because there is no continuity as the view rotates ...

, (, ), :

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

, - , , .

+3
2

, :

- (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);
}
+2

ivar .

0

Source: https://habr.com/ru/post/1699691/


All Articles