UiTableViewCellのCabasicanimationを使用したスクロール不可解なビューはアニメーションを飛び立っています -- ios フィールド と objective-c フィールド と uitableview フィールド と cabasicanimation フィールド 関連 問題

Scroll UITableView with CABasicAnimation in uitableviewcell makes the animation jumpy












0
vote

問題

日本語

私はそのUITableViewCellsの中にある和解を持っています私はカタログシティレイヤーを持つチャートパイ層をアニメーション化しています。

これは、レイヤーをアニメーション化しながらテーブルビューをスクロールしている場合、レイヤーアニメーションはジャンピングになり、「クリーン」ではありません。

レイヤーのアニメーションは次のようになります。

<事前> <コード> tableView:willDisplayCell:forRowAtIndexPath:

DequeuereUsableCellWithIdentifierを使用する:

<事前> <コード> static NSString *cellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if(!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; ... } ... return cell;

チャートの進行状況を更新するためのスケジュールタイマー:

<事前> <コード> - (void)startAnimation { self.elapsedTimeTimer = nil; self.elapsedTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.elapsedTimeTimer forMode:NSRunLoopCommonModes]; } - (void)updateProgress { if(!self.didEndProgress) self.progress += 0.01; if(self.progress >= self.finalPercents/100) { [self.elapsedTimeTimer invalidate]; self.elapsedTimeTimer = nil; } }

レイヤの実装:

<事前> <コード> @implementation CircleGraphLayer @dynamic progress; + (BOOL)needsDisplayForKey:(NSString *)key { return [key isEqualToString:@"progress"] || [super needsDisplayForKey:key]; } - (id<CAAction>)actionForKey:(NSString *)aKey { if ([aKey isEqualToString:@"progress"]) { CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:aKey]; animation.fromValue = [self.presentationLayer valueForKey:aKey]; return animation; } return [super actionForKey:aKey]; } - (void)drawInContext:(CGContextRef)context { CGRect circleRect = CGRectInset(self.bounds, 1, 1); CGContextClearRect(context, circleRect); CGColorRef borderColor = [[UIColor colorWithWhite:1.0 alpha:0.4] CGColor]; CGColorRef backgroundColor = [[UIColor clearColor] CGColor]; //[[UIColor colorWithWhite: 1.0 alpha: 0.15] CGColor]; CGContextSetFillColorWithColor(context, backgroundColor); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetLineWidth(context, 1.0f); CGContextFillEllipseInRect(context, circleRect); CGContextStrokeEllipseInRect(context, circleRect); CGFloat radius = MIN(CGRectGetMidX(circleRect), CGRectGetMidY(circleRect)); CGPoint center = CGPointMake(radius, CGRectGetMidY(circleRect)); CGFloat startAngle = -M_PI / 2; CGFloat endAngle = self.progress * 2 * M_PI + startAngle; CGContextSetFillColorWithColor(context, borderColor); CGContextMoveToPoint(context, center.x, center.y); CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); CGContextClosePath(context); CGContextFillPath(context); [super drawInContext:context]; } @end

どんな必要に瀕している助けが高くなるでしょう。

英語

I have a UITableView that inside its UITableViewCells I'm animating a chart pie layer with CABasicAnimation.

The thing is that if I'm scrolling the table view while its animating the layer - the layer animation became jumpy and not "clean".

Animation of the layer starts in:

tableView:willDisplayCell:forRowAtIndexPath: 

Using dequeueReusableCellWithIdentifier as well:

static NSString *cellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if(!cell) {     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];     ... } ... return cell; 

Schedule timer to update progress of the chart:

- (void)startAnimation  { self.elapsedTimeTimer = nil; self.elapsedTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.02                                                              target:self                                                            selector:@selector(updateProgress)                                                            userInfo:nil                                                             repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.elapsedTimeTimer                              forMode:NSRunLoopCommonModes]; }  - (void)updateProgress {     if(!self.didEndProgress)        self.progress += 0.01;      if(self.progress >= self.finalPercents/100)     {         [self.elapsedTimeTimer invalidate];         self.elapsedTimeTimer = nil;     } } 

Layer implementation:

