i have a label that i want to fade in and then to fade out.
here is my code:
-(void) fadein
{
scoreLabel.alpha = 0;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:2];
scoreLabel.alpha = 1;
[UIView commitAnimations];
[UIView setAnimationDidStopSelector:#selector(animationDidStop:finished:context:)];
}
-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
scoreLabel.alpha = 0;
[UIView commitAnimations];
}
from this code i get this situation: my label is fade in and then i don't see the fadeout animation.
how can i fix it?
-(void) fadein
{
scoreLabel.alpha = 0;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
//don't forget to add delegate.....
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:2];
scoreLabel.alpha = 1;
//also call this before commit animations......
[UIView setAnimationDidStopSelector:#selector(animationDidStop:finished:context:)];
[UIView commitAnimations];
}
-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
scoreLabel.alpha = 0;
[UIView commitAnimations];
}
The call to setAnimationDidStopSelector should be before commit the animations:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:2];
[UIView setAnimationDidStopSelector:#selector(animationDidStop:finished:context:)];
scoreLabel.alpha = 1;
[UIView commitAnimations];
Related
Im using the below code for touches ended. After a few uiviews are moved around a bit I call a segue in my code like this:
[self performSegueWithIdentifier: #"segueToLevel2" sender: self]
The segue's transition types are set to "cross dissolve".
With the code below everything works fine until I get to level 5. On level five when the segue is called it does a corner to corner flip instead of the cross dissolve and from this point on every segue in my app does this flip instead of what they were set to do. If I take out my touches ended method everything works as expected so the problem must be here. I just cant figure out why this works for levels 1-4 but craps out on level 5. Any help would be greatly appreciated....im loosing my mind here.
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
switch (level) {
case 1:{
if ((piece11.hidden == YES) && (piece1moving.hidden == NO) && (piece1placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece1moving.frame = CGRectMake(-65, 153, 490, 422);
[UIView commitAnimations];
[NSTimer scheduledTimerWithTimeInterval:3 target:(self) selector:#selector(moveToFront) userInfo:(nil) repeats:NO];
[NSTimer scheduledTimerWithTimeInterval:1 target:(self) selector:#selector(singlePieceCallback) userInfo:(nil) repeats:NO];
}
}
break;
case 2:{
UITouch *touch1 = [[event allTouches] anyObject];
if (([touch1 view] == piece1) && (piece1placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece1.frame = CGRectMake(47, 402, 305, 312);
[UIView commitAnimations];
}
if (([touch1 view] == piece2) && (piece2placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece2.frame = CGRectMake(34, 4, 291, 399);
[UIView commitAnimations];
}
}
break;
case 3:{
UITouch *touch1 = [[event allTouches] anyObject];
if (([touch1 view] == piece1) && (piece1placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece1.frame = CGRectMake(1, 419, 308, 356);
[UIView commitAnimations];
}
if (([touch1 view] == piece2) && (piece2placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece2.frame = CGRectMake(-7, 67, 291, 315);
[UIView commitAnimations];
}
if (([touch1 view] == piece3) && (piece3placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece3.frame = CGRectMake(-16, 169, 427, 310);
[UIView commitAnimations];
}
}
break;
case 4:{
UITouch *touch1 = [[event allTouches] anyObject];
if (([touch1 view] == piece1) && (piece1placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece1.frame = CGRectMake(0, 76, 219, 261);
[UIView commitAnimations];
}
if (([touch1 view] == piece2) && (piece2placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece2.frame = CGRectMake(89, 485, 255, 287);
[UIView commitAnimations];
}
if (([touch1 view] == piece3) && (piece3placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece3.frame = CGRectMake(103, 197, 305, 330);
[UIView commitAnimations];
}
if (([touch1 view] == piece4) && (piece4placedstate == 0)){
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece4.frame = CGRectMake(5, 277, 228, 294);
}
}
break;
case 5:{
UITouch *touch1 = [[event allTouches] anyObject];
if (([touch1 view] == piece1) && (piece1placedstate == 0)) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece1.frame = CGRectMake(115, 89, 247, 263);
[UIView commitAnimations];
}
if (([touch1 view] == piece2) && (piece2placedstate == 0)) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece2.frame = CGRectMake(14, 497, 211, 271);
[UIView commitAnimations];
}
if (([touch1 view] == piece3) && (piece3placedstate == 0)) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece3.frame = CGRectMake(92, 248, 244, 272);
[UIView commitAnimations];
}
if (([touch1 view] == piece4) && (piece4placedstate == 0)) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece4.frame = CGRectMake(87, 458, 228, 294);
}
if (([touch1 view] == piece5) && (piece5placedstate == 0)) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece5.frame = CGRectMake(-13, 102, 244, 303);
}
}
break;
default:
break;
}
I'm still not sure what was causing my issue with the above code but I have found a solution in re-writing my code and using a UIPanGestureRecognizer like the one below attached to each of the pieces. This works perfectly throughout.
- (void) dragGesture5:(UIPanGestureRecognizer *) panGesture {
CGPoint translation = [panGesture translationInView:self.view];
switch (panGesture.state) {
case UIGestureRecognizerStateBegan:{
originalCenter = piece5.center;
[self.view bringSubviewToFront:piece5];
}
break;
case UIGestureRecognizerStateChanged:{
piece5.center = CGPointMake(piece5.center.x + translation.x,
piece5.center.y + translation.y);
[self checkColision];
}
break;
case UIGestureRecognizerStateEnded:{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
piece5.center = originalCenter;
[UIView commitAnimations];
}
break;
default:
break;
}
[panGesture setTranslation:CGPointZero inView:self.view];
}
I know this question gets asked a lot but i have tried all the other answers and i can't figure out why the animation stop selector does not get called. Here is the code:
-(void) moveImage:(UIImageView *)image duration:(NSTimeInterval)duration curve:(int)curve x:(CGFloat)x y:(CGFloat)y annKey:(NSString *) annKey{
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve:curve];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDidStopSelector:#selector(animationFinished:finished:context:)];
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
image.transform = transform;
[UIView beginAnimations:annKey context:NULL];
[UIView commitAnimations];
}
This is the main animation function that gets sent all the correct parameters.
- (void)animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context
{
if ([animationID isEqualToString:#"Burn"])
{
NSLog(#"Animation: %# has finished.",animationID);
}
NSLog(#"This does not get called, why not?");
}
None of my NSLogs display text. What am i doing wrong?
You need tho do -
[UIView beginAnimations:annKey context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:#selector(animationFinished:finished:context:)];
// Now define rest.
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve:curve];
[UIView setAnimationBeginsFromCurrentState:YES];
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
image.transform = transform;
[UIView commitAnimations];
Not sure what the problem is, but you really shouldn't be using beginAnimations/commitAnimations. Instead, use block animations. You define the completion code directly in the completion portion of the call.
[UIView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
// animation code
}
completion:^(BOOL finished){
// completion code
}];
I am trying to animate my UITableView sliding off the screen, I have tried this below without success:
-(void)slideTableViewOffScreen
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
stageSelectionTable.frame = CGRectMake(stageSelectionTable.frame.origin.x - stageSelectionTable.frame.size.width, stageSelectionTable.frame.origin.y, stageSelectionTable.frame.size.height, stageSelectionTable.frame.size.width);
[UIView commitAnimations];
}
Any ideas why it might not work, or what I need to do for this animation to work? When that code is called, nothing happens.
Turns out this code works without any weirdness:
-(void)slideTableViewOffScreen
{
CGRect newFrame = stageSelectionTable.frame;
newFrame.origin.x -= 130;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
stageSelectionTable.frame = newFrame;
[UIView commitAnimations];
}
I am new in ios development, Now i am doing some animation on my application.In my application has one menu on the bottom of main view and have two button one for hide the menu and other for show the menu .My needs is the show and hide function of menu is working like
the [self presentModalViewController:menuView animated:YES]; and [self dismissModalViewControllerAnimated:YES]; function(ie. click the show button ,pop the menuView from the bottom of main view and click the hide button ,move down the menuView ) . I know the basic animation like:
[UIView beginAnimations:#"ShowHideView" context:nil];
[UIView setAnimationCurve:UIViewAnimationOptionOverrideInheritedCurve];
[UIView setAnimationDuration:1.0];
[UIView setAnimationDelegate:self];
[menuView setAlpha:0];
[UIView commitAnimations];
If any body know ,please help me.
When you tap showMenuView, do as following,
- (IBAction)showView:(id)sender
{
[self.view addSubview: menuView];
CGRect rect = menuView.frame;
rect.origin.y = 480;
menuView.frame = rect;
[UIView beginAnimations:#"ShowView" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5];
rect.origin.y = 0;
menuView.frame = rect;
[UIView commitAnimations];
}
And to hide,
- (IBAction)hideView:(id)sender
{
CGRect rect = menuView.frame;
[UIView beginAnimations:#"HideView" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:#selector(animationDidStop:finished:context:)];
rect.origin.y = 480;
menuView.frame = rect;
[UIView commitAnimations];
}
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
[menuView removeFromSuperview];
}
I want to create a simple animation changing alpha value:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[view1 setAlpha:0.00];
[UIView commitAnimations];
Ok in this way I change the alpha value for two seconds and it works fine, but I want this thing:
When alpha is 0 the animation must should start another time to alpha = 1
So the animation should be: alpha 0 -> alpha 1 -> alpha 0 -> alpha 1 -> ... and so on with a duration of two seconds.
Can you help me?
my complete code is
-(IBAction){
FirstViewController *firstViewController = [[[FirstViewController alloc] init]autorelease];
[firstViewController.label1 setAlpha:1.00];
[firstViewController.label2 setAlpha:1.00];
view = firstViewController.viewFirst; //this is my view and I copy in other view
[self fadeOut:nil finished:nil context:nil];}
- (void) fadeOut:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:#selector(fadeIn:finished:context:) ];
[view setAlpha:0.00];
[UIView commitAnimations];
}
- (void) fadeIn:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:#selector(fadeOut:finished:context:) ];
[view setAlpha:1.00];
[UIView commitAnimations];
}
In iOS 4 and later you can do
view1.alpha = 1.0;
[UIView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionRepeat|UIViewAnimationAutoReverse
animations:^{
view1.alpha = 0.0;
}
completion:nil
];
- (void) fadeOut:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
if(animationRunning){
[UIView setAnimationDidStopSelector:#selector(fadeIn:finished:context:) ];
}
[view1 setAlpha:0.00];
[UIView commitAnimations];
}
- (void) fadeIn:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
if(animationRunning){
[UIView setAnimationDidStopSelector:#selector(fadeOut:finished:context:) ];
}
[view1 setAlpha:1.00];
[UIView commitAnimations];
}
These will call each other on the end of the animation...
All you need to do to start the ball rolling is call:
[self fadeOut:nil finished:nil context:nil];
You can set a animation completion handler (either using the block-based API or +(void)setAnimationDidStopSelector:(SEL)selector) and start the next one.
Alternatively have a look at those to methods:
+ setAnimationRepeatCount:
+ setAnimationRepeatAutoreverses:
I think, you can use just one function (based on previous answer's functions):
- (void) fadeIn:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:#selector(fadeIn:finished:context:) ];
[view1 setAlpha:mod(1-view1.alpha)];
[UIView commitAnimations];
}
The alplha must not be a negative value, so a mod must be applied
You create a ViewController like below
FirstViewController *firstViewController = [[[FirstViewController alloc] init]autorelease];
And then adding animation to it, but when did you add firstViewController.view in view heirarchy(addSubview). Also just calling
[[[FirstViewController alloc] init]autorelease]
wont create label object unless you have override its init method. Try debugging if label is allocated at that point of time.
Also for animation i use uiview anitmation with completion block method