2013-10-07 20 views
13

Beklemeye alınabilecek bir UIButton oluşturmak istiyorum, basılı tutulduğunda "hold down" eylemini bir kez çağırır. serbest bırakıldığında, "beklemede bırakma" eylemini çağırır.UIButton basılı tutma ve serbest bırakma hareketiyle

dokunmatik düğmenin içinde hareket edebilir ve olaylar

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

kolu kontrolü olaylar UIButton + engelleme uygulamasına dayanmaktadır doğru sırayla tetiklenir değil çünkü düzgün çalışmıyor bu kod

cevap

39

bu

NSPratik davası için
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"); 

    } 

deneyin: yerine parmak bırakmadan kullanıcı uzun basma düğmesi ve bir süre sonra, kullanıcı onun/hareket edecek olursa u olay UIControlEventTouchUpOutside kullanabilirsiniz parmağını düğmenin sınırları dışına. Bir etkinlik daha ekle.

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 Versiyon

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

Benim için çalışıyor.Ancak, bunun işe yaramayacağı bir senaryo var. Kullanıcı uzun bir süre basılı tutulduğunda ve bir süre sonra, parmağı serbest bırakmak yerine, kullanıcı parmağını düğmenin sınırları dışına çıkarır. Bu durumda 'holdRelease' aranmayacak ... – NSPratik

+1

@NSPratik i kodu düzenledim, durumunuz için –

+0

Yardımınız için teşekkürler Shan. Desteklenen – NSPratik

6

Bu

Ekleme Touchdown deneyin, Rötuş İçeride ur düğmeye Dış olayı Yukarı dokunun

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

araçları (bölme) ve it.A listesinde sağ tıklayarak gelen bir düğme bulmak daire noktası üzerinde "iç rötuş" ve tıkla ve sürükle durumunda mümkündür sürükleme o metnin önüne getirin ve viewcontroller.h dosyasına taşıyın ve bir isim tanımlayın ve viewcontroller.m içinde bunu yapın.

nslog("clicked in"); tekrar tüm dışarı dokunuş için eylem ve Sen IBAction Yöntemleri It içinde eğlenceli olacak oluyor buna iki etkinlik 1.Touch Aşağı, 2.Touch Yukarı İçinde aşağıdaki bağlamanız gerekir

0

listeden uygun bir olay bulmak Arayüz Oluşturucu. eylem: forControlEvents: Ama aynı zamanda addTarget kullanarak programlı bunu yapabilir bu sorunu kendim karşılaştığı

6

ve çoğunlukla biz bu olayları kullanın: -

// Bu olay çalışıyor ve yangınlar

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

// Bu, tüm

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

Çözüm ateş değildir: -

Kullanım Uzun Basın Hareket algılayıcı: - jest

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

Uygulama: -

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

Bu yaklaşım, stackoverflow üzerinde bulduğum tüm cevaplardan (iOS 7.1., Xcode 5.1.) Çalışan tek sorundu. –

+0

Teşekkürler .. ve büyük sorununuzu çözdü – 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 
} 
İlgili konular