【问题标题】:How to detect a UIButton in view while dragging another button?如何在拖动另一个按钮时检测视图中的 UIButton?
【发布时间】:2013-09-27 13:30:19
【问题描述】:

我已经在 ViewController 中实现了一个可拖动的 UIButton。除了这个可拖动的按钮之外,我还有两个 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];
}

【问题讨论】:

  • 我会使用 CGRectIntersectsRect(, ) 来解决这个问题。使用 panGesture.view 和 self.oneButton 和 self.twoButton。
  • 另外这段代码没有多大意义。平移手势仅与 firstButton 相关联。最初的检查永远不会是真的,最后的检查也不会。 (即 if (panGesture.view != self.firstButton) 和 if (panGesture.view == self.oneButton))
  • 还要在drop的时候做点什么,尝试捕捉UIGestureRecognizerStateEnded状态。

标签: ios objective-c uibutton


【解决方案1】:

诀窍是使用CGRectIntersectsRect.. 这是了解一个视图是否与另一个视图相交的基本构建块。查看here 以获取使用该功能的相关示例。

这里是示例代码:

  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;
  }

【讨论】:

  • 所以基本上你想要做的是更改在重叠点上被拖动的按钮的标题对吗?
  • 其实我想用可拖动按钮的标题替换静态按钮的标题,当它被拖动时。
  • 嗯...我试过了,但我的可拖动按钮现在似乎无法拖动。
  • 这很奇怪..我从括号中取出了测试代码(请参阅我更新的代码)..尝试注释掉我的代码,看看它是否拖了..我看不出我的代码如何可以防止拖动..这是一个简单的if else语句更新标题..看看你是否改变了其他任何东西..
  • 您还需要即时更改标题吗?如果没有,您可以将其放入队列和 dispatch_async 中,例如 dispatch_async(yourCustomQueue, ^{ // 更改按钮标题.. });
【解决方案2】:
- (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添加了gestureRecognizer,为什么会有两个tapGesture,而不是使用target action呢?此外,One GestureRecognizer 可以而且只能有一个视图。将其添加到多个视图将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多