iPhone - 车轮跟踪手指跳到相同的起始位置?

时间:2010-11-15 20:57:35

标签: iphone xcode

我正在尝试在iphone应用程序中实现选择轮。我有车轮跟踪用户的手指,但现在由于某种原因,当用户触摸屏幕时,车轮会跳跃,因此车轮的相同部分每次都会跟踪手指。

如何让轮子像用户从任何位置拖动一样旋转?

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
NSSet *allTouches = [event allTouches];

int tInput = [allTouches count]-1;

UITouch *touch =[[allTouches allObjects] objectAtIndex:tInput];
CGPoint location = [touch locationInView:self.view];
float theAngle = atan2( location.y-imageX.center.y, location.x-imageX.center.x );

CGAffineTransform cgaRotate = CGAffineTransformMakeRotation(theAngle);
imageX.transform = cgaRotate;

}

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

正确 - 这非常有意义 - 这确实是您的代码所做的。

您需要添加的是初始值,您可以将拖动作为相对旋转开始 - 或跟踪上一次旋转。

下面显示了一个非常精细的方法 - 但这应该有助于明确这一点。

@interface UntitledViewController : UIViewController {
        CGPoint firstLoc;
        UILabel * fred;
        double angle;
}
@property (assign) CGPoint firstLoc;
@property (retain) UILabel * fred;

@implementation UntitledViewController
@synthesize fred,firstLoc;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.fred = [[UILabel alloc] initWithFrame:CGRectMake(100,100,100,100)];
    fred.text = @"Fred!"; fred.textAlignment = UITextAlignmentCenter;
    [self.view addSubview:fred];

    angle = 0; // we aint have rotated just yet...
};

// make sure we get them drag events.
- (BOOL)isFirstResponder { return YES; } 

-(void)handleObject:(NSSet *)touches 
          withEvent:(UIEvent *)event 
             isLast:(BOOL)lst 
{
    UITouch *touch =[[[event allTouches] allObjects] lastObject];
    CGPoint curLoc = [touch locationInView:self.view];

    float fromAngle = atan2( firstLoc.y-fred.center.y, 
                             firstLoc.x-fred.center.x );
    float toAngle = atan2( curLoc.y-fred.center.y, 
                           curLoc.x-fred.center.x );

    // So the angle to rotate to is relative to our current angle and the
    // angle through which our finger moved (to-from)
    float newAngle = angle + (toAngle - fromAngle);

    CGAffineTransform cgaRotate = CGAffineTransformMakeRotation(newAngle);
    fred.transform = cgaRotate;

    // we only 'save' the current angle when we're done with the drag.
    //
    if (lst)
        angle = newAngle;
    }

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

    // capture where we started - so we can later work out the 
    // rotation relative to this point.
    //
    firstLoc = [touch locationInView:self.view];
};


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

显然你可以做得更优雅 - 而且上面错过了一些你想要的2xPI封顶。

答案 1 :(得分:0)

因为视图本身仍然是旧视图。您可能希望在以下位置获取zip示例文件:

 http://bynomial.com/blog/?p=77

并在PuttyView.m中更改:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
....  
else {
   self.center = CGPointMake(self.center.x + touchPoint.x - touchStart.x,
                          self.center.y + touchPoint.y - touchStart.y);

else {
   NSSet *allTouches = [event allTouches];

   int tInput = [allTouches count]-1;

   UITouch *touch =[[allTouches allObjects] objectAtIndex:tInput];
   CGPoint location = [touch locationInView:self];
   float theAngle = atan2( location.y-self.center.y, location.x-self.center.x );

   CGAffineTransform cgaRotate = CGAffineTransformMakeRotation(theAngle);
   self.transform = cgaRotate;

}

因此您保持在视图及其相对角度内。或者 - 在你的代码中 - 保持相对角度本身。