4

新しいシングル ビュー アプリでは、次のコード:

- (void)viewDidAppear:(BOOL)animated {
    self.fooView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
    self.fooView.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:self.fooView];

    [UIView animateWithDuration:2 animations:^{
        self.fooView.backgroundColor = [UIColor blueColor];
    }];
}

黄色の背景を青色にアニメーション化します。はfooViewちょうどです:

@property (strong, nonatomic) UIView *fooView;

しかし、カスタム ビュー クラスFooViewが定義されていて、上記のコードを に置き換えて変更しUIViewFooView-drawRectの forも定義した場合FooView、アニメーションは表示されません。背景はただちに青に変更されます。

[UIView animateWithDuration: ...]orを使っても変わらなかっ[FooView animateWithDuration: ...]た -- ノーアニメーションです。

の中にある場合は-drawRect、 を呼び出します[super drawRect:rect];が、同じことです: アニメーションはありません。

に変更drawRectするdrawRect2か、メソッド全体を削除すると、アニメーションが機能します。

(そして、-drawRectたとえば、カスタム ビュー FooView で円を描画する必要がある場合はどうすればよいでしょうか?)

何故ですか?でさえそれを機能させる方法の解決策を与えることに加えて、-drawRectそれがアニメーション化されなかった原因を説明してください?

4

4 に答える 4

2

drawRect: の存在は、UIView の動作方法を変更します。drawRect: は絶対に必要な場合にのみ使用し、空の drawRect: 実装を使用しないでください。

-drawRect: メソッドがサブクラスに存在する場合、UIView はこのメソッドを呼び出す前にいくつかの処理を行う必要があります。つまり、カスタム描画が発生する潜在的に高価なバッキング ストアを割り当て、このバッキング ストアを背景色で埋める必要があります。

その後、UIView は drawRect: 実装を呼び出して、バッキング ストアを GPU に渡す前に、バッキング ストアに対してカスタム描画を行います。アニメーション ブロックが実行を開始するのは、これがすべての後であるだけです。

したがって、アニメーションの開始時に、カスタム UIView を表すバッキング ストアは既に新しい背景色でペイントされています。

UIView サブクラスに drawRect: メソッドがない場合、ビューにはバッキング ストアがありません。背景色は GPU によって直接処理され、色間の遷移を非常に効率的にアニメーション化できます。

空の UIView オブジェクト ( drawRect: 実装なし) はかなり軽量です。カスタム ビューは、達成したいアニメーション効果に応じて、複数のサブビューで構成する必要があります。

たとえば、UITableViewCell クラスは多くのサブビューで構成されています。UITableViewCell 自体は UIView です。これには、背景ビューと選択された背景ビューが含まれています。その上にコンテンツ ビューがあり、コンテンツ ビュー内にはさまざまなテキスト ラベルと画像ビューがあります。これらすべてのビューを組み合わせて、通常の UITableView に表示される選択アニメーションとサイズ変更アニメーションを生成します。

于 2012-09-17T17:21:59.047 に答える
1

アニメーション ブロックで次の行を使用する

[self.view addSubview:self.fooView];

于 2012-09-17T12:45:47.600 に答える
1

「CATransition」クラスを使用します。アニメーションを行う必要があります。この方法の使用

+(CAAnimation *)setAnimation{}

于 2012-09-17T12:32:06.913 に答える
0

これの代わりに、新しいクラスを作成し、CATransition を使用して、このクラス メソッド '+(CAAnimation *)setAnimation' を使用する必要があります。このためのオブジェクトを作成し、いつ遷移が発生するかを呼び出す必要があります。

于 2012-09-19T07:34:04.293 に答える