web-dev-qa-db-ja.com

押し下げアクションと解放アクションを備えたUIButton

押し続けることができるUIButtonを作成します。押したままにすると、「押し下げる」アクションが1回呼び出されます。解放されると、「保留された解放」アクションが呼び出されます。

タッチがボタン内で移動する可能性があり、イベントが正しい順序でトリガーされないため、このコードは正しく機能していません

[button handleControlEvent:UIControlEventTouchDown withBlock:^{
        [self performMomentaryAction:PXActionTypeTouchDown];
    }];
[button handleControlEvent:UIControlEventTouchUpInside withBlock:^{
        [self performMomentaryAction:PXActionTypeTouchUp];
    }];

コントロールイベントの処理は、UIBUtton + block実装に基づいています。

18
Avner Barr

これを試して

  UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  aButton.frame = CGRectMake(xValue, yValue, 45, 45);
  [aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown];
  [aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside];


 - (void)holdDown
  {
     NSLog(@"hold Down");
  }

  - (void)holdRelease
  {
      NSLog(@"hold release");

  }

nSPratikの場合:uはイベントUIControlEventTouchUpOutsideを使用できます。ユーザーがボタンを長押ししてしばらくすると、指を離すのではなく、ユーザーが指をボタンの境界の外に移動します。イベントをもう1つ追加するだけです。

  UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  aButton.frame = CGRectMake(xValue, yValue, 45, 45);
  [aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown];
  [aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside];
  [aButton addTarget:self action:@selector(holdReleaseOutSide) forControlEvents:UIControlEventTouchUpOutside]; //add this for your case releasing the finger out side of the button's frame

 //add this method along with other methods 
  - (void)holdReleaseOutSide
  {
     NSLog(@"hold release out side");
  }

Swiftバージョン

 var  aButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
 aButton.frame = CGRectMake(xValue,yValue, 45, 45)
 aButton.setTitle("aButton", forState: UIControlState.Normal)
 aButton.backgroundColor = UIColor.greenColor()
 aButton.addTarget(self, action: Selector("holdRelease:"), forControlEvents: UIControlEvents.TouchUpInside);
 aButton.addTarget(self, action: Selector("HoldDown:"), forControlEvents: UIControlEvents.TouchDown)
 self.addSubview(aButton)

 //target functions   
 func HoldDown(sender:UIButton)
 {
    print("hold down")
 }

 func holdRelease(sender:UIButton)
 {
    print("hold release")
 }
48
Shankar BS

私自身もこの問題に直面しており、ほとんどの場合、これらのイベントを使用しています:-

//このイベントは正常に動作し、発生します

[aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown];

//これはまったく発生しません

[aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside];

ソリューション:-

長押しジェスチャー認識機能を使用する:-

 UILongPressGestureRecognizer *btn_LongPress_gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleBtnLongPressgesture:)];
[aButton addGestureRecognizer:btn_LongPress_gesture];

ジェスチャーの実装:-

- (void)handleBtnLongPressgesture:(UILongPressGestureRecognizer *)recognizer{


//as you hold the button this would fire

if (recognizer.state == UIGestureRecognizerStateBegan) {

    [self holdDown];
}

//as you release the button this would fire

if (recognizer.state == UIGestureRecognizerStateEnded) {

    [self holdRelease];
}
}
8
Ashish

これを試して

TouchDownを追加、Touch Up Inside、Touch Up Outsideイベントをurボタンに追加

enter image description here

 -(IBAction)theTouchDown:(id)sender
 {

    timer = [NSTimer scheduledTimerWithTimeInterval:0.2
                                             target:self
                                           selector:@selector(performFunctionality)
                                           userInfo:nil
  }
-(IBAction)theTouchUpInside:(id)sender
{
[timer invalidate];
timer = nil;
[self performFunctionality];

 }


 -(IBAction)theTouchUpOutside:(id)sender
 {
[timer invalidate];
timer = nil;
 }

-(void)performFunctionality
 {
 //write your logic
 }
7
Kalpesh
    **in Swift 3.0,**

btnPasswordShow.addTarget(self, action:#selector(btnShowPasswordClickHoldDown), for: .touchDown)

btnPasswordShow.addTarget(self, action:#selector(btnShowPasswordClickRelease), for: .touchUpInside)

 func btnShowPasswordClickHoldDown(){
    txtpassword.isSecureTextEntry = false
 }

 func btnShowPasswordClickRelease(){
     txtpassword.isSecureTextEntry = true
 }
1
Jaydip

次の2つのイベントを接続する必要があります。1.TouchDown、2.Touch Up InsideをそのIBActionメソッドに接続します。これは、Interface Builderで楽しくなります。しかし、addTarget:action:forControlEvents:を使用してプログラムで行うこともできます。

0
Amulya

ツール(ペイン)からボタンをドラッグして右クリックします。リストが表示され、「内部を修正」が検索され、テキストの前面にある円のポイントをクリックしてドラッグし、viewcontroller.hに移動して名前を定義し、viewcontrollerで定義します.mこれを行います。

nslog("clicked in");タッチアウトのためにすべてのアクションを繰り返し、リストから適切なイベントを見つけます

0
User99

タイマーとボタンのタッチアップを使用して、このアクションを処理できます


 var timer: Timer?

    @IBAction func dowm(_ sender: UIButton) {
        timer = Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true, block: { (time) in
            print("im hold in ")
        })
    }

    @IBAction func up(_ sender: UIButton) {
        timer!.invalidate()

    }

この2つの@IBActionは、ボタンタッチダウンタイマーが開始されて何かを印刷するとき、およびボタンがタイマーを無効にするときにハンドルタッチアップボタンとタッチダウンボタン用です。

githubから完了したプロジェクトへのアクセス:

https://github.com/sadeghgoo/RunCodeWhenUIbuttonIsHeld

0