2013-10-07 8 views
13

Ich möchte eine UIButton erstellen, die gedrückt gehalten werden kann, wenn sie gedrückt gehalten wird, ruft sie die Aktion "hold down" auf. Wenn es freigegeben wird, ruft die Aktion "Halte war Release" auf.UIButton mit Niederhalteaktion und Freigabeaktion

Dieser Code ist nicht richtig funktioniert, weil die Berührung innerhalb der Schaltfläche und die Ereignisse

in der richtigen Reihenfolge sind nicht ausgelöst bewegen kann
[button handleControlEvent:UIControlEventTouchDown withBlock:^{ 
     [self performMomentaryAction:PXActionTypeTouchDown]; 
    }]; 
[button handleControlEvent:UIControlEventTouchUpInside withBlock:^{ 
     [self performMomentaryAction:PXActionTypeTouchUp]; 
    }]; 

Griff Steuerungsereignisse auf UIButton + Block Implementierung basiert

Antwort

39

versuchen diese

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"); 

    } 

für NSPratik Fall: u das Ereignis verwenden können UIControlEventTouchUpOutside Wenn Benutzer lange drücken Sie die Taste und nach einiger Zeit, statt mit dem Finger der Freigabe, wird der Benutzer seine/bewegen ihr Finger außerhalb der Grenzen des Knopfes. füge einfach noch ein weiteres Event hinzu.

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 Version

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(testButton) 

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

    func holdRelease(sender:UIButton) 
    { 
     println("hold release") 
    } 
+0

Es ist für mich arbeiten.Aber es gibt ein Szenario, in dem dies nicht funktionieren wird. Wenn der Benutzer lange auf den Knopf drückt und nach einiger Zeit, anstatt den Finger loszulassen, wird der Benutzer seinen/ihren Finger aus den Grenzen des Knopfes bewegen. In diesem Fall wird 'holdRelease' nicht aufgerufen ... – NSPratik

+1

@NSPratik Ich habe den Code bearbeitet, für Ihren Fall, überprüfen Sie bitte –

+0

Danke Shan für Ihre Hilfe. Upvoted !!! – NSPratik

6

versuchen Sie, diese

Add TouchDown-, Retuschieren Innen, retuschieren Außen Ereignis ur Taste

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 
} 
0

Ziehen Sie eine Button von Werkzeugen (Bereich) und der rechten Maustaste auf it.A Liste „retuschieren innen“ und klicken Sie auf und ziehen Sie auf Kreispunkt auftreten feststellen, dass auf der Vorderseite des Textes und verschieben Sie es zu viewcontroller.h und definieren Sie einen Namen und in viewcontroller.m dies tun.

nslog("clicked in"); wiederholen alle Aktion für Touch und ein entsprechendes Ereignis aus der Liste finden

0

Sie müssen es wird IBAction Methoden .Es Spaß folgenden zwei Ereignisse 1.Touch unten, 2.Touch oben Innere verbinden in Schnittstellenerstellung. Aber man kann es programmatisch tun auch addTarget mit: Aktion: forControlEvents:

6

ich dieses Problem selbst konfrontiert, und vor allem nutzen wir diese Ereignisse: -

// Diese Veranstaltung funktioniert gut und Brände

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

// Diese nicht ausgelöst bei allen

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

Lösung: -

verwenden Long Press Gestenerkenner: -

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

Umsetzung der Geste: -

- (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]; 
} 
} 
+0

Dieser Ansatz war der einzige, der aus den gleichen Antworten funktioniert, die ich bei stackoverflow gefunden habe (iOS 7.1., Xcode 5.1.). –

+0

Danke .. und großartig, es hat Ihr Problem gelöst – Ashish

1
**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 
}