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

Posted 漂泊_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch (可以替换为视频悬浮窗口)相关的知识,希望对你有一定的参考价值。

前提:当时看到别人写过这个类似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;







以上是关于iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch (可以替换为视频悬浮窗口)的主要内容,如果未能解决你的问题,请参考以下文章

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

ios怎么设置导航条左边的按钮

Flutter全局悬浮按钮

iOS开发——悬浮按钮

Vue拖拽悬浮按钮

IOS Xcode中的样式按钮