1

アニメーションの完成時に背景画像を設定しようとすると、基本的にアニメーションが発生しなくなります。これはアニメーションのコードです:

    [UIView animateWithDuration: 0.5f animations: ^
                {
                //[buttonPanel setBackgroundImage: [UIImage imageNamed: imageName] forState: UIControlStateNormal];
                CGFloat yOrigin = buttonFrame.origin.y - (self.bounds.size.height - buttonFrame.size.height);
                yOrigin -= buttonFrame.size.height;
                buttonPanel.frame = CGRectMake(buttonFrame.origin.x, yOrigin, buttonFrame.size.width, buttonFrame.size.height);
                }
                completion: ^(BOOL finished)
                    {
                    [UIView animateWithDuration: 0.5f animations:^
                        {
[buttonPanel setBackgroundImage: [UIImage imageNamed: imageName] forState: UIControlStateNormal];
                        [self setAlpha: 1.0f];
                        }];
                    }];

setBackgroundImage:メッセージを削除すると、新しいフレーム位置に正しくアニメーション化されます。なんで?

ありがとうございました。

4

3 に答える 3

2

OK、新しい答え!あなたのコメントは私に必要な手がかりを与えてくれました。あなたが言った:

理由で最初のフレームに戻るボタンを作成します。このUIViewControllerからモーダルUIViewControllerを呼び出すなど、基本的にすべての操作でボタンが初期Fram位置に設定されます

右。モーダルコントローラーを表示してから閉じると、ビューが表示され、レイアウトが発生するためです。自動レイアウトを使用している必要があります。自動レイアウトにより、これが発生します。したがって、ここでの問題は、自動レイアウトを使用するときに、ビューの位置/サイズを(アニメーションまたはその他の時間に)変更する方法がわからないことです。

ルールは簡単です。制約によって生きる者は、制約によって死ぬ。自動レイアウトを使用している場合は、フレームを変更しないでください。制約を変更して、すべての位置/サイズの調整を行う必要があります。

素晴らしいことは、これは通常、フレームを変更するよりもはるかに簡単で簡単なことです!フレームをフェッチして変更し、フレームを割り当てる必要はありません。代わりに、通常は制約をconstant直接変更できます。

この例では、UITextViewの縮小をアニメーション化して、キーボードが画面の下から上がったときにUITextView全体が表示されるようにします(iPhone)。

[UIView animateWithDuration:duration.floatValue
                 animations:
 ^{
     self.bottomConstraint.constant = -r.size.height;
     [self.view layoutIfNeeded];
 } completion:nil];

これがコンストレイントをアニメーション化する方法です。を変更すると、アニメーションの各瞬間に新しいレイアウトを取得するためにconstant呼び出す必要もあります。layoutIfNeeded

だから、私はあなたが自動レイアウトを使わないのが間違っていると言っているのではありません。それは「オプトイン」です。必要なときに使い始めることができ、一部のペン先では使用でき、他のペン先では使用できません。しかし、これは古いレイアウト方法よりもはるかに強力であり、多くの点でコードが単純になります。それの使い方。

于 2012-11-27T01:58:07.830 に答える
1

backgroundImageはアニメーション化可能なプロパティではないのに、なぜアニメーションブロック内に設定するのですか?すべてのアニメーションの前に設定してみてください。推測ですが、試す価値があります。

編集:私はこれを試しました:

[UIView animateWithDuration:0.4 animations:^{
    CGRect r = self.otherButton.frame;
    r.origin.y += 100;
    self.otherButton.frame = r;
    [self.otherButton setBackgroundImage:[UIImage imageNamed:@"car.jpg"] 
                                forState:UIControlStateNormal];
}];

それはうまくいきました。そのため、問題を再現することはできません。あなたが私たちに話していない何かがあなたのコードで起こっていますか?言い換えれば、それを機能するより単純なケースに減らしてから、それを元に戻してみてください。そうすれば、問題が発生するポイントを見つけることができます。

于 2012-11-25T18:08:17.757 に答える
0

わかった、

このクレイジーな問題を見つけました。UIViewController、Use Autolayoutチェックがあり、すべてのアニメーションが台無しになりました。UIViewControllerが[自動レイアウトを使用]をオンにしている場合でも、おそらくUINavigationControllerを使用しておらず、セグエがモーダルであるために、すべてのコントローラーが混乱します。

これは。。。でした。

于 2012-11-26T20:33:56.670 に答える