如何停止和扭转UIView的动画

本文转载至  http://codego.net/576089/

我有它收缩时碰到切换按钮UIView的动画跳和它扩展恢复到原来的大小当再次接触到按钮。密封式前大灯一切都工作得很好。问题是,动画师注意到-例如3秒钟。在此期间,我还是希望能够进行交互的接口。当再次接触到跳跃键,而动画仍在进行中的动画应该就停在哪里是和反向。 在苹果Q&正如我已经找到了方法,所有的动画 但我没有看到从这里扭转动画(并省略原动画的其余部分)的方式。我该怎么办呢?

- (IBAction)toggleMeter:(id)sender {
 if (self.myView.hidden) {
  self.myView.hidden = NO;
  [UIView animateWithDuration:3 animations:^{
   self.myView.transform = expandMatrix;
  } completion:nil];
 } else {
  [UIView animateWithDuration:3 animations:^{
   self.myView.transform = shrinkMatrix;
  } completion:^(BOOL finished) {
   self.myView.hidden = YES;
  }];
 }
}

+
本文地址 :CodeGo.net/576089/

-------------------------------------------------------------------------------------------------------------------------
1. 除了以下(在此我们抓住当前状态从表现层,停止动画,重新保存从表现层的当前状态,并启动新的动画),有很多简单的解决方案。 DM做的基于块的动画,如果你想停止动画并启动一个新的活力,一种能将UIViewAnimationOptionBeginFromCurrentState选项:

[UIView animateWithDuration:3.0
      delay:0.0
     options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
     animations:^{
      // specify the new `frame`, `transform`, etc. here
     }
     completion:NULL];

您可以通过新建停止当前动画师和动画启动在哪里当前的不放过实现这一目标。为此 CodeGo.net,您可以与quartz2D: 添加QuartzCore。你的项目,如果你还没有。 导入所需的头,如果你已经有了不:

#import <QuartzCore/QuartzCore.h>

让你的脚停止现有的动画:

[self.subview.layer removeAllAnimations];

获取参考电流表示层(即视图的状态,因为它恰恰是在这

CALayer *currentLayer = self.subview.layer.presentationLayer;

重置transform(或者frame或无论)根据在当前值presentationLayer

self.subview.layer.transform = currentLayer.transform;

现在,领导者从该transform(或者frame或其他)为新值:

[UIView animateWithDuration:1.0
      delay:0.0
     options:UIViewAnimationOptionAllowUserInteraction
     animations:^{
      self.subview.layer.transform = newTransform;
     }
     completion:NULL];

把所有的一起,这里就是我的切换尺度变换的2.0倍确定并背例程:

- (IBAction)didTouchUpInsideAnimateButton:(id)sender
{
 CALayer *currentLayer = self.subview.layer.presentationLayer;
 [self.subview.layer removeAllAnimations];
 self.subview.layer.transform = currentLayer.transform;
 CATransform3D newTransform;
 self.large = !self.large;
 if (self.large)
  newTransform = CATransform3DMakeScale(2.0, 2.0, 1.0);
 else
  newTransform = CATransform3DIdentity;
 [UIView animateWithDuration:1.0
       delay:0.0
      options:UIViewAnimationOptionAllowUserInteraction
      animations:^{
       self.subview.layer.transform = newTransform;
      }
      completion:NULL];
}

或者,如果你想切换frame尺寸从100×100到200×200和背部:

- (IBAction)didTouchUpInsideAnimateButton:(id)sender
{
 CALayer *currentLayer = self.subview.layer.presentationLayer;
 [self.subview.layer removeAllAnimations];
 CGRect newFrame = currentLayer.frame;
 self.subview.frame = currentLayer.frame;
 self.large = !self.large;
 if (self.large)
  newFrame.size = CGSizeMake(200.0, 200.0);
 else
  newFrame.size = CGSizeMake(100.0, 100.0);
 [UIView animateWithDuration:1.0
       delay:0.0
      options:UIViewAnimationOptionAllowUserInteraction
      animations:^{
       self.subview.frame = newFrame;
      }
      completion:NULL];
}

顺便说一句,虽然一般并不重要的真快动画,缓慢动画像你这样的,你可能需要设置动画的持续时间是扭转多远你在你目前的动画已经提前拒绝(例如,如果你是0.5秒到3.0秒的动画,当反向,不可思议不要想拿3.0秒扭转这一方面做了跳跃灯塔动画师的小部分,而仅仅0.5秒)。这可能看起来像:

- (IBAction)didTouchUpInsideAnimateButton:(id)sender
{
 CFTimeInterval duration = kAnimationDuration;    // default the duration to some constant
 CFTimeInterval currentMediaTime = CACurrentMediaTime(); // get the current media time
 static CFTimeInterval lastAnimationStart = 0.0;   // media time of last animation (zero the first time)
 // if we previously animated, then calculate how far along in the previous animation we were
 // and we‘ll use that for the duration of the reversing animation; if larger than
 // kAnimationDuration that means the prior animation was done, so we‘ll just use
 // kAnimationDuration for the length of this animation
 if (lastAnimationStart)
  duration = MIN(kAnimationDuration, (currentMediaTime - lastAnimationStart));
 // save our media time for future reference (i.e. future invocations of this routine)
 lastAnimationStart = currentMediaTime;
 // if you want the animations to stay relative the same speed if reversing an ongoing
 // reversal, you can backdate the lastAnimationStart to what the lastAnimationStart
 // would have been if it was a full animation; if you don‘t do this, if you repeatedly
 // reverse a reversal that is still in progress, they‘ll incrementally speed up.
 if (duration < kAnimationDuration)
  lastAnimationStart -= (kAnimationDuration - duration);
 // grab the state of the layer as it is right now
 CALayer *currentLayer = self.subview.layer.presentationLayer;
 // cancel any animations in progress
 [self.subview.layer removeAllAnimations];
 // set the transform to be as it is now, possibly in the middle of an animation
 self.subview.layer.transform = currentLayer.transform;
 // toggle our flag as to whether we‘re looking at large view or not
 self.large = !self.large;
 // set the transform based upon the state of the `large` boolean
 CATransform3D newTransform;
 if (self.large)
  newTransform = CATransform3DMakeScale(2.0, 2.0, 1.0);
 else
  newTransform = CATransform3DIdentity;
 // now animate to our new setting
 [UIView animateWithDuration:duration
       delay:0.0
      options:UIViewAnimationOptionAllowUserInteraction
      animations:^{
       self.subview.layer.transform = newTransform;
      }
      completion:NULL];
}


2. 有一招做到这一点,但它是必要写的收缩(和另一个类似的一个利差):

- (void) shrink {
 [UIView animateWithDuration:0.3
      animations:^{
      self.myView.transform = shrinkALittleBitMatrix;
      }
      completion:^(BOOL finished){
       if (continueShrinking && size>0) {
        size=size-1;
        [self shrink];
       }
      }];
}

0.3秒每一个在其中收缩整个动画的十分之一现在跳,关键是要缩小动画动画的3秒打入10(或10多,当然):shrinkALittleBitMatrix。在每个动画完成后调用只当布尔伊瓦continueShrinking当int是真实的Ivarsize为正(在全尺寸的视图。将大小=10,以最小的尺寸的视图。将大小=0)。当您按下按钮更改伊瓦continueShrinking为false,然后调用expand。这将停止动画在小于0.3秒。 好了,你必须填写详细资料,但我希望它能帮助。 + 
3. 才能评价与互动的用户界面,而动画是一个

[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
 //Your animation
} completion:^(BOOL finished) {
}];

