iOS之悬浮按钮(自定义拖拽、自动吸附、可约束边界)

这几天闲下来,整理下了之前项目中使用的悬浮按钮

大致需求如下:

全屏或可约束平移;

自动吸附,靠左或靠右吸附,类似iPhone手机中的辅助触控的悬浮按钮;

有的还有进度加载等等...   产品⚔️

大致示意图

整个功能的核心代码就只有70行左右。


h文件



/// 平移 手势回调

- (void)handlePan:(UIPanGestureRecognizer*)sender {

    if(sender.state == UIGestureRecognizerStateChanged){

         {

          CGPointtranslation = [sendertranslationInView:[selfsuperview]];

          CGFloatnewXOrigin =CGRectGetMinX(self.frame) + translation.x;

          CGFloatnewYOrigin =CGRectGetMinY(self.frame) + translation.y;

          CGRectcagingArea =self.cagingArea;

          CGFloatcagingAreaOriginX =CGRectGetMinX(cagingArea);

          CGFloatcagingAreaOriginY =CGRectGetMinY(cagingArea);

          CGFloatcagingAreaRightSide = cagingAreaOriginX +CGRectGetWidth(cagingArea);

          CGFloatcagingAreaBottomSide = cagingAreaOriginY +CGRectGetHeight(cagingArea);

          if(!CGRectEqualToRect(cagingArea,CGRectZero)) {

              if(newXOrigin <= cagingAreaOriginX ||

                  newXOrigin +CGRectGetWidth(self.frame) >= cagingAreaRightSide) {

                  newXOrigin =CGRectGetMinX(self.frame);

              }

              if(newYOrigin <= cagingAreaOriginY ||

                 newYOrigin +CGRectGetHeight(self.frame) >= cagingAreaBottomSide) {

                  newYOrigin =CGRectGetMinY(self.frame);

              }

          }

             self.frame=CGRectMake(newXOrigin,

                                        newYOrigin,

                                        CGRectGetWidth(self.frame),

                                        CGRectGetHeight(self.frame));

                [sendersetTranslation:(CGPoint){0,0}inView:[selfsuperview]];


         }


    }else if (sender.state == UIGestureRecognizerStateEnded){


        CGSizedragBtnSize =self.frame.size;

        CGFloatdragBtn_Y =CGRectGetMinY(self.frame);

        CGFloatdragBtn_X =0;

        CGFloat  duration =0.7;//默认时间

        //计算出按钮距离边界的差 用作动画时间的计算

        CGFloatdifference =1.0;

        switch(_remainStyle) {

            case MSDragButtonRemainStyleNone:

                return;

            case MSDragButtonRemainStyleAutomaticMargin:

            {

                if(self.center.x>=self.cagingArea.size.width/2.0) {

                   //右

                    dragBtn_X =self.cagingArea.size.width- dragBtnSize.width;

                    difference =  (self.cagingArea.size.width-CGRectGetMaxX(self.frame)) /  self.cagingArea.size.width;

                }else{

                    //左

                    dragBtn_X =0;

                    difference =  CGRectGetMidX(self.frame) /  self.cagingArea.size.width;

                }

            }

                break;

            case MSDragButtonRemainStyleAutomaticMarginLeft:

                dragBtn_X =0;

                difference =  CGRectGetMidX(self.frame) /  self.cagingArea.size.width;

                break;

            case MSDragButtonRemainStyleAutomaticMarginRight:


               dragBtn_X =self.cagingArea.size.width- dragBtnSize.width;

                difference =  (self.cagingArea.size.width-CGRectGetMaxX(self.frame)) /  self.cagingArea.size.width;

                break;

            default:

                break;

        }

        //距离越近。动画时间就越短

        duration  = duration * difference;

        [UIView animateWithDuration:duration animations:^{

            self.frame=CGRectMake(dragBtn_X, dragBtn_Y, dragBtnSize.width, dragBtnSize.height);

        }];

    }

}

demo中没有实现点击事件,和隐藏相关代码,可自行根据需求添加即可

如果能帮到你,请给个小星星

demo地址:https://github.com/marsdan/MSDragButton

你可能感兴趣的:(iOS之悬浮按钮(自定义拖拽、自动吸附、可约束边界))