2

いくつかのUILabelを更新し、オフスクリーンからオンスクリーンへのオブジェクトのアニメーションを開始するために使用する一連のUIButtonがあります。進行はこのようになります。ボタン1と2が表示され、ユーザーがボタンを押すとUILabelが更新され、新しいUIImageViewが画面上でアニメーション化されます。これは最初の反復で正常に機能し、ラウンド2では、非表示になっていたボタン3と4が表示されます。ユーザーがボタン3または4のいずれかを選択すると、別のUIImageViewが画面上でアニメーション化されます(他の画像の上に...それらを「スタック」します)。何が起こっているのかというと、ユーザーがボタン1または2のいずれかを押した後にアニメーション化されたUIImageViewが消え、何もアニメーション化されません。これは、UILabelがボタンの選択に基づいて更新する必要がある場合にのみ発生します。UILabelを更新する必要がない場合、アニメーションは正常に機能します。

関連コード:

-(IBAction)didTapSizeButton:(id) sender {

if ([sender tag] == 1) {
    sizeLabel.text = @"12 oz";
}
else if ([sender tag] == 2) {
    sizeLabel.text = @"24 oz";
}

if (coasterTwo.center.x != 150) {

    [UIView animateWithDuration:0.35
                          delay:0
                        options:(UIViewAnimationOptionCurveEaseOut)
                     animations:^{
                         coasterTwo.center = CGPointMake(150, 220);

                     } completion:^(BOOL finished) {


                     }];

}

containerOne.hidden = NO;
containerTwo.hidden = NO;

}

-(IBAction)didTapContainerButton:(id)sender {

if ([sender tag] == 3) {
    containerLabel.text = @"Bottle";
}

else if ([sender tag] == 4) {
    containerLabel.text = @"Can";
}

if (coasterTwo.center.x == 150 && coasterThree.center.x != 150) {

    [UIView animateWithDuration:0.35
                          delay:0
                        options:(UIViewAnimationOptionCurveEaseOut)
                     animations:^{
                         CGPoint center = coasterThree.center;
                         center.x += 305;
                         coasterThree.center = center;

                     }
                     completion:^(BOOL finished){

                     }];

}


}

UILabelを更新するために戻ってくるとすぐに、UIImageViewsは明らかに開始位置にリセットされます...それを防ぐ方法がわかりません。

4

3 に答える 3

0

完了ブロックは必要ないため、静的UIViewcommitAnimationsメソッドを使用することをお勧めします。

[UIView beginAnimations:nil context:nil];
//Code for changing frames / alpha / anything else that is animatable
[UIView commitAnimations];

これを試してみて、役立つかどうかを確認してください。

于 2012-07-03T07:07:51.040 に答える
0

シンプルなものがあるはずです。私が言ったように、 のコードdidTapContainerButtonは疑わしいようです (ヒットするたびに、さらに305 ポイント右coasterThreeにシフトされます)。coasterTwo消えるために。(a) 一部の IB リンクが台無しになっている場合 (ボタン 3 または 4 を押したときに画像が消える原因は明らかではありませんが)。(b) 表示していないコードが隠れている可能性があります。または(c)ウィンドウにそれを隠している他のコントロールがあります(ラベルを更新すると前面に表示され、その背後にあるものが隠れる状況を確実に見ました...それは次の方法で診断できますラベルの背景を透明にするか、画像を明示的に前景に移動するか、アルファを 0.5 に設定して、デバッグ中に中身が見えるようにしてください)。

最初の可能性を診断するには、プロジェクトを DropBox などにアップロードする必要があり、それを確認することができます (それを行うのが快適な場合は...そうでない場合は、プロジェクトのコピーを作成し、削除してください)機密/専有のものをアップロードしてからアップロードしてください)。

2 番目の可能性を診断するには、View Controller の .m ファイルの完全なコードで質問を更新するだけです。

この 3 番目の可能性を診断するには、画像のアニメーションの前に前に移動することを確認します (coasterThree をアニメーション化する前に、 を実行します[self.view bringSubviewToFront:coasterThree];)。backgroundColorまた、すべてのコントロール (および、IB に追加したコンテナー UIView がある場合はそれらも) が transparent であることを確認することもできます[UIColor clearColor]。また、診断目的で一時的にアルファを減らして、それらを通して見ることができます (したがって、何か他のものをブロックしている場合 (IB でこれを行うことができます。メインの UIView 背景をクリックし、command+を押しAてすべてを選択します)。コントロールを変更し、アルファを 0.5 に変更します)。

要するに、私はオプション 3 を追求します。運が悪い場合は、プロジェクトを共有するか、包括的なコード サンプルを共有してください。もしあなたがそれをすることに不安を感じているなら、古い NIB を捨ててゼロから再構築することをお勧めします (あなたが持っている NIB に何か変なものがある場合に備えて)。 UI を再実装し、どこで問題が発生したかを確認してください。

しかし、UIImageViews のアニメーション化と UILabel テキスト値の設定に矛盾はありません。以下に、2 つのボタン、アニメーションのオンとオフを切り替える 2 つの画像、および更新されるラベルを含むコードがあり、すべて正常に動作します。(私は自信の危機に瀕していました: UILabels とアニメーションとの奇妙な相互作用があるのではないかと恐れ始めていました.) はぁ。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGPoint center;

    self.label.text = @"";

    // move image 1 (dog image) off screen to the left

    center = self.image1.center;
    center.x = -0.5 * self.view.frame.size.width;
    self.image1.center = center;
    self.image1.hidden = YES;

    // move image 2 (cat image) off screen to the right

    center = self.image2.center;
    center.x = 1.5 * self.view.frame.size.width;
    self.image2.center = center;
    self.image2.hidden = YES;

    // Do any additional setup after loading the view.
}

// if you hit button 1 (dog) button, change label, and animate the dog image on and cat image off

- (IBAction)button1:(id)sender 
{
    self.label.text = @"Dog";

    self.image1.hidden = NO;

    [UIView animateWithDuration:0.5 
                     animations:^{
                         CGPoint center;

                         // move image 1 (dog image) onscreen

                         center = self.image1.center;
                         center.x = 0.5 * self.view.frame.size.width;
                         self.image1.center = center;

                         // move image 2 (cat image) off screen to the right (if it's not there already)

                         center = self.image2.center;
                         center.x = 1.5 * self.view.frame.size.width;
                         self.image2.center = center;
                     }];
}

// if you hit button 2 (cat) button, change label, and animate the dog image off and cat image on

- (IBAction)button2:(id)sender 
{
    self.label.text = @"Cat";

    self.image2.hidden = NO;

    [UIView animateWithDuration:0.5 
                     animations:^{
                         CGPoint center;

                         // move image 1 (dog image) off screen to the left

                         center = self.image1.center;
                         center.x = -0.5 * self.view.frame.size.width;
                         self.image1.center = center;

                         // move image 2 (cat image) on screen

                         center = self.image2.center;
                         center.x = 0.5 * self.view.frame.size.width;
                         self.image2.center = center;
                     }];
}
于 2012-07-04T17:25:29.770 に答える
0

同じことが私の生徒の一人に起こりました。あなたが夢中になっていないことを証明するために... iOS 5.x シミュレーターで実行してみてください (うまくいけば、望ましい動作を観察します)。

iOS 6 の場合、UIView の状態を保持するコードを作成する必要があります。または、UIView を愛するようになっておらず、それなしでは生きていけないと考えている場合は、UIView の制約を取り除く必要があります。ファイル インスペクタで [自動レイアウトを使用] のチェックを外して xib ファイルを削除します。

お役に立てれば!

于 2013-04-08T18:03:01.690 に答える