2

他のサブレイヤーがほとんど含まれていないCALayerがあります(実際にはCATextLayer)

ユーザーがiPadで通常のジェスチャーを行うときに、そのレイヤーに変換を適用したいのですが、正しく機能していないようです。CALayerを使用する目的は、そのレイヤーにのみ変換を適用して、すべてのサブテキストレイヤーが同じ変換で同時に影響を受けるようにすることでした。

何が起こっているのかというと、変換は前の位置と現在の位置の間でちらつくように見えます。何が問題になるのかよくわかりません...たとえば、2本の指でパンするジェスチャを実行すると、CaTextLayerの位置がジェスチャ中に常にちらつき、最後にすべてが新しい変換された位置に正しく配置されます。

ですから、私を大いに悩ませているちらつきを除いて、すべてがうまく機能しているようです。

知らないプロパティを設定する必要がありますか?バウンドやフレームにも関係があるのではないかと思います。

CATextLayerを作成する方法は次のとおりです(これは作成時に1回だけ実行され、正しく機能します)。

_textString = [[NSString alloc] initWithString: text];   
_position = position;

attributedTextLayer_ = [[CATextLayer alloc] init];
attributedTextLayer_.bounds = frameSize;

//.. Set the font 

attributedTextLayer_.string = attrString;
attributedTextLayer_.wrapped = YES;

CFRange fitRange;
CGRect textDisplayRect = CGRectInset(attributedTextLayer_.bounds, 10.f, 10.f);
CGSize recommendedSize = [self suggestSizeAndFitRange:&fitRange 
                                      forAttributedString:attrString 
                                                usingSize:textDisplayRect.size];

[attributedTextLayer_ setValue:[NSValue valueWithCGSize:recommendedSize] forKeyPath:@"bounds.size"];
attributedTextLayer_.position = _position;

これが私のスーパーCALayerにそれらを追加する方法です

[_layerMgr addSublayer:t.attributedTextLayer_];

[[_drawDelegate UI_GetViewController].view.layer addSublayer:_layerMgr];

そして、これが私の変換を適用する方法です:

_layerMgr.transform = CATransform3DMakeAffineTransform(_transform);

4

1 に答える 1

6

たくさん読んでテストした後...私は自分自身の解決策を見つけました。

レイヤーで変換または操作を行う場合、CoreAnimationはデフォルトのアニメーションを使用しているようです。このようなCALayer操作を行うときは、「トランザクション」と呼ばれる操作を実行することを強くお勧めします。

これについては、CoreAnimationプログラミングガイドの「トランザクション」セクションにあります。

私の解決策は、そのようなトランザクションを実装し、CALayer操作の実行中にアニメーションを防止することでした。

これは、変換を適用するときに行うことです(ちらつきを防ぎます):

-(void)applyTransform

{{

if(!CGAffineTransformIsIdentity(_transform))

{

    [CATransaction begin];

    //This is what prevents all animation during the transaction
    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    _layerMgr.transform = CATransform3DMakeAffineTransform(_transform);

    [CATransaction commit];
} 

}

于 2011-09-30T16:16:03.733 に答える