Vẽ theo câu trả lời của bobnoble đây là chế độ xem trợ giúp
#import <UIKit/UIKit.h>
@interface YOIDCAutorepeatingButton : UIButton
// you COULD pinch pennies switching to nonatomic, but consider
// how much time it would take to debug if some day some moron decides without checking this spec
// to alter this prop off another thread
@property (atomic) NSTimeInterval delayUntilAutorepeatBegins;
@property NSTimeInterval delayBetweenPresses;
@property (weak) id<NSObject> recipient;
@property SEL touchActionOnRecipient;
@end
-------------> .m
#import "YOIDCAutorepeatingButton.h"
@interface YOIDCAutorepeatingButton()
{
NSTimeInterval _pressStartedAt;
}
@end
@implementation YOIDCAutorepeatingButton
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self addTarget:self action:@selector(startButtonTouch:) forControlEvents:UIControlEventTouchDown];
[self addTarget:self action:@selector(endButtonTouch:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
self.delayUntilAutorepeatBegins = .250;
self.delayBetweenPresses = .080;
}
return self;
}
-(void)killLastCharacter:(id)sender
{
[self.recipient performSelector:self.touchActionOnRecipient withObject:sender];
}
- (void)performAutorepeat:(id)sender
{
if(!self.delayBetweenPresses) {
// bail
return;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.delayBetweenPresses * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if(_pressStartedAt) {
[self killLastCharacter:sender];
[self performAutorepeat:sender];
}
});
}
- (void)startButtonTouch:(id)sender {
[self killLastCharacter:sender];
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
_pressStartedAt = now;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.delayUntilAutorepeatBegins * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if(_pressStartedAt) {
[self killLastCharacter:sender];
[self performAutorepeat:sender];
}
});
}
- (void)endButtonTouch:(id)sender {
_pressStartedAt = 0;
}
@end
sử dụng mẫu -------- -------
- (IBAction)killLastDigit:(id)sender {
.....
- (void)viewDidLoad
{
assert(self.backSpace);
[YOIDCAutorepeatingButton class]; // if xib is in a bundle other than main gottal load the class
// otherwise you'd get -[UIButton setRecipient:]: unrecognized selector sent to instance
// on setRecipient:
self.backSpace.recipient = self;
self.backSpace.touchActionOnRecipient = @selector(killLastDigit:);
Nguồn
2015-02-18 15:35:39
thể trùng lặp của [Way để thực hiện một UIButton liên tục bắn trong một tình huống bấm và giữ?] (http://stackoverflow.com/questions/9 03114/way-to-make-a-uibutton-liên tục-cháy-trong-một-bấm-và-giữ-tình hình) – rmaddy
cách này làm việc! cảm ơn bạn. Tôi đã không hoàn toàn hiểu nó khi tôi đọc nó trước khi gửi câu hỏi này - lần thứ hai là một sự quyến rũ. – dokun1