iPhone - палец отслеживания колеса переходит в ту же исходную позицию? - PullRequest
1 голос
/ 15 ноября 2010

Я пытаюсь реализовать колесо выбора в приложении для 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 ]

3 голосов
/ 18 ноября 2010

Правильно - это имеет смысл - это действительно то, что делает ваш код.

То, что вам нужно добавить, это начальное значение, с которого вы начали перетаскивать как относительный поворот - или отслеживать ваш последний поворот.

Очень сложный способ показан ниже - но это должно помочь понять суть.

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

Очевидно, что вы можете сделать это намного более элегантно - и выше не хватает 0 .. 2xPI, что вам нужно.

0 голосов
/ 16 ноября 2010

Потому что само представление все еще старое. Вы можете получить файл примера 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;

}

где вы, таким образом, остаетесь в пределах видимости и ее относительного угла. В качестве альтернативы - в вашем коде - сохраняйте сам относительный угол.

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