如何在拖动另一个按钮时检测视图中的 UIButton


我在ViewController中实现了一个可拖动的UIButton

.除了这个可拖动的按钮之外,我还有两个UIButton,当我在它们上面拖动一个按钮并更改静态按钮的标题时,应该会检测到它们。我怎样才能做到这一点?

这就是可拖动按钮的实现方式。

@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];
}
诀窍

是使用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;
  }
- (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.
}

只在dragableButton中添加手势识别器,为什么有两个点击手势,而不是使用目标动作?此外,一个手势识别器可以而且只能有一个视图。将其添加到多个视图将不起作用。

相关内容

最新更新