整数に 1 を足したくないとしましょう。これは、 a を押し下げてから、UIButton
別の で指を離したときにのみ実行されUIButton
ます。ドラッグコンボ。IBAction
コンボを発生させる最も簡単な方法は何ですか? これは、タッチ座標で行うことも、単にUIButtons
andで行うこともできますIBActions
。
5 に答える
タッチダウンしたいボタンを「タッチダウン」「タッチアップインサイド」「タッチアップアウトサイド」ボタンとして実装してみてください。
UIButtons は多くの異なるタイプのイベントに応答できます Touch Cancel Touch Down Touch Down Repeat Touch Drag Enter Touch Drag Exit Touch Drag Inside Touch Drag Outside Touch Up Inside Touch Up Outside
これらのボタンごとに異なるアクション コードを実装して、必要なものを最適に制御できます。単純なケースでは、上記の 2 つだけを使用します。
このコードはテスト済みであり、機能します
ViewController ヘッダー ファイル (ここに私のもの) で:
@interface ViewController : UIViewController{
IBOutlet UIButton * upButton; // count up when finger released button
IBOutlet UIButton * downButton;
IBOutlet UILable * score;
BOOL isButtonDown;
unsigned int youCounter;
}
-(IBAction)downButtonDown:(id)sender;
-(IBAction)downButtonUpInside:(id)sender;
-(IBAction)downButtonDragOutside:(id)sender event:(UIEvent *)event;
-(IBAction)downButtonUpOutside:(id)sender event:(UIEvent *)event;
@end
.xib で、下ボタン (元の指で押したボタンにしたいボタン) を上記の適切なアクションに接続します。
ViewController.m ファイルで
-(void)viewDidLoad{
[super viewDidLoad];
isButtonDown = NO;
youCounter = 0;
}
-(IBAction)downButtonDown:(id)sender{
isButtonDown = YES;
}
-(IBAction)downButtonUpInside:(id)sender{
isButtonDown = NO;
}
-(IBAction)downButtonDragOutside:(id)sender event:(UIEvent *)event{
NSArray theTouches = [[event allTouches] allObjects];
[downButton setHighlighted:YES];
if(YES == [upButton pointInside:[[theTouches objectAtIndex:0] locationInView:upButton] withEvent:event]){
[upButton setHighlighted:YES];
}else{
[upButton setHighlighted:NO];
}
}
-(IBAction)downButtonUpOutside:(id)sender event:(UIEvent *)event{
if(YES == [upButton pointInside:[[theTouches objectAtIndex:0] locationInView:upButton] withEvent:event]){
youCounter++;
score.text = [NSString stringWithFormat:@"Score = %d", youCounter];
}
[downButton setHighlighted:NO];
[upButton setHighlighted:NO];
}
//Initalize a BOOL variable to know if you started the touch in the right place.
BOOL correctStart = NO;
//Get the location of the first touch, if its in the first button make correctStart = YES.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSSet *allTouches = [event allTouches];
for (UITouch *touch in allTouches) {
if ([touch locationInView:button1.view]) {
correctStart = YES;
}
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSSet *allTouches = [event allTouches];
for (UITouch *touch in allTouches) {
if (([touch locationInView:button2.view]) && (correctStart == YES)) {
anInteger++;
}
}
correctStart = NO;
}
私は自分の Mac を使用していないため、このコードを試していないため、結果は異なる場合がありますが、これで正しい方向に進むはずです。
// ボタンを作成し、ターゲットを追加します
UIButton *cloudButton = [UIButton buttonWithType:UIButtonTypeCustom];
[cloudButton setImage:[UIImage imageNamed:@"notification_add.png"] forState:UIControlStateNormal];
[cloudButton setFrame:CGRectMake(0, 0, 30, 30)];
[cloudButton addTarget:self action:@selector(dragBegan:withEvent: )
forControlEvents: UIControlEventTouchDown];
[cloudButton addTarget:self action:@selector(dragMoving:withEvent: )
forControlEvents: UIControlEventTouchDragInside | UIControlEventTouchDragOutside];
[cloudButton addTarget:self action:@selector(dragEnded:withEvent: )
forControlEvents: UIControlEventTouchUpInside |
UIControlEventTouchUpOutside];
[self.view addSubview:cloudButton];
//イベントメソッド
- (void) dragBegan: (UIControl *) c withEvent:ev
{
NSLog(@"dragBegan......");
}
- (void) dragMoving: (UIControl *) c withEvent:ev
{
NSLog(@"dragMoving..............");
}
- (void) dragEnded: (UIControl *) c withEvent:ev
{
NSLog(@"dragEnded..............");
}
もう 1 つの方法は、UITapGestureRecognizer
andを使用UIPanGestureRecognizer
してボタンの位置を追跡することです。こちらの方が読みやすいと思いました。(これ以上の動作は必要なかったので、実際には UILabels を使用することになりましたUIButton
。)