目次
UIView 公式ドキュメント
UIView
ビューを作成する
ペイント サイクルの表示
複数の View プロパティを変更するとアニメーション化でき、プロパティを短期間に変更することでアニメーションを作成できます。 UIView クラスはアニメーションを実行する多くの作業を行いますが、どのプロパティの変更をアニメーション化するかを決定する必要があります。以下は 2 つの異なる初期化アニメーション方法です:
UIView动画
UIView属性动画
Block动画
UIViewTransition动画
CoreAnimation动画
CABasicAnimation基本动画
CAKeyframeAnimation关键帧动画
CATransaction 过度动画
CAAnimationGroup 组动画
CoreAnimation相关知识
CAAnimation
CAPropertyAnimation
CAKeyframeAnimation
CATransition
后记
ホームページ ウェブフロントエンド htmlチュートリアル iOSの詳しい説明Animation_html/css_WEB-ITnose

iOSの詳しい説明Animation_html/css_WEB-ITnose

Jun 24, 2016 am 11:40 AM

iOS アニメーションの詳細な説明

この記事では iOS でのアニメーションの使用についてのみ説明します
アニメーションは主に UIView アニメーションと CoreAnimation アニメーションの 2 つのカテゴリに分類されます。
UIView アニメーションには、UIView プロパティ アニメーション、UIViewBlock アニメーション、および UIViewTransition アニメーションが含まれます。
CoreAnimation アニメーションは主に CAAnimation と CALayer を渡します。一般的に使用されるのは CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup です。

UIView 公式ドキュメント

UIView

継承元: UIResponder:NSObject

Follow: UITraitEnvironment、 ynamicItem、NSObject、UI座標空間、 UIAppearanceContainer 、 UIAppearance、NSCoding
フレームワーク: iOS 2.0 以降の UIKit

