10

UIImageViewビューにアニメーションを実行するが含まれているビューコントローラがあります。

//AnimationViewController::ViewDidLoad event:
var ctlAnimations = new UIImageView();

ctlAnimations.AnimationImages = list.ToArray();  //<--list contains the UIImages
ctlAnimations.AnimationDuration = 1.0 * list.Count;
ctlAnimations.StartAnimating();

this.Add(ctlAnimations);

これは完全に機能します。AnimationViewControllerナビゲーションスタックをプッシュすると、が表示されてアニメーション化されますUIImage

しかし今、私AnimationViewControllerはカスタムアニメーショントランジションで表示する必要があります:

var transition = CATransition.CreateAnimation ();
transition.Duration = 0.3f;
transition.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseInEaseOut);
transition.Type = CATransition.TransitionFade;
this.View.Layer.AddAnimation (transition, "fade");
//viewController is being pushed with animated=false, because we have a custom animation
base.PushViewController (viewController, false);  
this.View.Layer.RemoveAnimation("fade");

これは、指定されたカスタムアニメーションを使用して新しいビューが所定の位置に遷移するという点でも、完全に機能します。

しかし、アニメーション化されたトランジションを使用AnimationViewControllerしてスタックにプッシュすると、表示されますが、アニメーションは実行されません。代わりに、アニメーションの最初のフレーム(リストの最初の画像)が表示され、実行されません。

したがって、移行に関する何かがUIImage、新しいView Controllerでアニメーション化する機能を壊しているのですが、私はそれに対して何をすべきかを単純に理解できません。

更新:NavigationControllerの戻るボタンをタップした後、戻るボタンから離れて離すと(実際には戻らないように)、アニメーションの再生が開始されることに気付きました。

4

7 に答える 7

1

PushViewControllerは次のように機能します。現在のViewControllerの上に、次のViewControllerが配置されます。スタックにプッシュされたと言えます。Appleのドキュメントから、アニメーションありまたはなしでViewControllerをプッシュする必要があることは明らかです。

回避策:

  1. 次のビューコントローラのビューのx位置のフレームを画面の右を超えて設定します
  2. 画面の幅が320であると仮定し、次のビューのx位置を320に設定します。
  3. 次のビューをサブビューとして既存のビューに追加します。
  4. 次に、カスタムアニメーションを実行します。

別の回避策:(ただし、もう少しオーバーヘッドがあります)

  • プログラムで現在のビューのスナップショットを撮ります。
  • 次のViewControllerの初期ビューとしてスナップショットイメージを追加します。
  • 次に、アニメーションなしでViewControllerをプッシュします。(ユーザーには引き続き古いビューが表示されます)
  • 新しいViewControllerのviewDidAppearで、カスタムアニメーションを開始します。

[スナップショットを取得するこの方法では、古いデバイスでわずかな遅延が発生する可能性があることを警告する必要があります。新しいデバイスはかなり高速なので、遅れは見られません]

これらのソリューションのいずれかを実装している場合に問題があればお知らせください。

于 2013-02-25T11:57:31.240 に答える
0

ここでも犯人が何なのかとても気になります。アニメーションが正しく表示されない場合があるのはなぜですか?

私の理論では、アニメーションコードをviewDidAppearではなくviewWillAppearに配置しました。WILLまたはSHOULDメソッドに配置すると、アニメーションコードが正しく実行されません。

問題の原因を投稿していただけますか?

于 2013-02-27T17:57:16.023 に答える
0

ViewDidLoad ではなく ViewDidAppear にアニメーション ビットを配置してみてください。また、ViewDidLoad と ViewDidAppear から始めて、ブレークポイントと NSLog を使用して、アニメーションの後に何が起こるかを追跡してみてください。アニメーションを永遠に繰り返すようにしてみてください。これまでにアニメーション化されたかどうかを確認できます。

于 2013-02-23T22:12:14.930 に答える
0

UIImageさて、ここで何が問題なのかはわかりませんでしたが、一部の電話でコードがクラッシュするなど、 ある種のメモリリークがあったことも判明しました.

そこで、アニメーションを手動で行うように書き直しました。タイマーを設定してフレーム インデックス変数を保持し、タイマーが鳴るたびに自分で画像を変更します。これは同じことになり、この問題を解決することがわかりました。

于 2013-05-20T17:49:53.523 に答える
0

疑惑その1

ViewDidLoad にあるため、コードが呼び出されていないことは間違いありません。カスタマイズされたビュー スタックを作成していると思います。つまり、Cocoa のChildViewControllerメソッドを使用する必要があります。

私は MonoTouch に慣れていない (純粋な CocoaTouch しか書いていない) ので、これは 100% 正しいとは限りません。

私はあなたのviewDidLoadとviewDidAppearメソッドを慰め、それらが呼び出されていることを絶対に確認します。viewDidLoad がそうではないというのは私の疑いです。これにより、UIImageView で viewDidLoad が呼び出されなくなります。

あなたのコードでは、おそらく(objective-cから)と同等のものを必要とします:

[self addChildViewController:viewController];
// OR?
[base addChildViewController:viewController];

これは、「親」viewController に子が可視化されたことを伝えるため、必要に応じて viewDidLoad/Appear および Unload/Disappear メソッドを呼び出します。これは MonoTouch には存在しないか、Push メソッドが完全に実装されていない可能性があるため、viewDidLoad メソッドを手動で呼び出すなどのハック (悪い) 操作が必要になる場合があります。

疑惑その2

また、「リスト」変数 (画像を保持する変数) が nil である可能性もあります。その場合、アニメーションは実行されません。または、アニメーションの長さと関係があるかもしれません。永遠に繰り返されるように設定してみてください。どういうわけかREAL FASTが実行されていないことを確認してください。

哲学的な熟考を始める
か、実際の Cocoa 開発の学習を開始するかのどちらかです :) 炎上を意味するものではありませんが、間違いなく真剣に、翻訳レイヤー (ベースを書くことを回避するためのカスタム言語ブリッジ) を介してアプリケーションを開発しようとすると、問題に遭遇するでしょう。フレームワーク/アプリケーション/プラットフォームの言語)。

Titanium/MonoTouch/PhoneGap は、実際の Objective-C ほど堅牢で高品質なアプリケーションを作成することは決してありません。それに加えて、Cocoa を学ぶと、他のすべての書き方が変わるので、元に戻したいとは思わないでしょう。同名の素晴らしいウェブサイトが言うように、「ココアは私のガールフレンドです」

于 2013-02-27T20:52:25.107 に答える