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 (可以替换为视频悬浮窗口)的主要内容,如果未能解决你的问题,请参考以下文章