iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch
2016-07-12 12:00
399 查看
前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置、第二切换页面后无法使用、第三运行时偶尔会崩溃。然后自己就去度娘、论坛中都查了一些资料,然后结合起来写了这么一个demo。
思路:实现全局 需要在 AppDelegate.m 文件中 didFinishLaunchingWithOptions 方法里面实现
1、新建一个 继承于 UIWindow 的类 AssistiveTouch
//在 AssistiveTouch.h 文件中代码
//在 AssistiveTouch.m 文件中代码
思路:实现全局 需要在 AppDelegate.m 文件中 didFinishLaunchingWithOptions 方法里面实现
1、新建一个 继承于 UIWindow 的类 AssistiveTouch
//在 AssistiveTouch.h 文件中代码
#import <UIKit/UIKit.h> @interface AssistiveTouch : UIWindow { UIButton *_button; } -(id) initWithFrame:(CGRect)frame; @end
//在 AssistiveTouch.m 文件中代码
#import "AssistiveTouch.h" @interface AssistiveTouch () @end @implementation AssistiveTouch /* // 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; } } @end
#import "AppDelegate.h" #import "AssistiveTouch.h" @interface AppDelegate () { //悬浮框 AssistiveTouch * _Win; } @end @implementation AppDelegate // 设置自定义悬浮框坐标 -(void)setNew { _Win = [[AssistiveTouch alloc] initWithFrame:CGRectMake(0, 0, 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; }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- 绝大部分 Android 手电筒应用需要大量权限
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 这些看似合法的 iPhone Lightning 数据线将劫持您的电脑
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 我的iPhone桌面
- 三种检测iPhone/iPad设备方向的方法
- js实现iPhone界面风格的单选框和复选框按钮实例
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法