7

centerへの外部変更は、s init の後は無視されることboundsを知っています。transformUIDynamicItem

transformしかし、システム内のUIViewそれを手動で変更する必要がありUIDynamicAnimatorます。

を変えるたびtransformに一気に被ります。

それで、何か考えはありますか?ありがとう。

4

3 に答える 3

16

[dynamicAnimator updateItemUsingCurrentState:item]アニメーション化されたプロパティの 1 つを変更するときはいつでも、動的アニメーターにそれを行ったことを知らせるために呼び出す必要があります。現在の状態に一致するように内部表現を更新します。


編集:以下のコードから、スケールを変更しようとしていることがわかります。UIDynamicAnimator回転と位置のみをサポートし、スケール (または他のタイプのアフィン変換) はサポートしません。残念ながらtransform、ローテーションのみを実装するために引き継がれます。私はこれをバグと考えていUIDynamicAnimatorます (ただし、UIKit ダイナミクスの実装の多くは「バグ」に分類されます)。

できることは、( を呼び出す前にupdateItem...) 境界を変更し、自分自身を再描画することです。アフィン変換のパフォーマンスが必要な場合は、いくつかのオプションがあります。

  • 実際の描画ロジックをCALayerまたは サブビューに移動し、そのスケールを変更します (bounds衝突動作を引き続き機能させる必要がある場合は、一致するように更新します)。
  • ビューを動作にアタッチする代わりに、変換の変更をユーザーに渡すプロキシ オブジェクトをアタッチします ( に実装<UIDyanamicItem>するだけです)。NSObjectその後、要求された変換を独自の変換と組み合わせることができます。
于 2013-12-17T13:15:00.513 に答える
10

UIDynamicBehavior の .action プロパティを使用して、アニメーションのすべてのティックで目的の変換を設定することもできます。

UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center];
attachment.damping = 0.8f;
attachment.frequency = 0.8f;
attachment.action = ^{
    CGAffineTransform currentTransform = item.transform;
    item.transform = CGAffineTransformScale(currentTransform, 1.2, 1.2)
};

アクション ブロック内にロジックを追加して、いつスケールを変更する必要があるかを決定する必要があります。そうしないと、ビューは常に 120% になります。

于 2013-12-20T20:08:10.130 に答える