美文网首页转载动画与绘图iOS Developer
FJFloatingView 可停靠任意位置悬浮窗

FJFloatingView 可停靠任意位置悬浮窗

作者: 果哥爸 | 来源:发表于2016-09-12 16:01 被阅读241次

    由于项目需求,需要一个悬浮窗口,随手势移动,可以停靠在任意位置,所以自己整了一个,简单封装一下,希望能帮到有需要的朋友。

    一.效果图

    FJFloatingView效果图.gif

    二.使用方法

    FJFloatingView *floatingView = [[FJFloatingView alloc] initWithFrame:CGRectMake(100, 100, FJ_FLOATING_VOICE_VIEW_SIZE, FJ_FLOATING_VOICE_VIEW_SIZE)];
    [self.view addSubview:floatingView];
    

    四.主要代码分析:

    滑动范围四个值:

    // 上边距(默认值:0)
    @property (nonatomic, assign) CGFloat upEdgeDistance;
    // 右边距(右边距:SCREEN_WIDTH)
    @property (nonatomic, assign) CGFloat downEdgeDistance;
    // 左边距(默认值:0)
    @property (nonatomic, assign) CGFloat leftEdgeDistance;
    // 下边距(默认值:SCREEN_HEIGHT)
    @property (nonatomic, assign) CGFloat rightEdgeDistance;
    

    这四个值主要是有利于需求的扩展,比如需求规定不能超过状态栏,只需将上边距设为20即可。

    手势滑动处理函数,限定floatingView在规定的范围滑动:

    #pragma mark --- response event
    
    -(void)pan:(UIPanGestureRecognizer *)sender {
        switch (sender.state) {
            case UIGestureRecognizerStateBegan:
            {
                _beganPoint = [sender locationInView:self.superview];
                _curPoint = self.center;
            }
                break;
            case UIGestureRecognizerStateChanged:
            {
                CGPoint point = [sender locationInView:self.superview];
            
                NSInteger x_offset = point.x - _beganPoint.x;
                NSInteger y_offset = point.y - _beganPoint.y;
                self.tmpView.center = self.center;
                self.tmpView.center = CGPointMake(_curPoint.x + x_offset, _curPoint.y + y_offset);
                // 设置 左边距
                if (CGRectGetMinX(self.tmpView.frame) < self.leftEdgeDistance){
                    x_offset -= CGRectGetMinX(self.tmpView.frame);
                }
                // 设置 右边距
                if (CGRectGetMaxX(self.tmpView.frame) > self.rightEdgeDistance) {
                    x_offset += SCREEN_WIDTH - CGRectGetMaxX(self.tmpView.frame);
                }
                // 设置 上边距
                if (CGRectGetMinY(self.tmpView.frame) < self.upEdgeDistance) {
                    y_offset -= CGRectGetMinY(self.tmpView.frame);
                }
                // 设置 下边距
                if (CGRectGetMaxY(self.tmpView.frame) > self.downEdgeDistance) {
                    y_offset += self.downEdgeDistance - CGRectGetMaxY(self.tmpView.frame);
                }
                self.center = CGPointMake(_curPoint.x + x_offset, _curPoint.y + y_offset);
            }
                break;
            
            case UIGestureRecognizerStateEnded:
                break;
            default:
                break;
        }
    }
    

    四.最后:

    送上一张喜欢的图片:

    青春.jpg

    这是gitHub链接地址,大家有兴趣可以看一下,如果觉得不错,麻烦给个喜欢或star,如果有问题请及时反馈,谢谢!

    相关文章

      网友评论

      • 半碗大米汤:Git 代码中,手势的分类扩展引用没有删掉,会报错。。
        果哥爸:谢谢啊!我自己太粗心,上传了没自己下下来运行看下!

      本文标题:FJFloatingView 可停靠任意位置悬浮窗

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