押し続けることができるUIButtonを作成します。押したままにすると、「押し下げる」アクションが1回呼び出されます。解放されると、「保留された解放」アクションが呼び出されます。
タッチがボタン内で移動する可能性があり、イベントが正しい順序でトリガーされないため、このコードは正しく機能していません
[button handleControlEvent:UIControlEventTouchDown withBlock:^{
[self performMomentaryAction:PXActionTypeTouchDown];
}];
[button handleControlEvent:UIControlEventTouchUpInside withBlock:^{
[self performMomentaryAction:PXActionTypeTouchUp];
}];
コントロールイベントの処理は、UIBUtton + block実装に基づいています。
これを試して
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")
}
私自身もこの問題に直面しており、ほとんどの場合、これらのイベントを使用しています:-
//このイベントは正常に動作し、発生します
[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];
}
}
これを試して
TouchDownを追加、Touch Up Inside、Touch Up Outsideイベントをurボタンに追加
-(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
}
**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
}
次の2つのイベントを接続する必要があります。1.TouchDown、2.Touch Up InsideをそのIBActionメソッドに接続します。これは、Interface Builderで楽しくなります。しかし、addTarget:action:forControlEvents:を使用してプログラムで行うこともできます。
ツール(ペイン)からボタンをドラッグして右クリックします。リストが表示され、「内部を修正」が検索され、テキストの前面にある円のポイントをクリックしてドラッグし、viewcontroller.hに移動して名前を定義し、viewcontrollerで定義します.mこれを行います。
nslog("clicked in");
タッチアウトのためにすべてのアクションを繰り返し、リストから適切なイベントを見つけます
タイマーとボタンのタッチアップを使用して、このアクションを処理できます
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から完了したプロジェクトへのアクセス: