按钮实现拖动又不影响点击效果,不建议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&¢erPoint.x>leftMargin) { _askButton.center = CGPointMake(beginPoint.x + offsetX, bottomMargin); } } else if (centerPoint.y<topMargin) { if (centerPoint.x<rightMargin&¢erPoint.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){ }}