1

画面上で上にスライドするように画像ビューをアニメーション化しようとしています。位置が上に移動すると、ビューの高さも増加します。

私の iPhone 4S (5.x) では、イメージ ビューは期待どおりに動作し、ビューは高さが増加するにつれて上に移動するだけですが、iPhone 3G (4.1) では、このアニメーション中にビューが少し下に移動します。

画像ビューを使用して安価なシャドウ効果を作成するため、このようなレベルの精度が必要です。その配置は効果にとって重要です。画像はサイズ変更可能なグラフィックです。

これは、ビューの位置とサイズを変更する方法です

  CGRect oldShadow = self.shaddowView.frame;
  oldShadow.size.height = oldShadow.size.height+200;
  oldShadow.origin.y = oldShadow.origin.y - 200;
  self.shaddowView.frame =oldShadow;

これは、ビューの画像がサイズ変更可能として設定される方法です。

  UIImage* shadow = [[UIImage imageNamed:@"shadow.png"] stretchableImageWithLeftCapWidth:20 topCapHeight:20];
self.shaddowView.image = shadow;

ありがとう。

4

1 に答える 1

0

次のアニメーションを使用しました。開始位置だけでなく意図した最終位置にも境界線を付けて、ビューの望ましくないシフト (明らかな上向きの拡大以外) が発生したかどうかを確認できるようにしましたが、 iOS 4.2.1:

[UIView animateWithDuration:2.0
                 animations:^{
                     CGRect newImageFrame = imageView.frame;
                     newImageFrame.origin.y -= stretchBy;
                     newImageFrame.size.height += stretchBy;
                     imageView.frame = newImageFrame;
                 }];

私は iOS 4.1 デバイスを持っていません (私の古い 3G テスト電話は、そのデバイスでサポートされている最新の iOS バージョンである iOS 4.2.1 を実行しています)、それについて話すことはできませんが、iOS 4.2.1 では問題ありません.

ただし、フレームの変化をアニメートするときに、最終フレームが指定したとおりに正確に表示されない可能性はほとんどないことを告白しなければなりません。終了時にフレームを作成した場合NSLog、それは正しい値ではありませんか? それとも、アニメーション中に一瞬動いたが、その後正しい位置に収まったということですか? または、アニメーション中にシフトダウンし、アニメーションが完了しても間違った位置になってしまうことはありますか?

何か他のことが起こっているのだろうか (たとえば、アニメーション ビューはスクロール ビューのサブビューであり、それ自体が移動している可能性がありますか? または、アニメーションの後に誤ってフレームをさらに調整しているコードがここに示されていませんか? など)。フレームが実際に意図したものではないかどうか、または他の問題が発生しているかどうかを確認する必要があるようです。


私はもともとオプションを提案すると答えshouldRasterizeましたが、古い iPhone 3G デバイスをサポートしようとしているのであれば、それでは十分ではないかもしれません。これらの古い電話では、間違いなく少し吃音があります。とにかく、これは私の最初の答えでした:

layerシャドウ機能は CPU を少し集中的に使用するため、これを行っていると思います。shouldRasterizeしかし、オプションを使用すると、少し良くなると聞いたことがあります (ただし、話すことはできません) 。

viewThatNeedsShadow.layer.shadowColor = [UIColor blackColor].CGColor;
viewThatNeedsShadow.layer.shadowOffset = CGSizeMake(3.0, 3.0);
viewThatNeedsShadow.layer.shadowOpacity = 0.5;
viewThatNeedsShadow.layer.shouldRasterize = YES;
viewThatNeedsShadow.clipsToBounds = NO;
于 2012-10-07T15:52:57.837 に答える