2013-06-18 4 views
0

Je souhaite créer un UISlider animée en réduction. Fondamentalement, le curseur prendra la taille de l'image miniature jusqu'à ce qu'il soit touché à quel point il s'agrandit jusqu'à sa taille maximale pendant le changement. Une fois la valeur modifiée et le curseur relâché, le curseur revient à la taille d'origine (taille de l'image).iOS - Collapse Animation UISlider

J'ai essayé de travailler avec touchesBegan et touchEnd mais cela ne m'a pas très loin. Jusqu'à présent, j'ai sous-classé UISlider et remplacé les beginTrackingWithTouch et endTrackingWithTouch. Ce type de code accomplit l'effet d'effondrement (sans l'animation bien sûr) mais le curseur de curseur ne change plus. Des idées sur la meilleure façon de le faire?

#import "CollapsingUISlider.h" 

@implementation CollapsingUISlider 


/*-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
//self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width  * 4.0f, self.frame.size.height); 
[super touchesBegan:touches withEvent:event]; 
} 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
// self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width * 0.25f, self.frame.size.height); 
[super touchesEnded:touches withEvent:event]; 
}*/ 
-(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 
     self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, 400, self.frame.size.height); 
     return YES; 
} 
-(void)endTrackingWithTouch:(UITouch*)touch withEvent:(UIEvent *)event { 
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, 20, self.frame.size.height); 
} 
-(BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, 400, self.frame.size.height); 
    return self.tracking; 
} 
@end 
+0

Le problème est quand vous commencez à toucher, vous avez commencé à interagir avec le contrôle, ce qui signifie qu'il pourrait être suivi des changements de valeur. Si vous redimensionnez votre contrôle en même temps, vous pouvez voir que ce n'est pas une bonne idée. Pourrait aussi agir de manière étrange. – Daniel

+0

Les valeurs de retour (spécifiquement 'self.tracking') peuvent poser problème. Je pense que vous pourriez le faire plus facilement et plus en sécurité en changeant un cadre de sous-vue à la place, sinon la mise en page va être ruinée. –

Répondre

0

je fini par faire quelque chose comme ceci:

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
[panRecognizer setMinimumNumberOfTouches:1]; 
[panRecognizer setMaximumNumberOfTouches:1]; 
[platformView addGestureRecognizer:panRecognizer]; 

-(void)move:(id)sender { 
[self.view bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]]; 
CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view]; 

if ([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 
    firstX = [[sender view] center].x; 
    firstY = [[sender view] center].y; 
} 

translatedPoint = CGPointMake(firstX, firstY+translatedPoint.y); 
[[sender view] setCenter:translatedPoint]; 
if (platformView.center.y < platformCenter.y - offset) { 
    platformView.center = CGPointMake(platformCenter.x,platformCenter.y-offset); 
    ((UIPanGestureRecognizer*)sender).enabled = NO; 
} else if (platformView.center.y > platformCenter.y) { 
    platformView.center = CGPointMake(platformCenter.x,platformCenter.y); 
    ((UIPanGestureRecognizer*)sender).enabled = NO; 
} 
}