(IOS Dev の初心者) これは私のメイン画面です。この画面は .ccbi ファイルで、ボタンはコードでリンクしてメソッドを実装した画像です。私がやっていることは、プラスボタンの値をクリックすると、マイナスボタンの場合と同じように増加します。しかし、ボタンをクリックして値を増減するたびに。ボタンを押すと、ボタンを離すまで値が増加し続ける必要があります。これどうやってするの?CCLayer TouchBegin(); を使用して実行できることをどこかで読みました。しかし、メカニズムを理解するのに役立つ資料は見つかりませんでした。助言がありますか?
4 に答える
タイマーと 2 つの IBAction を使用して簡単に実行できます。
Timer と 2 つの IBAction を次のように宣言します。
@property (nonatomic) NSTimer *timer;
- (IBAction)inc:(id)sender;
- (IBAction)stop:(id)sender;
そして、次のようなメソッドを実装します。
- (IBAction)increment:(id)sender
{
_timer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(inc) userInfo:nil repeats:YES];
}
- (IBAction)stop:(id)sender
{
[_timer invalidate];
}
- (void)inc
{
//Increment and set the text value here
}
最も大切なもの:
関数をあなたのイベントに接続し、関数increment:
をイベントに接続しますtouch down
UIButton
stop:
touch up inside
通常の「タッチアップインサイド」の代わりに「タッチダウン」でトリガーされるメソッドを持つことができます。そのメソッドは、任意のレートでラベルを更新するタイマーを開始します。これを止めるには、タッチアップの別の方法があります。
編集後:
ボタンではなく画像がある場合は、ジェスチャ認識エンジンを使用してこれを行う必要があります。UITapGestureRecognizer のサブクラスを作成し、ビュー コントローラー クラスによって処理されるデリゲート メソッドをそれぞれ呼び出す touchesBegan と touchesEnded をオーバーライドしました。
RDTapper.h
@protocol TapperTapped <NSObject>
-(void)touchedDownOnTapper;
-(void)touchedUpOnTapper;
@end
@interface RDTapper : UITapGestureRecognizer
@property (weak,nonatomic) id <TapperTapped> delegate;
RDTapper.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate touchedDownOnTapper];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate touchedUpOnTapper];
}
ViewController.m
@interface ViewController ()
@property (weak,nonatomic) IBOutlet UILabel *label;
@property (strong,nonatomic) NSTimer *aTimer;
@property (strong,nonatomic) NSDate *startTime;
@property (weak,nonatomic) IBOutlet RDTapper *tapper;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.tapper.delegate = self;
}
-(void)touchedDownOnTapper {
self.startTime = [NSDate date];
[self performSelector:@selector(startIncrement) withObject:nil afterDelay:.3];
}
-(void)startIncrement {
self.aTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(incr) userInfo:nil repeats:YES];
}
-(void)touchedUpOnTapper {
if ([[NSDate date] timeIntervalSinceDate:self.startTime] < .3)
self.label.text = [NSString stringWithFormat:@"%d", self.label.text.integerValue +1];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self.aTimer invalidate];
}
-(void)incr{
self.label.text = [NSString stringWithFormat:@"%d", self.label.text.integerValue +1];
}
したがって、これは通常の touchDown/touchUp シーケンスで 1 ずつ増加しますが、指を押したままにすると、わずかな遅延の後、連続して増加します。
押し下げて継続的に増加させることについては、よくわかりませんが、テキストラベルを増やすには、テキスト属性を編集するだけです。
-(IBAction) increase {
textLabel.text = [NSString stringWithFormat:@"%d", number];
}
UIControlEventTouchDownとUIControlEventAllTouchEventsを試してみましたか? UIButton の状態を制御すると、やりたいことを達成するのに役立ちます。
この列挙型をチェックしてください
typedef NS_OPTIONS(NSUInteger, UIControlEvents) {
UIControlEventTouchDown = 1 << 0, // on all touch downs
UIControlEventTouchDownRepeat = 1 << 1, // on multiple touchdowns (tap count > 1)
UIControlEventTouchDragInside = 1 << 2,
UIControlEventTouchDragOutside = 1 << 3,
UIControlEventTouchDragEnter = 1 << 4,
UIControlEventTouchDragExit = 1 << 5,
UIControlEventTouchUpInside = 1 << 6,
UIControlEventTouchUpOutside = 1 << 7,
UIControlEventTouchCancel = 1 << 8,
UIControlEventValueChanged = 1 << 12, // sliders, etc.
UIControlEventEditingDidBegin = 1 << 16, // UITextField
UIControlEventEditingChanged = 1 << 17,
UIControlEventEditingDidEnd = 1 << 18,
UIControlEventEditingDidEndOnExit = 1 << 19, // 'return key' ending editing
UIControlEventAllTouchEvents = 0x00000FFF, // for touch events
UIControlEventAllEditingEvents = 0x000F0000, // for UITextField
UIControlEventApplicationReserved = 0x0F000000, // range available for application use
UIControlEventSystemReserved = 0xF0000000, // range reserved for internal framework use
UIControlEventAllEvents = 0xFFFFFFFF
};