View オブジェクトはアプリケーションがユーザーと対話する主な方法であるため、一連の責任があります。以下にその一部を示します。

  • ペイントとアニメーション:
  • ビューは、UIKit、Core Graphics、OpenGL ES などのテクノロジーを使用して、長方形の領域に描画します
  • 一部のビュー プロパティは、新しい値にアニメーション化できます
  • レイアウトとサブビュー管理
  • ビューには0個以上の子ビューを含めることができます
  • 各ビューは、親ビューを基準にしてサイズを変更するデフォルトの動作を定義します
  • 必要に応じて、ビューは子ビューのサイズと位置を定義できます
  • イベント処理
  • View は、UIResponder クラスで定義されたタッチやその他のイベントを処理できるレスポンダーです
  • View は、addGestureRecognizer メソッドを使用して、一般的なジェスチャを処理するジェスチャ認識エンジンをインストールできます
  • View を他の View に埋め込んで、複雑なビジュアルを作成できます階層。これにより、埋め込みビュー (子ビュー) と埋め込みビュー (親ビュー) の間に親子関係が作成されます。通常の状況では、子ビューの表示領域は親ビューの境界によってクリップされませんが、iOS では、clipsToBounds プロパティを使用してこの動作を変更できます。親ビューには複数の子ビューを持つことができますが、子ビューには親ビューが 1 つだけあり、子ビューの位置を決定するのは親ビューです。

    ビューのジオメトリは、フレーム、境界、中心のプロパティによって定義されます。フレームは、親ビューの座標系を基準としたビューの原点とサイズを定義します。これは通常、ビューをレイアウトし、そのサイズまたは位置を調整するときに使用されます。 center 属性は、ビューのサイズを変更せずにビューの位置を調整できます。境界はビューの内部寸法を定義し、ほとんどの場合、描画コードをカスタマイズする場合にのみ使用されます。フレームのサイズ部分と境界長方形部分は結合されているため、一方または両方を同時に使用してビューのサイズを変更できます。

    ビューを作成する

    コードを使用してビューを作成します:

    swift:

    let viewRect = CGRect(x: 10, y: 10, width: 100, height: 100)let myView = UIView(frame: viewRect)
    ログイン後にコピー

    Objective-c

    CGRect  viewRect = CGRectMake(10, 10, 100, 100);UIView* myView = [[UIView alloc] initWithFrame:viewRect];
    ログイン後にコピー

    このコードはビューを作成し、親ビュー座標系の (10,10) 点に配置します (一度親ビューに追加されます)。サブビューを別のビューに追加するには、addSubview: メソッドを使用します。 iOS では、同じレベルのビューは問題なく相互に重なり合うことができるため、複雑なビュー レイアウトが可能になります。 addSubview は、指定されたビューをその兄弟ビューの上に配置します。 insertSubview:aboveSubview: メソッドと insertSubview:belowSubview: メソッドを使用して、サブビューの相対 Z 座標を指定できます。また、exchangeSubviewAtIndex:withSubviewAtIndex: メソッドを使用して、追加したサブビューの位置を交換することもできます。

    ペイント サイクルの表示

    必要に応じてペイントが行われるのを表示します。ビューが最初に表示されるとき、またはレイアウト変更中にビューのすべてまたは一部が表示されるとき、システムはビューにそのコンテンツを描画するように要求します。 UIKit または Core Graphics を使用してカスタム コンテンツを含むビューの場合、システムはそのdrawRect: メソッドを呼び出します。このメソッドの実装は、ビューのコンテンツを現在のグラフィックス コンテキストに描画する役割を果たし、システムは最初にこのメソッドを自動的に呼び出します。これにより、ビューのコンテンツの静的な視覚表現が作成され、画面に表示されます。

    ビューの実際のコンテンツが変更された場合、ビューを再描画する必要があることをシステムに通知する必要があります。ビューの setNeedsDisplay または setNeedsDisplayInRect: メソッドを呼び出して通知します。これらのメソッドは、次のペイント サイクルでビューを更新する必要があることをシステムに通知します。次のペイント サイクルまで待機するため、複数のビューでこれらのメソッドを呼び出して、それらを同時に更新できます。

    複数の View プロパティを変更するとアニメーション化でき、プロパティを短期間に変更することでアニメーションを作成できます。 UIView クラスはアニメーションを実行する多くの作業を行いますが、どのプロパティの変更をアニメーション化するかを決定する必要があります。以下は 2 つの異なる初期化アニメーション方法です:

    iOS4.0 以降のバージョンでは、ブロックベースのアニメーション方法を使用します (推奨)

  • begin/commit (開始/コミット) アニメーション方法を使用します。
  • ブロックベースのアニメーション メソッド (animateWithDuration:animations: など) により、アニメーションの作成が大幅に簡素化されます。メソッドを呼び出し、アニメーション パラメータを指定して、アニメーションを実行するだけです。ただし、ブロックベースのアニメーションは iOS4 以降でのみ利用できます。デバイスで古いバージョンの iOS が実行されている場合は、beginAnimations:context: および commitAnimations クラス メソッドを使用して、アニメーションの開始と終了をマークする必要があります。
  • 以下はアニメーションのプロパティです:

  • @プロパティフレーム
  • @プロパティ境界
  • @プロパティセンター
  • @プロパティ変換
  • @プロパティアルファ
  • @プロパティ背景色
  • @プロパティコンテンツストレッチ
  • スレッド化に関する考慮事項

    Oユーザー インターフェイスの操作はメイン スレッドで実行する必要があります。したがって、アプリケーションのメインスレッドで UIView クラスのメソッドを呼び出す必要があります。ビューオブジェクトの作成自体を厳密に守る必要はないが、他の操作はメインスレッドで行う必要がある場合のみ。

    サブクラス化の手順

    ユーザーの操作も必要とする表示コンテンツの場合、UIView クラスが重要なサブクラス化ポイントです。 UIView を拡張する正当な理由はたくさんありますが、UIView を継承すると、実装するコードでより多くのパフォーマンスが消費される場合にのみ、UIView を拡張することをお勧めします。あなたの方が良いです。既製のものがある場合はそれを使用してください)。

    メソッドのオーバーライド

    UIView をサブクラス化する場合、オーバーライドする必要があるメソッドはわずかで、ほとんどのメソッドは必要に応じてオーバーライドできます。 UIView は高度に構成可能なクラスであるため、親クラスのメソッドをオーバーライドせずに複雑な動作を実装する方法は数多くあります。これについては「サブクラス化の選択」セクションで説明します。 UIView サブクラスで次のリストのメソッドをオーバーライドすることを検討してください:

    初期化

  • initWithFrame オーバーライドすることをお勧めします。カスタム初期化メソッドを実装して、このメソッドを追加または置き換えることもできます
  • initWithCoder: Interface Builder nib ファイルからビューをロードし、カスタム初期化が必要な場合は、このメソッドをオーバーライドします。
  • layerClass ビューを別のコア アニメーション レイヤ フォールバックで保存する必要がある場合にのみオーバーライドします。たとえば、ビューで大きなスクロール可能な領域をタイル状に表示する必要がある場合、このメソッドをオーバーライドして CATiledLayer クラスを返すことができます (原文はあまり明確ではありません: このメソッドは、ビューで使用する場合にのみ実装してください)。たとえば、ビューでタイルを使用して大きなスクロール可能な領域を表示する場合、このメソッドをオーバーライドして CATiledLayer クラスを返すことができます。)
  • DRAWING AND PRINT

  • drawRect: ifビューがカスタム コンテンツを描画する場合は、このメソッドを実装する必要があります。実装しない場合は、このメソッドをオーバーライドしないでください。
  • drawRect:forViewPrintFormatter: 印刷時に異なるコンテンツ (表示とは異なる) を印刷する必要がある場合にのみ、このメソッドを実装する必要があります。
  • Constraints

  • requiresConstraintBasedLayout ? View クラスが正しく機能するために制約が必要な場合は、このメソッドを実装します
  • updateConstraints ビューでサブビュー間の制約を作成する必要がある場合は、このメソッドを実装する必要があります
  • alignmentRectForFrame:, FrameForAlignmentRect: ?これらを考慮してくださいメソッドは、ビューが他のビューとどのように配置されるかをカバーします
  • Layout

  • sizeThatFits: ? サイズ変更操作を実行するときにデフォルトとは異なるサイズを設定したい場合にこのメソッドを実装します。たとえば、このメソッドを使用すると、サブビューが正しく表示されなくなるまでビューが縮小するのを防ぐことができます
  • layoutSubviews ? サブビューをより正確に制御する必要がある場合は、制限や自動サイズ変更動作を使用する代わりに、次のメソッドを実装する必要があります。この方法。
  • didAddSubview:、willRemoveSubview: サブビューの追加または削除イベントを追跡します
  • willMoveToSuperview:、didMoveToSuperview ビュー階層内の現在のビューの移動を追跡します
  • willMoveToWindow:,didMoveToWindow 別のウィンドウに(移動しようとしている、または移動された)ビューを追跡します
  • イベント処理 :
  • touchesBegan:withEvent:、touchesMoved:withEvent:、touchesEnded:withEvent:、touchesCancelled:withEvent: タッチ イベントを直接処理します (ジェスチャの場合は、ジェスチャ認識機能を使用します)
  • gestureRecognizerShouldBegin: タッチを処理する必要がある場合イベントを直接実行するには、このメソッドをオーバーライドして、ジェスチャ認識機能が追加のアクションをトリガーしないようにする必要があります。
  • サブクラス化の代わりに

    多くのビュー動作はサブクラス化せずに構成できます。これらのメソッドのオーバーライドを開始するときは、必要な機能を提供するために以下のプロパティまたは動作を変更できるかどうかを検討してください。

  • addConstraint: ? 为view和它的子view定义自动布局行为.
  • autoresizingMask ? 当父view的frame改变时,提供自动布局行为。这些行为可以和约束(Constraint)合并
  • contentMode -为view内容提供布局行为,与view的frame相反。这个属性同样影响内容应用view的缩放,是缓存还是重绘。
  • contentStretch-定义view的部分可伸缩。这个行为通常用于实现按钮和其他复杂布局、可变尺寸、重绘代价高的view。
  • hidden 或 alpha 改变view的不透明度或隐藏view
  • backgroundColor ? 设置view的背景颜色
  • Subviews 不在drawRect方法里绘制你的内容,使用嵌入图片或文本子view等方式
  • Gesture recognizers ? 使用手势识别器替代自己手工处理touch事件
  • Animations ? 使用内建动画支持代替自己写动画。Core Animation提供的动画支持很快很好用
  • 基于图片的背景 ? 对那些显示相对静态内容的view来说,考虑使用UIImageView对象加上手势识别替代子类化和自己绘制图片。同样,你也可以使用一般的UIView对象,分配你的图片作为view的CALayer对象内容。
  • 动画是不需要子类化和实现复杂代码而让视觉改变的另一种方式。很多UIView的属性是可以动画的,意味着改变这些属性可以触发系统生成动画。启动动画只需要很少的一行代码指示那些改变需要被动画。更多view动画的信息,参考Animations.

    UIView动画

    UIView属性动画

    CGRect viewRect = CGRectMake(10,10,200,200);self.myView= [[UIView alloc] initWithFrame:viewRect];self.myView.backgroundColor = [UIColor whiteColor];[self.view addSubview:self.myView];//1 准备动画//参数1: 动画的作用, 任意字符串,用来区分多个动画, 参数二: 传递参数用 nil:OC中使用[UIView beginAnimations:@"changeSizeAndColor" context:nil];//在准备动画的时候可以设置动画的属性[UIView setAnimationDuration:0.7];[UIView setAnimationDelegate:self];[UIView setAnimationWillStartSelector:@selector(startAnimation)];[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//动画的曲线[UIView setAnimationRepeatCount:2];[UIView setAnimationRepeatAutoreverses:YES];//动画往返执行, 必须设置动画的重复次数//2 修改view的属性, 可以同时修改多个属性 注意:不是所有的属性都可以修改的(只有frame, center, bounds, backgroundColor, alpha, transform 可以修改)self.myView.frame = CGRectMake(110, 100, 100, 100);self.myView.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:0.5];//3 提交并执行动画[UIView commitAnimations];
    ログイン後にコピー

    Block动画

    Block动画的实质是对UIView动画的封装

    第一种

        [UIView animateWithDuration:2 animations:^{        self.myView.backgroundColor = [UIColor orangeColor];    }];
    ログイン後にコピー

    第二种

        [UIView animateWithDuration:2 animations:^{        self.myView.backgroundColor = [UIColor orangeColor];    } completion:^(BOOL finished) {        //finished判断动画是否完成        if (finished) {            NSLog(@"finished");        }    }];
    ログイン後にコピー

    第三种

        [UIView animateWithDuration:2 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{        // 设置要修改的View属性        self.myView.backgroundColor = [UIColor orangeColor];    } completion:^(BOOL finished) {        //finished判断动画是否完成        if (finished) {            NSLog(@"finished");        }    }];
    ログイン後にコピー

    下面是AnimationOptionCurve参数:

        UIViewAnimationOptionCurveEaseInOut            = 0 << 16, // default    UIViewAnimationOptionCurveEaseIn               = 1 << 16,    UIViewAnimationOptionCurveEaseOut              = 2 << 16,    UIViewAnimationOptionCurveLinear               = 3 << 16,
    ログイン後にコピー

    UIViewTransition动画

        [UIView transitionWithView:self.myView duration:2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{        self.myView.backgroundColor = [UIColor orangeColor];    } completion:^(BOOL finished) {        //finished判断动画是否完成        if (finished) {            NSLog(@"finished");        }    }];
    ログイン後にコピー

    下面是AnimationOptionTransition参数:

        UIViewAnimationOptionTransitionNone            = 0 << 20, // default    UIViewAnimationOptionTransitionFlipFromLeft    = 1 << 20,    UIViewAnimationOptionTransitionFlipFromRight   = 2 << 20,    UIViewAnimationOptionTransitionCurlUp          = 3 << 20,    UIViewAnimationOptionTransitionCurlDown        = 4 << 20,    UIViewAnimationOptionTransitionCrossDissolve   = 5 << 20,    UIViewAnimationOptionTransitionFlipFromTop     = 6 << 20,    UIViewAnimationOptionTransitionFlipFromBottom  = 7 << 20,
    ログイン後にコピー

    CoreAnimation动画

    Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .framework和引入对应的框架

    CABasicAnimation基本动画

    CABasicAnimation基本动画没有真正的修改属性值

    初始化UIView的layer

        CGRect viewRect = CGRectMake(50,100,200,200);    self.myView= [[UIView alloc] initWithFrame:viewRect];    self.myView.backgroundColor = [UIColor whiteColor];    self.myView.layer.cornerRadius = 100;//设置圆角, 参数是内切圆的半径, 若想画一个圆, 前提是view必须是正方形, 参数应该是view边长的一半    self.myView.layer.borderWidth = 5;//设置描边的宽度    self.myView.layer.borderColor = [UIColor orangeColor].CGColor;//设置描边的颜色(UIView上的颜色使用的是UIColor, CALayer上使用的颜色是CGColor)    self.myView.layer.shadowOffset = CGSizeMake(50, 100);//设置阴影的偏移量 width影响水平偏移(正右负左), height影响垂直偏移(正下负上)    self.myView.layer.shadowColor = [UIColor redColor].CGColor;//阴影的偏移的颜色    self.myView.layer.shadowOpacity = 0.5;//阴影的不透明度, 取值范围(0 ~ 1), 默认是0, 就是透明的    [self.view addSubview:self.myView];
    ログイン後にコピー

    动画方法:

        //1 创建并指定要修改的属性    //    KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];    [basic setDuration:0.7];    //2 修改属性值    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)];    basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)];    //3 添加动画    //key做区分动画用    [self.myView.layer addAnimation:basic forKey:@"changColor"];
    ログイン後にコピー

    CAKeyframeAnimation关键帧动画

    示例1,和上面的动画一样

         //1 创建动画     CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"bounds"];     [keyFrame setDuration:2];     //2 修改属性     keyFrame.values = @[[NSValue valueWithCGRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)], [NSValue valueWithCGRect:CGRectMake(0, 0, 250, 250)], [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)]];    //keyTimes:值代表了出现动画的时刻, 值得范围是0~1, 值必须是递增的, keyTimes和values是一一对应的     keyFrame.keyTimes = @[@(0.4), @(0.6), @(1)];     //3 添加动画     [self.myView.layer addAnimation:keyFrame forKey:@"keyFrame"]; 
    ログイン後にコピー

    示例2,改变颜色

        CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"backgroundColor"];    [keyFrame setDuration:3];    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];    [self.myView.layer addAnimation:keyFrame forKey:nil];
    ログイン後にコピー

    CATransaction 过度动画

        //1 创建    CATransition *transition = [CATransition animation];    [transition setDuration:2];    //2 设置过度样式    transition.type = kCATransitionReveal;//控制样式    transition.subtype = kCATransitionFromTop;//控制方向    //添加动画    [self.myView.layer addAnimation:transition forKey:nil];
    ログイン後にコピー

    CAAnimationGroup 组动画

        //1 创建并指定要修改的属性    // KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size    // CALayer    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];    [basic setDuration:2];    //2 修改属性值    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)];    basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)];    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"backgroundColor"];    [keyFrame setDuration:2];    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];    //keyTimes中的第一个值是0, 不能修改    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];    // 创建    //当group动画的时长 > 组中所有动画的最长时长, 动画的时长以组中最长的时长为准    //当group动画的时长 < 组中所有动画的最长时长, 动画的时长以group的时长为准    //最合适: group的时长 = 组中所有动画的最长时长    CAAnimationGroup *group = [CAAnimationGroup animation];    [group setDuration:10];    //设置组动画    group.animations = @[basic, keyFrame];    //添加动画    [self.myView.layer addAnimation:group forKey:nil];
    ログイン後にコピー

    CoreAnimation相关知识

    CAAnimation

    所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类.
    ログイン後にコピー

    属性解析:

    duration:动画的持续时间 .repeatCount:动画的重复次数 .repeatDuration:动画的重复时间 .removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards .fillMode:决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后 .beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,                            CACurrentMediaTime()为图层的当前时间 .timingFunction:速度控制函数,控制动画运行的节奏 .delegate:动画代理  
    ログイン後にコピー

    速度控制函数(CAMediaTimingFunction)

    1. kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉2. kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开3. kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地4. kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。        这个是默认的动画行为。
    ログイン後にコピー

    CAAnimation在分类中定义了代理方法

    @interface NSObject <CAAnimationDelegate>- (void)animationDidStart:(CAAnimation *)anim;- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;@end
    ログイン後にコピー

    fillMode属性值(要想fillMode有效,最好设置removedOnCompletion=NO)

    kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态?.

    kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态.
    ログイン後にコピー

    ?kCAFillModeBackwards 在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始. 你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态 ?

    kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状
    ログイン後にコピー

    CAPropertyAnimation

    CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation.

    属性解析:

    keyPath:

    通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@”position”为keyPath,就修改CALayer的position属性的值,以达到平移的动画效果
    ログイン後にコピー

    CABasicAnimation

    CAPropertyAnimation的子类 .
    ログイン後にコピー

    属性解析:

    fromValue:keyPath相应属性的初始值 .toValue:keyPath相应属性的结束值 .随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue .
    ログイン後にコピー

    如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。比如,CALayer的position初始值为(0,0),CABasicAnimation的fromValue为(10,10),toValue为(100,100),虽然动画执行完毕后图层保持在(100,100)这个位置,实质上图层的position还是为(0,0)

    //平移动画CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];// 动画持续1秒anim.duration =1; //因为CGPoint是结构体,所以用NSValue包装成一个OC对象anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 50)];anim.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];//通过MyAnim可以取回相应的动画对象,比如用来中途取消动画[layer addAnimation:anim forKey:@"MyAnim"];//缩放动画CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];//没有设置fromValue说明当前状态作为初始值//宽度(width)变为原来的2倍,高度(height)变为原来的1.5倍anim.toValue = [NSValuevalueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];anim.duration = 1;[layer addAnimation:anim forKey:nil];//旋转动画CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];//这里是以向量(1, 1, 0)为轴,旋转π/2弧度(90&deg;)//如果只是在手机平面上旋转,就设置向量为(0, 0, 1),即Z轴anim.toValue = [NSValuevalueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 1, 1, 0)];anim.duration = 1;[layer addAnimation:anim forKey:nil];
    ログイン後にコピー

    CAKeyframeAnimation

    CApropertyAnimation的子类,跟CABasicAnimation的区别是:

    CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值 .
    ログイン後にコピー

    属性解析:

    values:就是上述的NSArray对象。里面的元素称为”关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧 .path:可以设置一个CGPathRef\CGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略 .keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的 .CABasicAnimation可看做是最多只有2个关键帧的CAKeyframeAnimation在关键帧动画中还有一个非常重要的参数,那便是calculationMode,计算模式.其主要针对的是每一帧的内容为一个座标点的情况,也就是对anchorPoint 和 position 进行的动画.当在平面座标系中有多个离散的点的时候,可以是离散的,也可以直线相连后进行插值计算,也可以使用圆滑的曲线将他们相连后进行插值计算. calculationMode目前提供如下几种模式:kCAAnimationLinear calculationMode的默认值,表示当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算;
    ログイン後にコピー

    ?kCAAnimationDiscrete 离散的,就是不进行插值计算,所有关键帧直接逐个进行显示;

    ?kCAAnimationPaced 使得动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效;

    ?kCAAnimationCubic 对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算,这里的主要目的是使得运行的轨迹变得圆滑;

    kCAAnimationCubicPaced 看这个名字就知道和kCAAnimationCubic有一定联系,其实就是在kCAAnimationCubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的.
    ログイン後にコピー

    CAAnimationGroup

    CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行.
    ログイン後にコピー

    属性解析:

    animations:用来保存一组动画对象的NSArray.默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间.
    ログイン後にコピー

    CATransition

    CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点.

    UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果.
    ログイン後にコピー

    属性解析:

    type:动画过渡类型subtype:动画过渡方向startProgress:动画起点(在整体动画的百分比)endProgress:动画终点(在整体动画的百分比)
    ログイン後にコピー
    /* 过渡效果  fade     //交叉淡化过渡(不支持过渡方向) kCATransitionFade  push     //新视图把旧视图推出去 kCATransitionPush  moveIn   //新视图移到旧视图上面 kCATransitionMoveIn  reveal   //将旧视图移开,显示下面的新视图 kCATransitionReveal  cube     //立方体翻滚效果  oglFlip  //上下左右翻转效果  suckEffect   //收缩效果,如一块布被抽走(不支持过渡方向)  rippleEffect //滴水效果(不支持过渡方向)  pageCurl     //向上翻页效果  pageUnCurl   //向下翻页效果  cameraIrisHollowOpen  //相机镜头打开效果(不支持过渡方向)  cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向) */     /* 过渡方向  kCATransitionFromRight  kCATransitionFromLeft  kCATransitionFromBottom   kCATransitionFromTop  */// CATransition的使用 CATransition *anim = [CATransition animation];anim.type = @"cube"; // 动画过渡类型anim.subtype = kCATransitionFromTop; // 动画过渡方向anim.duration = 1; // 动画持续1s// 代理,动画执行完毕后会调用delegate的animationDidStop:finished:anim.delegate = self;
    ログイン後にコピー

    后记

    另外还有 UIImageView的帧动画 和 UIActivityIndicatorView,这里就暂不介绍了。

    参考文档
    http://www.pocketdigi.com/20150105/1413.html

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    公式アカウントのキャッシュの更新の難しさ:バージョンの更新後のユーザーエクスペリエンスに影響を与える古いキャッシュを回避する方法は? 公式アカウントのキャッシュの更新の難しさ:バージョンの更新後のユーザーエクスペリエンスに影響を与える古いキャッシュを回避する方法は? Mar 04, 2025 pm 12:32 PM

    公式アカウントのWebページはキャッシュを更新します。これはシンプルでシンプルで、ポットを飲むのに十分な複雑です。あなたは公式のアカウントの記事を更新するために一生懸命働きましたが、ユーザーはまだ古いバージョンを開くことができますか?この記事では、この背後にあるtwist余曲折と、この問題を優雅に解決する方法を見てみましょう。それを読んだ後、さまざまなキャッシュの問題に簡単に対処でき、ユーザーが常に新鮮なコンテンツを体験できるようになります。最初に基本について話しましょう。それを率直に言うと、アクセス速度を向上させるために、ブラウザまたはサーバーはいくつかの静的リソース(写真、CSS、JSなど)やページコンテンツを保存します。次回アクセスするときは、もう一度ダウンロードすることなく、キャッシュから直接検索できます。自然に高速です。しかし、このことは両刃の剣でもあります。新しいバージョンはオンラインです、

    HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

    この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

    HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

    記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

    WebページのPNG画像にストローク効果を効率的に追加する方法は? WebページのPNG画像にストローク効果を効率的に追加する方法は? Mar 04, 2025 pm 02:39 PM

    この記事では、CSSを使用したWebページへの効率的なPNG境界追加を示しています。 CSSはJavaScriptやライブラリと比較して優れたパフォーマンスを提供し、微妙または顕著な効果のために境界幅、スタイル、色を調整する方法を詳述していると主張しています

    &lt; datalist&gt;の目的は何ですか 要素? &lt; datalist&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

    この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

    HTML5&lt; time&gt;を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? HTML5&lt; time&gt;を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? Mar 12, 2025 pm 04:05 PM

    この記事では、html5&lt; time&gt;について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

    &lt; Progress&gt;の目的は何ですか 要素? &lt; Progress&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

    この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合

    &lt; meter&gt;の目的は何ですか 要素? &lt; meter&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

    この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

    See all articles