由于项目需求,需要一个悬浮窗口,随手势移动,可以停靠在任意位置,所以自己整了一个,简单封装一下,希望能帮到有需要的朋友。
一.效果图
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,如果有问题请及时反馈,谢谢!
网友评论