IOS 应用悬浮窗

news/2024/11/18 4:26:23/

需求

在一个app应用的最顶部添加一个悬浮窗,就像ios系统AssistiveTouch 可以左右滑动,但是最终会停在左边或右边。

实现思路

在应用的视图的最顶层添加一个UIWindow,用这个UIWindow 充当悬浮窗,给UIWindow添加移动的手势监听,让悬浮窗随着手指移动,释放的时候,让它以动画的方式靠边

代码

    //悬浮窗测试//创建一个悬浮窗口mwindow = [[AssistiveTouch alloc]initWithFrame:CGRectMake(100, 200, 40, 40) imageName:@"1.png"];//ios9 window要设置rootview 不然崩溃UIViewController *controller = [[UIViewController alloc] init];mwindow.rootViewController = controller;//展示悬浮窗。。[self.window makeKeyAndVisible];
        //添加移动的手势UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(locationChange:)];pan.delaysTouchesBegan = YES;[self addGestureRecognizer:pan];
//改变位置
-(void)locationChange:(UIPanGestureRecognizer*)p
{//[[UIApplication sharedApplication] keyWindow]CGPoint panPoint = [p locationInView:[[UIApplication sharedApplication] keyWindow]];if(p.state == UIGestureRecognizerStateBegan){[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(changeColor) object:nil];_imageView.alpha = 0.8;}else if (p.state == UIGestureRecognizerStateEnded){[self performSelector:@selector(changeColor) withObject:nil afterDelay:4.0];}if(p.state == UIGestureRecognizerStateChanged){self.center = CGPointMake(panPoint.x, panPoint.y);}else if(p.state == UIGestureRecognizerStateEnded){if(panPoint.x <= kScreenWidth/2){if(panPoint.y <= 40+HEIGHT/2 && panPoint.x >= 20+WIDTH/2){[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(panPoint.x, HEIGHT/2);}];}else if(panPoint.y >= kScreenHeight-HEIGHT/2-40 && panPoint.x >= 20+WIDTH/2){[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(panPoint.x, kScreenHeight-HEIGHT/2);}];}else if (panPoint.x < WIDTH/2+15 && panPoint.y > kScreenHeight-HEIGHT/2){[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(WIDTH/2, kScreenHeight-HEIGHT/2);}];}else{CGFloat pointy = panPoint.y < HEIGHT/2 ? HEIGHT/2 :panPoint.y;[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(WIDTH/2, pointy);}];}}else if(panPoint.x > kScreenWidth/2){if(panPoint.y <= 40+HEIGHT/2 && panPoint.x < kScreenWidth-WIDTH/2-20 ){[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(panPoint.x, HEIGHT/2);}];}else if(panPoint.y >= kScreenHeight-40-HEIGHT/2 && panPoint.x < kScreenWidth-WIDTH/2-20){[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(panPoint.x, 480-HEIGHT/2);}];}else if (panPoint.x > kScreenWidth-WIDTH/2-15 && panPoint.y < HEIGHT/2){[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(kScreenWidth-WIDTH/2, HEIGHT/2);}];}else{CGFloat pointy = panPoint.y > kScreenHeight-HEIGHT/2 ? kScreenHeight-HEIGHT/2 :panPoint.y;[UIView animateWithDuration:0.2 animations:^{self.center = CGPointMake(320-WIDTH/2, pointy);}];}}}
}

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

相关文章

android仿苹果悬浮窗(自动停靠、随手指滑动、返回主屏幕)

说明&#xff1a;本人写博客一来是为了方便日后查看项目&#xff0c;二来是希望能够和广大的程序猿相互交流学习&#xff0c;文章布局简单&#xff0c;如有嫌弃&#xff0c;请绕行&#xff0c;如有错误&#xff0c;请指出&#xff0c;谢谢。 实验环境&#xff1a;安卓6.0 魅族…

苹果悬浮球_买了一万块钱的苹果手机,悬浮球功能不会用?真的可惜了

苹果手机悬浮球就是大家俗称的"小白点"功能&#xff0c;虽然说现在是全面屏时代&#xff0c;大多数人都习惯了虚拟按键进行操作。也有很多快捷键功能。 但是iPhone手机小白点作为苹果手机经典功能之一&#xff0c;很多快捷功能非常实用&#xff0c;今天就来教教大家怎…

nginx七层代理和四层转发的理解

先来理解一下osi七层模型 应用层 应用层是ISO七层模型的最高层&#xff0c;它直接与用户和应用程序交互&#xff0c;提供用户与网络的接口。它包括各种应用协议&#xff0c;如HTTP、FTP、SMTP等&#xff0c;用于实现特定应用的功能和通信表示层 表示层…

hexo #01 安装

本篇主要步骤 1、前置环境2、安装 hexo3、初始化 hexo4、运行 hexo 1、前置环境 参考官网教程&#xff1a;hexo 博客系统安装前提 2、安装 hexo 这里采用官网推荐的第二种方式局部安装 hexo 包。 $ npm install hexo3、初始化 hexo 创建一个空文件夹&#xff0c;用来作为项…

进销存之“进”

进销存又称作是购销链。 进&#xff1a;指的是从询价——采购——入库&#xff0c;以及到最终的付款的过程&#xff1b; 销&#xff1a;指的是从报价——销售——出库&#xff0c;以及到最终的收款的过程&#xff1b; 存&#xff1a;指的是收料&#xff08;采购单收料、回收…

【酷柚易汛进销存开源版讲解】什么是核销单

核销单是用来处理预收业务、预付业务及其他一些无资金收支的往来款项抵消的业务单据。 1、业务类型&#xff1a;预收冲应收 指拿A客户预收的款抵消掉该向A客户收的款 。是收款单与销售出库单、销售退货单进行核销。 2、 业务类型&#xff1a;预付冲应付 指拿向A供应商预付的款…

进销存管理系统(一)---什么是进销存管理系统

这是本人在CSDN发表的第一遍博文&#xff0c;以前都没有写博文之类的东东&#xff0c;头一次还真不知道从何下手&#xff0c;先不管这些了&#xff0c;先写下吧以后发现不对的地方再改过来吧。 到现在为止从学校毕业到现在差不多正好一年了&#xff0c;做php开发有一年多的时间…

在进销存管理中经常提到红冲,那什么是红冲呢?

红冲的来历 红冲是红字冲账法的简称,又称红字更正法,是指用红字冲销或冲减原有的错误记录,以更正或调整记账错误的方法。红字冲账法按照其冲销错账的程序不同,可分为全额冲账法和差额冲账法两种。 全额冲账法是指将错账全部用红字冲销,再编制正确的记账凭证以更正错账的…