FJFloatingView 可停靠任意位置悬浮窗

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

一.效果图

FJFloatingView 可停靠任意位置悬浮窗_第1张图片
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;
    }
}

四.最后:

送上一张喜欢的图片:

FJFloatingView 可停靠任意位置悬浮窗_第2张图片
青春.jpg

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

你可能感兴趣的:(FJFloatingView 可停靠任意位置悬浮窗)