美文网首页ios-UI
iOS开发 按钮拖动

iOS开发 按钮拖动

作者: 双子座的小小杂货铺 | 来源:发表于2016-11-22 17:53 被阅读1488次

    产品需求要实现这个功能,查资料才发现原来这么简单啊

    第一版:添加并实现方法

    //点击方法
    [_grabBtn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
    //拖动
    [_grabBtn addTarget:self action:@selector(dragMoving:withEvent: )forControlEvents: UIControlEventTouchDragInside];
    //拖动结束
    [_grabBtn addTarget:self action:@selector(dragEnded:withEvent: )forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
    
    //实现方法
    - (void) dragMoving: (UIControl *)c withEvent:event{
        c.center = [[[event allTouches] anyObject] locationInView:self.view];
    }
    - (void) dragEnded: (UIControl *)c withEvent:event
    {
        c.center = [[[event allTouches] anyObject] locationInView:self.view];
    }
    

    第一版基本就实现了拖动功能,然而并不仅仅是实现功能就可以了,有时候我们还要考虑代码的优化,例如按钮的位置不能超出屏幕范围,于是就有了第二版

    第二版

    //抢单按钮拖动
    - (void) dragMoving: (UIControl *)c withEvent:event
    {
        CGPoint center = [[[event allTouches] anyObject] locationInView:self.view];
        //不能超出范围
        if (center.x - c.width/ 2 >= 0 && center.x + c.width/ 2 <= kSCREEN_WIDTH && center.y -c.height / 2 >= 0 && center.y + c.height < self.view.height - 10) {
            c.center = center;
        }
        self.isDrag = YES;
    }
    

    在测试的时候我们会发现这样还有一个问题,在拖动结束后,他还会触发点击事件,然而这时候我们只想拖动,并不想让他出发点击事件,解决这个问题有两种方法

    1. 在拖动时设置个拖动状态标记变量,在按钮点击事件中检测这个变量。
    2. 将按钮嵌入到另外一个View中,这个View用来响应拖动;而按钮还是响应点击。

    第三版

    我采用的是第一种方法

    @property (nonatomic) BOOL isDrag;  //抢单按钮是否处于拖动状态
    
    //抢单按钮拖动
    - (void) dragMoving: (UIControl *)c withEvent:event
    {
        CGPoint center = [[[event allTouches] anyObject] locationInView:self.view];
        //不能超出范围
        if (center.x - c.width/ 2 >= 0 && center.x + c.width/ 2 <= kSCREEN_WIDTH && center.y -c.height / 2 >= 0 && center.y + c.height < self.view.height - 10) {
            c.center = center;
        }
        self.isDrag = YES;
    }
    - (void) dragEnded: (UIControl *)c withEvent:event
    {
        c.center = [[[event allTouches] anyObject] locationInView:self.view];
        _btnCenter = c.center; //在这里我用了一个变量存放最后的位置,当viewDidLayoutSubviews方法里使按钮保持在用户最后选定的位置
        self.isDrag = NO;
    }
    //在点击方法里做一下判断
    - (void)onGrabAction
    {
        if (self.isDrag) {
            return;
        }
        //点击方法
    }
    

    相关文章

      网友评论

        本文标题:iOS开发 按钮拖动

        本文链接:https://www.haomeiwen.com/subject/nifmpttx.html