@implementation CircleGraphLayer @dynamic progress;  + (BOOL)needsDisplayForKey:(NSString *)key { return [key isEqualToString:@"progress"] || [super needsDisplayForKey:key]; }  - (id<CAAction>)actionForKey:(NSString *)aKey { if ([aKey isEqualToString:@"progress"]) {      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:aKey];     animation.fromValue = [self.presentationLayer valueForKey:aKey];     return animation; } return [super actionForKey:aKey]; }  - (void)drawInContext:(CGContextRef)context {  CGRect circleRect = CGRectInset(self.bounds, 1, 1); CGContextClearRect(context, circleRect);  CGColorRef borderColor = [[UIColor colorWithWhite:1.0 alpha:0.4] CGColor]; CGColorRef backgroundColor = [[UIColor clearColor] CGColor]; //[[UIColor colorWithWhite: 1.0 alpha: 0.15] CGColor];  CGContextSetFillColorWithColor(context, backgroundColor); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetLineWidth(context, 1.0f);  CGContextFillEllipseInRect(context, circleRect); CGContextStrokeEllipseInRect(context, circleRect);  CGFloat radius = MIN(CGRectGetMidX(circleRect), CGRectGetMidY(circleRect)); CGPoint center = CGPointMake(radius, CGRectGetMidY(circleRect)); CGFloat startAngle = -M_PI / 2; CGFloat endAngle = self.progress * 2 * M_PI + startAngle; CGContextSetFillColorWithColor(context, borderColor); CGContextMoveToPoint(context, center.x, center.y); CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); CGContextClosePath(context); CGContextFillPath(context); [super drawInContext:context]; } @end 

Any needful help will be appreciated.

</div
           
   
   

回答リスト

0
 
vote

私は私の評判のためにコメントを入れることができません。これは主な問題に対する答えではありませんが、コード内の小さなエラーの解決策: [NSTimer timerWithTimeInterval:...] の代わりに<コード> [NSTimer scheduledTimerWithTimeInterval:...] を使用する場合は、追加する必要はありません。 <コード> [NSRunLoop currentRunLoop] へのタイマー。 nStimerクラスリファレンス。 それが役立つことを願っています。

 

I can't put a comment because of my reputation. This is not an answer to the main problem, but a solution to a small error in the code: If you use [NSTimer scheduledTimerWithTimeInterval:...] instead of [NSTimer timerWithTimeInterval:...], you don't need to add the timer to the [NSRunLoop currentRunLoop]. See 'Scheduling Timers in Run Loops' section in the NSTimer Class Reference. Hope it helps.

</div
 
 
 
 

関連する質問

-5  iOSのさまざまなレイヤーアニメーションキーを一覧表示します  ( List various layer animations keys for ios ) 
さまざまなレイヤーアニメーションキーとは何ですか、詳細と例をお知らせください。ここで何も悪いかどうか教えてください。カバシマニミメーションで他の人を助けてください。 ...

1  描画形状を60秒にフィットさせる方法?  ( How to animate drawing shape fit in 60 second ) 
私は迅速に新しい情報については多くの情報を持っていません.iの suacepelyayer 'のパスを満た​​すことができます。 ' cabasicanimation ' 60秒で '。形状は49秒で塗りつぶし、アニメーション仕上げは60秒で適合しているので...

10  ゼロ持続時間を持つCABASICANIMATION  ( Cabasicanimation with zero duration ) 
私は CALayer が AVMutableComposition に持っていますが、 AVMutableComposition はしばらく画面上に留まり、その後消えます。問題は、アニメーションなしで消えるはずですが、<コード> CABasicAnimatio...

0  Cabasicanimation lags(iOS5)  ( Cabasicanimation lags ios5 ) 
私はiOS 6で完璧に働くいくつかの簡単なアニメーションを手に入れましたが、その遅れがあるとしばしばスクリーンを凍結し、理由なしで凍結する 私はここで間違っている可能性があることができるアイデアを持っていないので、私は本当に助けが必要です。ところで、私はそれぞ...

1  Cabasicanimation Calayer Path Animation Direction  ( Cabasicanimation calayer path animation direction ) 
env0 key pathを使用して、レイヤパスプロパティをアニメートしようとしています。正確な結果を得ていない 私が探しているパスアニメーションのどのような変更はです 予想されるアニメーション href="https://i.stack.imgu...

0  Calayer:アニメーションが終了するとコールバック?  ( Calayer callback when animation ends ) 
私は同時に複数の焼夷者をアニメーション化することにいくつかの問題に遭遇しました、そして誰かが私を正しい方向に向けることを望んでいました。 マイアプリには、算算の配列が含まれています。各層の位置は、基本的にそれらをテーブルと同様にレイアウトする (previou...

3  Uibuttonは、カバサニマトンの後に間違った位置にタッチベントを受け取ります  ( Uibutton receives touchevents at the wrong position after a cabasicanimaton ) 
ボタンを除去するボタンにアニメーションを追加したいと思います。 そして、フォローコードはそれをすることができます。奇妙なことがボタンを移動するとき、それ以上タッチを検出することはできません。 ボタンの元の場所をタップした場合は、ボタンイベントをトリガーできます...

5  WhiteColorからRedColorまでのUibuttonの背景色をアニメートします  ( Animate background color of uibutton from whitecolor to redcolor ) 
カラー(WhiteColor)から別のもの(RedColor)への色(白黒)から継続的に変更させるために、 UIButton の背景色をアニメートする種類のカラーパルス効果を作ろうとしています。 不透明度を変えるために CABasicAnimation を使用...

-1  Cabasicanimationは2倍の速さを2倍にします  ( Cabasicanimation autoreverse twice as fast ) 
自動回復でパルス円を追加するためにこのコードを使用しています: <事前> <コード> let scaleAnimation = CABasicAnimation(keyPath: "transform.scale") scaleAnimatio...

39  カバシマニメーションを使用して議員を回転させた後、レイヤーは昇降位置に戻ります  ( After rotating a calayer using cabasicanimation the layer jumps back to its unr ) 
落下する硬貨を作ろうとしています。コイン画像は、それに2つのカバシカシマンス化を備えた議員である - 落下と回転1。落下アニメーションがその終わりに着くと、そこにいただきます。たびにランダムであり、毎回異なる角度で終わられた回転アニメーションは、オリジナルの算...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有