3

だから私はたくさん検索しましたが、私の問題に対する答えが見つかりませんでした。

最初の画像はボタンが通常の状態にあるときの画像で、もう 1 つは強調表示されている状態の画像です。問題は、これらの画像をアニメーションで変更することです。たとえば、2番目の画像がフェードインすると、最初の画像がフェードアウトします。アニメーション時間が一定になるように変更します。

私が考えた唯一の方法は、カスタムボタンを作成し、いくつかのImageViewsボタンタッチダウンイベントを追加し、1つImageViewはフェードインし、もう1つはフェードアウトし、ボタンタッチアップイベントで、反対のことを行うことができました。しかし、この方法はあまり適していないようです。私が見ていないより良いオプションはありますか?

4

5 に答える 5

6
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    myButton.frame = CGRectMake(80, 50, 150, 40);
    [myButton setTitle:@"Say, Hi!" forState:UIControlStateNormal];
    [myButton setBackgroundImage:[UIImage imageNamed:@"xyz.png"] forState:UIControlStateNormal];
    [myButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:myButton];


-(IBAction)buttonClicked:(UIButton *)sender
{
    [UIView animateWithDuration:0.7f
                     animations:^
     {
         [sender setAlpha:0.5f];
     }
                     completion:^(BOOL finished)
     {
         [sender setAlpha:1.0f];
        [sender setBackgroundImage:[UIImage imageNamed:@"abc.png"] forState:UIControlStateNormal];   }
     ];
}

アニメーションの長さとそれに応じてアルファを設定できます。

于 2012-10-17T12:25:27.000 に答える
5

Ilker Baltaciが説明したのと同様に、次の方法で実行しました。UIButtonをサブクラス化し(クラスクラスターであるためお勧めしませんが)、関数を追加しました。

- (void) blinkAndFlipButtonAnimationWithText: (NSString*) buttonText {
    [UIView animateWithDuration: 0.2 delay: 0 options: UIViewAnimationOptionCurveLinear 
                     animations: ^{ 
                         self.alpha = 0.1;
                     } 
                     completion: ^(BOOL finished) {
                         [UIView animateWithDuration: 0.2 delay: 0 options: UIViewAnimationOptionCurveLinear 
                                          animations: ^{ 
                                              self.alpha = 1;
                                          } 
                                          completion: ^(BOOL finished) {
                                              [UIView transitionWithView: self duration: 0.25 options: (UIViewAnimationOptionTransitionFlipFromBottom | UIViewAnimationOptionCurveEaseInOut)
                                                              animations: ^{ 
                                                                  [self setTitle: buttonText forState: UIControlStateNormal];
                                                              } 
                                                              completion: ^(BOOL finished) { 
                                                                  if ([self.delegate respondsToSelector: @selector(primaCustomButtonDidFinishFlipAnimation:)]) {
                                                                      [self.delegate primaCustomButtonDidFinishFlipAnimation: self];
                                                                  } 
                                                              }
                                               ];
                                          }
                          ];
                     }
     ];
}

多くのブロックアニメーションカスケード、醜い私は知っています!ただし、とにかく、アニメーションブロックをニーズに合わせて調整し、デリゲートコールバックを除外することができます。

次に、ボタンを押すためのIBAction / target-actionメソッドで、次のようにメソッドを呼び出すだけです。

- (IBAction) facebookButtonPresse: (id) sender {
    [self.facebookButton blinkAndFlipButtonAnimationWithText: @"+3"];
}
于 2012-10-17T12:17:22.297 に答える
2

ボタンのフェードアウト/フェードインアニメーションが必要な場合は、カスタムボタンを、最初の uibutton と同じ背景画像を持つ UIImageview に置き換えることができます。これは、ボタンのアクションで最初にすることです。 uiview に置き換えられ、最初の背景画像から新しい (選択したバージョン) まで、フェードアウト アニメーションを UIImageview に適用できます。アニメーションが終了したら、完了ブロックで、選択した iamge を通常の背景 iamge にフェードアウトする別のアニメーションを開始します。次に、2 番目のアニメーションが終了し、uiimageview を削除して、ボタンを元に戻します。

// uiimageviews を ivar として宣言します

            UIImageView *imageViewnormal = [[UIimageView alloc] initWithImage:normalIamge];
            UIImageView *imageViewhighlighted = [[UIimageView alloc] initWithImage:highlightImage];

UIControlEventTouchDownボタンのアクションで

             // make your button invisible
             yourbutton.alpha = 0;
             //add to same rect 2 imageviews with initial and selected backgrounds of uibutton

            imageViewnormal.alpha = 1;
            imageViewhighlighted.alpha = 0;

           [self.view addSubview:imageViewhighlighted];
           [self.view addSubview:imageViewnormal];

            // newImageViewWithInitialBackground needs to be inserted secondly and alpha value 1
           // newImageViewWithSelectedBackground has alpha 0 and is behind newImageViewWithInitialBackground

        [UIView animateWithDuration:0.3
                         animations:^
         {
             imageViewnormalalpha = 0;
             imageViewhighlighted.alpha = 1;
         }
                         completion:^(BOOL finished)
         {



         }];

ボタンの UIControlEventTouchUpInside のアクション

[UIView animateWithDuration:0.3
                              animations:^
              {

             imageViewnormal.alpha = 1;
             imageViewhighlighted.alpha = 0;                  

              }
                              completion:^(BOOL finished)
              {

               //Remove both of the uiimageviews aand make your button visible
             [imageViewnormal removeFromSuperview];
             [mageViewhighlighted removeFromSuperview];
             yourbutton.alpha  = 1;     

              }];
于 2012-10-17T12:05:10.600 に答える