iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch (可以替换为视频悬浮窗口)

news/2024/11/18 1:26:17/

前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置、第二切换页面后无法使用、第三运行时偶尔会崩溃。然后自己就去度娘、论坛中都查了一些资料,然后结合起来写了这么一个demo。
思路:实现全局 需要在 AppDelegate.m 文件中 didFinishLaunchingWithOptions 方法里面实现
1、新建一个 继承于 UIWindow 的类 AssistiveTouch

//在 AssistiveTouch.h 文件中代码

#import <UIKit/UIKit.h>

@interface AssistiveView : UIWindow

{

    UIButton *_button;

}


-(id) initWithFrame:(CGRect)frame;


@end


//在 AssistiveTouch.m 文件中代码

#import "AssistiveView.h"


@implementation AssistiveView


/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

    // Drawing code

}

*/

-(id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    

    if (self) {

        self.backgroundColor = [UIColor clearColor];

        self.windowLevel = UIWindowLevelAlert + 1;

        //这句话很重要

        [self makeKeyAndVisible];

        

        _button = [UIButton buttonWithType:UIButtonTypeCustom];

        _button.backgroundColor = [UIColor grayColor];

        _button.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);

        _button.layer.cornerRadius = frame.size.width/2;

        [_button addTarget:self action:@selector(choose) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:_button];

        

        //放一个拖动手势,用来改变控件的位置

        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(changePostion:)];

        [_button addGestureRecognizer:pan];

    }

    return self;

}


//按钮事件

-(void)choose

{

    NSLog(@"悬浮窗");

}

//手势事件 -- 改变位置

-(void)changePostion:(UIPanGestureRecognizer *)pan

{

    CGPoint point = [pan translationInView:self];

    

    CGFloat width = [UIScreen mainScreen].bounds.size.width;

    CGFloat height = [UIScreen mainScreen].bounds.size.height;

    

    CGRect originalFrame = self.frame;

    if (originalFrame.origin.x >= 0 && originalFrame.origin.x+originalFrame.size.width <= width) {

        originalFrame.origin.x += point.x;

    }

    if (originalFrame.origin.y >= 0 && originalFrame.origin.y+originalFrame.size.height <= height) {

        originalFrame.origin.y += point.y;

    }

    self.frame = originalFrame;

    [pan setTranslation:CGPointZero inView:self];

    

    if (pan.state == UIGestureRecognizerStateBegan) {

        _button.enabled = NO;

    }else if (pan.state == UIGestureRecognizerStateChanged){

        

    } else {

        

        CGRect frame = self.frame;

        //记录是否越界

        BOOL isOver = NO;

        

        if (frame.origin.x < 0) {

            frame.origin.x = 0;

            isOver = YES;

        } else if (frame.origin.x+frame.size.width > width) {

            frame.origin.x = width - frame.size.width;

            isOver = YES;

        }

        

        if (frame.origin.y < 0) {

            frame.origin.y = 0;

            isOver = YES;

        } else if (frame.origin.y+frame.size.height > height) {

            frame.origin.y = height - frame.size.height;

            isOver = YES;

        }

        if (isOver) {

            [UIView animateWithDuration:0.3 animations:^{

                self.frame = frame;

            }];

        }

        _button.enabled = YES;

    }

}


//在 AppDelegate中的代码

#import "AppDelegate.h"

#import "AssistiveView.h"


@interface AppDelegate ()

{

    //悬浮框

    AssistiveView * _Win;

}


@end


@implementation AppDelegate


// 设置自定义悬浮框坐标

-(void)setNew

{

    _Win = [[AssistiveView alloc] initWithFrame:CGRectMake(0, 100, 60, 60)];

}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    

    // 这句话很重要,要先将rootview加载完成之后在显示悬浮框,如没有这句话,将可能造成程序崩溃

    [self performSelector:@selector(setNew) withObject:nil afterDelay:3];

    

    [self.window makeKeyAndVisible];


    

    return YES;

}








http://www.ppmy.cn/news/774572.html

相关文章

悬浮窗管理

/*** 创建者 :赵鹏 时间:2018/10/16*/ public class FloatRoomViewManager {private static WindowManager.LayoutParams mLayoutParams;private static WindowManager mWindowManager;private static FloatRoomView mFloatView;public static Context mContext;public sta…

Android 悬浮窗、悬浮球开发

1、权限管理 直接看我另外一篇博客吧&#xff0c;传送门&#xff1a; https://my.oschina.net/u/1462828/blog/1933162 2、Base类BaseSuspend import android.content.Context; import android.graphics.PixelFormat; import android.os.Build; import android.view.Gravity…

Android 悬浮窗的使用(1)

悬浮窗功能基本代码&#xff1a; //创建悬浮窗的图片&#xff0c;这里当然也可以用自定义的View&#xff0c;这里之用了简单的图片var imageView ImageView(this)imageView.setImageResource(R.mipmap.ic_launcher)var layoutParams WindowManager.LayoutParams()var windowM…

悬浮窗

VC对话框隐藏运行 (四)悬浮窗 Windows的菜单一层一层的&#xff0c;有时操作起来不方便&#xff0c;就想自己写个工具直接调用。对迅雷的悬浮窗垂涎好久了&#xff0c;哈&#xff0c;正好趁这个机会搞一搞。在悬浮窗上用快捷菜单不是很方便吗&#xff1f; 在VC知识库中找到了…

在APP内实现顶层窗口,悬浮窗功能。

在做一个电台类的app时&#xff0c;需要一个按钮始终显示在最前端&#xff0c;查找了一些博客&#xff0c;都不尽如人意&#xff0c;选择了其中写的比较好的一篇进行了修改&#xff0c;最终满足了需求。 此方法使用的是系统弹窗&#xff0c;由于我这个项目的特殊性&#xff0c…

Android 悬浮窗

悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。 本文给出一个简单的悬浮窗实现。可缩小activity和还原大小。可悬浮在其他activity上。使用TouchListener监听触摸事件,拖动悬浮窗。 本文链接 缩放方法 缩放activit…

ios居然自带悬浮窗调试工具

我们经常使用各种调试工具&#xff0c;或者开源库来支持悬浮窗调试信息&#xff0c;但苹果的私有方法就提供了UIDebuggingInformationOverlay。 系统要求: ios10&#xff0c;iOS11 目前在我自己的手机上测试是行不通的。如果英语不错的可以去看这篇&#xff0c;看完记得通知我…

Android桌面悬浮窗

这是一篇Android悬浮窗的介绍&#xff0c;能够实现例如360&#xff0c;QQ管家那样的悬浮窗效果。后台运行了一个服务&#xff0c;用于控制在运行非桌面app情况下隐藏悬浮窗。 下面先上Demo截图&#xff1a; 上图就是所实现的简单悬浮窗示例&#xff0c;当然可以根据项目…