2013-10-07 8 views
13

Chcę utworzyć UIButton, który można przytrzymać, po przytrzymaniu wywołuje akcję "przytrzymaj" raz. po zwolnieniu wywołuje akcję "wstrzymano wydanie".UIButton z akcją przytrzymującą i zwalniającą

Ten kod nie działa poprawnie, ponieważ dotyk może poruszać się wewnątrz przycisku i zdarzenia nie są wywoływane w odpowiedniej kolejności

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

wydarzenia Manetka oparta jest na UIBUtton + realizacji bloku

Odpowiedz

39

spróbować

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

    } 

dla przypadku NSPratik za: u można użyć zdarzenia UIControlEventTouchUpOutside Jeśli przycisk użytkownik naciśnij długo i po pewnym czasie, a nie podnosząc palca, użytkownik przesunie jego/jej palec poza zasięgiem przycisku. po prostu dodaj jeszcze jedno wydarzenie.

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 Wersja

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

To działa na mnie.Ale jest jeden scenariusz, w którym to nie zadziała. Jeśli użytkownik długo naciska przycisk i po pewnym czasie, zamiast zwalniać palec, użytkownik wyniesie palec z granic przycisku. W takim przypadku 'holdRelease' nie zostanie wywołany ... – NSPratik

+1

@NSPratik zredagowałem kod, dla twojego przypadku sprawdź to –

+0

Dzięki Shan za twoją pomoc. Wzniesione !!! – NSPratik

6

Spróbuj tego

Dodaj przyziemienia, podciąć Wewnątrz podciąć zdarzenia, do przycisku 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 
} 
0

przeciągnij przycisk z narzędzi (robocze) i kliknij prawym przyciskiem na it.a liście pojawią znaleźć „podciąć wewnątrz”, a następnie kliknij i przeciągnij na punkcie okręgu że na początku tekstu i przenieś go do viewcontroller.h i zdefiniuj nazwę iw viewcontroller.m zrobisz to.

nslog("clicked in"); powtórz wszystkie działania na dotyk i znaleźć odpowiednie zdarzenie z listy

0

trzeba połączyć dwie następujące zdarzenia Łódź 1.touch Łódź dół, Łódź 2.touch wewnątrz niej jest IBAction Metody .To będzie zabawa Konstruktor interfejsów. Ale można to zrobić programowo również używając addTarget: Działanie: forControlEvents:

6

Mam w obliczu tego problemu sobie, a przede wszystkim używamy tych zdarzeń: -

// Zdarzenie to działa dobrze i pożary

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

// To nie ognia na wszystkich

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

Rozwiązanie: -

Zastosowanie Długie naciśnięcie Rozpoznawanie gestów: -

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

Realizacja gest: -

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

To podejście było jedynym, które działa z tych samych odpowiedzi, które znalazłem na stackoverflow (iOS 7.1., Xcode 5.1.). –

+0

Dzięki .. i świetnie to rozwiązało twój problem – 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 
} 
Powiązane problemy