UIButton 拖动按钮

在开发中增加一点小的用户体验,提问问题的按钮可以拖动,可是小的用户体验却让我们花费很多的时间来调节

按钮实现拖动又不影响点击效果,不建议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){
    }
}

使用拖动手势避免了很多问题

猜你喜欢

转载自blog.csdn.net/sun_cui_hua/article/details/79162177