UIbutton手势拖动

35 篇文章 0 订阅

按钮实现拖动又不影响点击效果,不建议UIControlEventTouchDragInside这些事件,不容易判断,建议使用UIPanGestureRecognizer拖动手势,和点击事件不冲突

{ CGPoint beginPoint; CGFloat rightMargin; CGFloat leftMargin; CGFloat topMargin; CGFloat bottomMargin; CGMutablePathRef pathRef;}


self.askButton = [[UIButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH - 48-15, SCREEN_HEIGHT - 49 - 20 - 48, 48, 48)]; [self.askButton setImage:[UIImage imageNamed:@"wenda--listask"] forState:UIControlStateNormal]; [self.askButton addTarget:self action:@selector(askAction) forControlEvents:UIControlEventTouchUpInside]; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)]; [self.askButton addGestureRecognizer:pan]; [self.view addSubview:self.askButton]; //防止越界,控制移动范围 rightMargin = [UIScreen mainScreen].bounds.size.width-30; leftMargin = 30; bottomMargin = [UIScreen mainScreen].bounds.size.height-30-50; topMargin = 30+64; pathRef=CGPathCreateMutable(); CGPathMoveToPoint(pathRef, NULL, leftMargin, topMargin); CGPathAddLineToPoint(pathRef, NULL, rightMargin, topMargin); CGPathAddLineToPoint(pathRef, NULL, rightMargin, bottomMargin); CGPathAddLineToPoint(pathRef, NULL, leftMargin, bottomMargin); CGPathAddLineToPoint(pathRef, NULL, leftMargin, topMargin); CGPathCloseSubpath(pathRef);


#pragma mark - 手势- (void)handlePan:(UIPanGestureRecognizer *)pan{ if (pan.state == UIGestureRecognizerStateBegan) { beginPoint = [pan locationInView:self.view]; }else if (pan.state == UIGestureRecognizerStateChanged){ CGPoint nowPoint = [pan locationInView:self.view]; float offsetX = nowPoint.x - beginPoint.x; float offsetY = nowPoint.y - beginPoint.y; CGPoint centerPoint = CGPointMake(beginPoint.x + offsetX, beginPoint.y + offsetY); if (CGPathContainsPoint(pathRef, NULL, centerPoint, NO)) { _askButton.center = centerPoint; }else{ if (centerPoint.y>bottomMargin) { if (centerPoint.x<rightMargin&&centerPoint.x>leftMargin) { _askButton.center = CGPointMake(beginPoint.x + offsetX, bottomMargin); } } else if (centerPoint.y<topMargin) { if (centerPoint.x<rightMargin&&centerPoint.x>leftMargin) { _askButton.center = CGPointMake(beginPoint.x + offsetX, topMargin); } } else if (centerPoint.x>rightMargin) { _askButton.center = CGPointMake(rightMargin, beginPoint.y + offsetY); } else if (centerPoint.x<leftMargin) { _askButton.center = CGPointMake(leftMargin, beginPoint.y + offsetY); } } }else if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateFailed){ }}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值