+

本文地址 :CodeGo.net/576089/

时间: 2024-10-10 17:06:35

如何停止和扭转UIView的动画的相关文章

ios uiview封装动画(摘录)

iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之间 常见方法解析: + (void)setAnimat

IOS UIVIEW layer动画 总结

转发自:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/16306_12.html IOS UIVIEW layer动画 总结,有需要的朋友可以参考下. 这是我搜索的所有动画效果,感谢前辈在网上分享. //翻页效果动画 左边 [UIView beginAnimations:@"animation" context:nil]; [UIView setAnimationDuration:1.0f]; [UIView set

iOS开发UI篇—核心动画(UIView封装动画)(转摘)

iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIViewbeginAnimations:nil context:nil]和[UIView commitAnimations]之间 常见方法解析: + (void)setAnimati

IOS开发-UIView之动画效果的实现方法(合集)

http://www.cnblogs.com/GarveyCalvin/p/4193963.html 前言:在开发APP中,我们会经常使用到动画效果.使用动画可以让我们的APP更酷更炫,最重要的是优化用户体验,但取决于动画的质量.像QQ.微信.新浪微博等APP,动画效果就很好了,至少我很喜欢它们的动画,让我使用起来感觉很顺畅,心情很开朗.本文会介绍UIView效果的实现方法,非核心动画. 一.使用UIView类实现动画 基本写法,代码必须放在Begin和Commit之间: [UIView beg

iOS开发——动画编程Swift篇&amp;(一)UIView基本动画

UIView基本动画 1 // MARK: - UIView动画 ------------------------------------- 2 3 // MARK: - UIView动画-淡入 4 @IBAction func simpleAnimationFadeIn() 5 { 6 UIView.beginAnimations(nil, context: nil) 7 UIView.setAnimationDuration(2.0)//设置动画时间 8 testImageView.alph

用layer添加UIView的动画

项目有时会遇到用UIView 添加动画的情况,这里我觉得在layer上添加动画比较好,因为可以详细地设定动画属性,方便理解 下面是一个旋转动画: -(void)roundBtnAction:(id)sender {            UIButton * button = (UIButton *)sender;        //Animation自旋转(layer动画):    CABasicAnimation* rotationAnimation;        rotationAnim

iOS开发UI篇—核心动画(UIView封装动画)

一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之间 常见方法解析: + (void)setAnimationDelegate:(id)delegate  

核心动画(UIView封装动画)

一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之间 常见方法解析: + (void)setAnimationDelegate:(id)delegate  

UIView的动画

// //  ViewController.m //  UI-NO.6 // //  Created by Bruce on 15/7/20. //  Copyright (c) 2015年 Bruce. All rights reserved. // #import "ViewController.h" @interface ViewController () { UIImageView *animationView; NSMutableArray *imageList; } @en