【问题标题】:CGAffineTransformMakeRotation goes the other way after 180 degrees (-3.14)CGAffineTransform MakeRotation 在 180 度 (-3.14) 后反其道而行之
【发布时间】:2013-10-27 19:01:18
【问题描述】:

所以,

我正在尝试做一个非常简单的光盘旋转(2d),根据用户触摸它,就像 DJ 或其他东西一样。 它正在工作,但有一个问题,经过一定量的旋转后,它开始向后移动,这个量是在 180 度之后,或者正如我在记录角度时看到的那样,-3.14 (pi)。

我想知道,我怎样才能实现无限循环,我的意思是,用户可以保持旋转和旋转到任何一侧,只需滑动手指? 还有第二个问题,有什么办法可以加快旋转速度?

这是我现在的代码:

#import <UIKit/UIKit.h>

@interface Draggable : UIImageView {
    CGPoint firstLoc;
    UILabel * fred;
    double angle;
}

@property (assign) CGPoint firstLoc;
@property (retain) UILabel * fred;

@end


@implementation Draggable

@synthesize fred, firstLoc;

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];

    angle = 0;
    if (self) {
        // Initialization code
    }
    return self;
}
-(void)handleObject:(NSSet *)touches
          withEvent:(UIEvent *)event
             isLast:(BOOL)lst
{
    UITouch *touch =[[[event allTouches] allObjects] lastObject];
    CGPoint curLoc = [touch locationInView:self];

    float fromAngle = atan2( firstLoc.y-self.center.y,
                            firstLoc.x-self.center.x );
    float toAngle = atan2( curLoc.y-(self.center.y+10),
                          curLoc.x-(self.center.x+10));
    float newAngle = angle + (toAngle - fromAngle);

    NSLog(@"%f",newAngle);

    CGAffineTransform cgaRotate = CGAffineTransformMakeRotation(newAngle);

    self.transform = cgaRotate;

    if (lst)
        angle = newAngle;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch =[[[event allTouches] allObjects] lastObject];
    firstLoc = [touch locationInView:self];
};


-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [self handleObject:touches withEvent:event isLast:NO];
};

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self handleObject:touches withEvent:event isLast:YES];
}

@end

在 ViewController 中:

UIImage *tmpImage = [UIImage imageNamed:@"theDisc.png"];
CGRect cellRectangle;
    cellRectangle = CGRectMake(-1,self.view.frame.size.height,tmpImage.size.width ,tmpImage.size.height );
    dragger = [[Draggable alloc] initWithFrame:cellRectangle];
    [dragger setImage:tmpImage];
    [dragger setUserInteractionEnabled:YES];

    dragger.layer.anchorPoint = CGPointMake(.5,.5);

    [self.view addSubview:dragger];

我也愿意接受新的/更清洁/更正确的方法。

提前致谢。

【问题讨论】:

标签: ios objective-c rotation


【解决方案1】:

如果角度低于 -180 度或高于 180 度,则翻转角度。考虑以下touchesMoved 实现:

@implementation RotateView

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

CGFloat angleBetweenLinesInDegrees(CGPoint beginLineA, CGPoint endLineA, CGPoint beginLineB, CGPoint endLineB)
{
    CGFloat a = endLineA.x - beginLineA.x;
    CGFloat b = endLineA.y - beginLineA.y;
    CGFloat c = endLineB.x - beginLineB.x;
    CGFloat d = endLineB.y - beginLineB.y;

    CGFloat atanA = atan2(a, b);
    CGFloat atanB = atan2(c, d);

    // convert radians to degrees
    return (atanA - atanB) * 180 / M_PI;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint curPoint  = [[touches anyObject] locationInView:self];
    CGPoint prevPoint = [[touches anyObject] previousLocationInView:self];

    // calculate rotation angle between two points
    CGFloat angle = angleBetweenLinesInDegrees(self.center, prevPoint, self.center, curPoint);

    // Flip
    if (angle > 180) {
        angle -= 360;
    } else if (angle < -180) {
        angle += 360;
    }

    self.layer.transform = CATransform3DRotate(self.layer.transform, DEGREES_TO_RADIANS(angle), .0, .0, 1.0);
}

@end

当围绕视图的外部边界拖动时,它会像旋转的轮子一样不断地旋转它。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    你这里有一些问题:

    1-)

    CGPoint curLoc = [touch locationInView:self];
    

    firstLoc = [touch locationInView:self];
    

    您正在转换您的视图,然后在其中询问触摸的位置。您无法在旋转视图中获得正确的触摸位置。 使它们成为未转化的东西。 (例如self.superview放入容器后)

    2-)

    cellRectangle = CGRectMake(-1,self.view.frame.size.height,tmpImage.size.width ,tmpImage.size.height );
    

    通过将self.view.frame.size.height 作为CGRecty 参数传递,您将Draggable 实例置于屏幕之外。

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多