1

ViewController にドラッグ可能な UIButton を実装しました。このドラッグ可能なボタンとは別に、ボタンをドラッグして静的ボタンのタイトルを変更すると検出されるはずの 2 つの UIButtons もあります。これを達成するにはどうすればよいですか?

これがドラッグ可能なボタンの実装方法です。

@interface ButtonAnimationViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *firstButton; // dragable button
@property (weak, nonatomic) IBOutlet UIButton *oneButton;   //normal button
@property (weak, nonatomic) IBOutlet UIButton *twoButton;   // normal button


@implementation ButtonAnimationViewController

 - (void)viewDidLoad
{
 [super viewDidLoad];
 [self.view addSubview:self.firstButton];
 [self.view addSubview:self.oneButton];
 [self.view addSubview:self.twoButton];

UIPanGestureRecognizer *panGesture 
    = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragging:)];
[self.firstButton addGestureRecognizer:panGesture];

UITapGestureRecognizer *tapGesture 
    = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(dropping:)];
tapGesture.cancelsTouchesInView = NO;
[self.oneButton addGestureRecognizer:tapGesture];
[self.twoButton addGestureRecognizer:tapGesture];


 -(void)dragging:(UIPanGestureRecognizer*)panGesture {

  if (panGesture.view != self.firstButton)
  {
    return;
  }
   if (panGesture.state == UIGestureRecognizerStateBegan || 
       panGesture.state == UIGestureRecognizerStateChanged)
  {
    CGPoint delta = [panGesture translationInView:self.view];
    CGPoint center = self.firstButton.center;
    center.x += delta.x;
    center.y += delta.y;
    self.firstButton.center = center;
    [panGesture setTranslation:CGPointZero inView:self.view];
  }
    if (panGesture.view == self.oneButton) {
    // I tried this to change the button title.
    NSString *buttonTitle = self.firstButton.titleLabel.text; 
    self.oneButton.titleLabel.text = buttonTitle;
    return;
}
    //if (panGesture.state == UIGestureRecognizerStateEnded) {
   // self.firstButton.center = center;                        
    //[panGesture setTranslation:CGPointZero inView:self.view];
}
4

2 に答える 2

1

トリックはCGRectIntersectsRectを使用することです..これは、あるビューが別のビューと交差しているかどうかを知るための基本的な構成要素です。その関数を使用する関連する例については、こちらをご覧ください。

ここにコード例があります:

  if (panGesture.state == UIGestureRecognizerStateBegan || 
       panGesture.state == UIGestureRecognizerStateChanged)
  {
    CGPoint delta = [panGesture translationInView:self.view];
    CGPoint center = self.firstButton.center;
    center.x += delta.x;
    center.y += delta.y;
    self.firstButton.center = center;
    [panGesture setTranslation:CGPointZero inView:self.view];
  }

  // check if there is an overlap
  NSString *draggableButtonTitle = self.firstButton.titleLabel.text;
  if (CGRectIntersectsRect(self.firstButton.frame, self.oneButton.frame)) {
      self.oneButton.titleLabel.text = draggableButtonTitle;
      // i donno if you wanna return here or continue dragging.. up to you
  } else if (CGRectIntersectsRect(self.firstButton.frame, self.twoButton.frame)) {
      self.twoButton.titleLabel.text = draggableButtonTitle;
  }
于 2013-09-27T13:35:13.890 に答える
0
- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    if (gesture.state == UIGestureRecognizerStateChanged) {
        CGPoint transition = [gesture translationInView:self.view];
        self.dragableButton.center = CGPointMake(self.dragableButton.center.x + transition.x, self.dragableButton.center.y + transition.y);

        CGPoint touchPoint = [gesture locationInView:self.view];
        if (CGRectContainsPoint(self.hoverButtonA.frame, touchPoint)) {
            self.hoverButtonA.alpha = 0.2;
            //change the title here?
        }
        else {
            self.hoverButtonA.alpha = 1;
            //change the title back to the origin?
        }

        //Same for the other button
        if (CGRectContainsPoint(self.hoverButtonB.frame, touchPoint)) {
            self.hoverButtonB.alpha = 0.2;
        }
        else {
            self.hoverButtonB.alpha = 1;
        }

        [gesture setTranslation:CGPointZero inView:self.view];
    }
    //I'll leave out the end part, it pretty much just like the implementation above.
}

にgestureRecognizerを追加するだけdragableButtonで、ターゲットアクションを使用する代わりに、2つのtapGestureがあるのはなぜですか? さらに、1 つの GestureRecognizer は 1 つのビューしか持つことができません。複数のビューに追加しても機能しません。

于 2013-09-27T15:11:25.407 に答える