web-dev-qa-db-ja.com

押した後に強調表示されるようにUIButtonの状態を設定する方法

ボタンを押した後、ボタンをハイライト状態に保つ必要があるという典型的な要件があります。ボタンが強調表示されている場合にのみ機能するタスクを実行する必要があります。実際には、プログラムでボタンの状態を強調表示に設定しています。

[sender setHighlighted:YES];

ボタンがハイライト状態になったら、別のアクションを実行する必要があります。

- (IBAction)changeState: (UIButton*)sender
{   
    if (sender.highlighted == YES)
    {
        [self performSomeAtion:sender];
    }
}

しかし、恐ろしいことに、いずれかのボタンを押すたびに、上記の条件がtrueになり、アクションが繰り返し実行されています。 UIButtonの状態を押した後に強調表示する方法はありますか?

[〜#〜] edit [〜#〜]-実際には、ボタンの3つの異なる状態に対して3つの異なるアクションを実行する必要があります。すでに選択状態と通常状態を利用しています。ここで、強調表示された状態を利用する必要があります。

14
A for Alpha
_[sender setSelected:YES]; 
_

または、UIButtonの2つの画像(_notselectedimage.png_および_selectedimage.png_)を使用してこの効果をシミュレートし、_BOOL buttonCurrentStatus;_などのBOOL変数を使用してボタンの状態を追跡します。次に.hファイルで:

_BOOL buttonCurrentStatus;
_

と.mファイル

_// connect this method with Touchupinside function
- (IBAction)changeState:(UIButton*)sender
{
    /* if we have multiple buttons, then we can
       differentiate them by tag value of button.*/
    // But note that you have to set the tag value before use this method.

  if([sender tag] == yourButtontag){

    if (buttonCurrentStatus == NO)
    {
        buttonCurrentStatus = YES;
        [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal];
        //[self performSomeAction:sender];
    }
    else
    {
        buttonCurrentStatus = NO;
        [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal];
        //[self performSomeAction:sender];
    }   
  }
}
_
- (void)mybutton:(id)sender
{
    UIButton *button = (UIButton *)sender;
    button.selected = ![button isSelected]; // Important line
    if (button.selected)
    {
        NSLog(@"Selected");
        NSLog(@"%i",button.tag);
    }
    else
    {
        NSLog(@"Un Selected");
        NSLog(@"%i",button.tag);

    }
 }
7

強調表示された状態は、ボタンを強調表示するために使用されますwhileタッチされています。ボタンのタッチダウンイベントは強調表示します。代わりに「選択された」状態を使用する必要があります。

ボタンを押した後にアクションを実行する場合は、メソッドを状態変更イベントにアタッチせずに、メソッドをTouchUpInsideイベントにアタッチしてください。

4
progrmr

私は方法を見つけたので、念のためそれを共有します...

UIButtonを保持し、状態ごとに1つの画像を設定しました(そのため、4つの状態のボタンに移動できます)。 UserInteractionEnabledをNOに設定します->このボタンはタッチを受けません。この最初のボタンの目的は、状態を表示することです

最初のものと同じフレームで2番目のカスタムUIButtonを作成します。この場合、状態に設定される画像はありません(完全に透明なボタンです)。このボタンの目的は、タッチイベントをキャッチすることです。そこで、TouchUpInsideイベントでこのボタンにターゲットを追加しました。そして、イベントが発生したときに、最初のボタンの状態を無効、ハイライト、選択、またはこれらのいずれの状態にも変更しません(=デフォルトの状態)。

すべてが魅力のように働いています!

3
Hal

それを説明する方法としては、UIViewをサブクラス化して独自の3つの状態のボタンを作成する方が良いでしょう。

実際には、独自のマルチステートbuttonViewを実装して、PNGの配列を介して内部の状態を管理し、外観と状態の配列を使用して、何回押されたかを知る必要があります。

2
Kheldar

使用する [sender setSelected: YES];、あなたに役立つと思います。

1
Narayana

IOS 7のみ:画像のrenderModeをUIImageRenderingModeAlwaysTemplateに設定することを検討する必要があります。その後、tintColorを使用してさまざまな状態を表すことができます。

tintColorをUIImageに適用する方法

参照 IViewとそのすべてのサブビューに色を付ける

0
John Henckel

Appleによると、UIButtonには imageView のプロパティがあります。

このプロパティは読み取り専用ですが、独自のプロパティは読み取り/書き込み可能です。これらのプロパティを使用して、ボタンのビューの外観と動作を構成します

つまり、IBで(ストーリーボード内で)このボタンの画像を設定し、強調表示された画像を設定できます。

  1. 属性インスペクタを開きます。
  2. Buttonセクションで、画像を選択します。
  3. 同じセクションで、State ConfigをHighlightedに変更します。デフォルトで選択した画像がなくなり、ハイライトの新しい画像を設定できるようになりました。
  4. これで、2つの状態設定を持つボタンができました。ランタイム中にbutton.highlighted = trueを変更するために必要なすべての操作を行うことができます。また、コントロールの属性の構成の下にある IControl をチェックして、状態を確認します。

次のようにプログラムで行うこともできます。

Swift(およびObjective-Cでもほぼ同じ):

// Setting the highlighted image
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest")
// someButton will now some the highlighted image and NOT the image set in the IB
self.someButton.imageView?.highlighted = true
0
OhadM
UIButton *btn_tmp=sender;
    if(!(btn_tmp.selected))
    {
[btn_temp setHighlighted:YES];

}
0
Narayana

解決策は難しいですが、それは可能です。

問題は、ボタンのアクションメソッドでハイライトされたステータスを変更しようとしたことです。これにより、アクションの最後にクリーンアップまたはチェックプロセスが行われ、ハイライトされたステータスが切り替わります。デバッグしようとすると、強調表示された= 1になりますが、最後に変更されます。

奇妙ですが、「3ステータスボタン」は、「選択」モードのような「ハイライト」モードにボタンを保持して、3ステータスに応じて異なるアクションを取得したい場合に便利です。これを分析したり、ボタンアクションメソッドで強調表示モードに切り替えられなかったりする唯一の問題は、ユーザーが押すとすぐに強調表示モードに切り替わり、最後に切り替えられるためです。

解決策はディスパッチを使用することです。

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [theButton setHighlighted:YES];
});

これでうまくいき、3つのステータスを使用できます。

0
BootMaker