e项目总结一活动悬浮框的实现

1 篇文章 0 订阅

            当时项目正值收尾,公司近期要举办一个投票的推广活动,然后就在首页上加了一个活动悬浮框,点进去后 调得是web端的活动页面 ,接口返回参数为1的时候让悬浮框出现,返回参数为0 的时候,让其消失 ,这是为了避免苹果审核时间过长而造成app上的进度不同 ,由于苹果的唯一识别码已经废弃 所以为了防止刷票 又在 进入活动界面的时候做了个登录提醒,因为账号是绑定手机号的,如果对方有那么多的手机号的话 刷票就由他去吧,也想过采用uuid + keychain 的方式 也就是把uuid由keychain储存,但他的局限性也只是能保证卸载重装的时候   uuid不变 但是刷机和升级系统的时候还是会改变 想想以前自己就是个刷机狂魔,so就将其舍去了。

           悬浮框是放在视图的window上的,当然悬浮框写成个代理……

         mwindow.assistiveDelegate =self;

        self.window = [[UIApplication sharedApplication] keyWindow];

        [self.window addSubview:mwindow];

    又为了悬浮框加了个拖拽功能 效果类似于苹果自带的AssistiveTouch 所以它需要改变位置 以及添加手势

一个拖拽,一个轻拍

  

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

        pan.delaysTouchesBegan = YES;

        [self addGestureRecognizer:pan];

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(click:)];

        [self addGestureRecognizer:tap];

    }

    

    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1

                                                  target:self selector:@selector(changePos)

                                                userInfo:nil repeats:YES];



//改变位置

-(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];

        _viewAnima.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);

                }];

            }

        }

    }

}

//为了让活动的题目在小的悬浮框上显示出来 就将字体文字做了成跑马灯的效果

- (void) changePos

{

    CGPoint curPos = _customLab.center;

   // NSLog(@"%f",self.customLab.center.x);

    // curPosx坐标已经超过了屏幕的宽度

    if(curPos.x <  -100 )

    {

        CGFloat jianJu = _customLab.frame.size.width/2;

        // 控制蝴蝶再次从屏幕左侧开始移动

        _customLab.center = CGPointMake(self.frame.size.width + jianJu, 20);

        

    }

    else

    {

        // 通过修改ivcenter属性来改变iv控件的位置

        _customLab.center = CGPointMake(curPos.x - 5, 20);

    }

    //其实整个移动都是————iv.center来去设置的

}

又为了只让悬浮框在首界面出现 so就让他在 viewWillAppear:(BOOL)animated上创建,在viewDidDisappear:(BOOL)animated 上remove掉就可以了 这一点要注意下 如果首界面进入下个界面是push出去的话 因为共用导航条 所以有时候在下界面的时候会不走viewDidDisappear:(BOOL)animated的方法 这样如果你频繁调用的话 就会让首界面重复创建悬浮框 这样的话 你就需要在首界面遵守 UINavigationControllerDelegate

然后在协议上加以限制

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{

    //每次当navigation中的界面切换,设为空。本次赋值只在程序初始化时执行一次

    static UIViewController *lastController = nil;

    

    //若上个view不为空

    if (lastController != nil)

    {

        //若该实例实现了viewWillDisappear方法,则调用

        if ([lastController respondsToSelector:@selector(viewWillDisappear:)])

        {

            [lastController viewWillDisappear:animated];

        }

    }

    

    //将当前要显示的view设置为lastController,在下次view切换调用本方法时,会执行viewWillDisappear

    lastController = viewController;

    

    [viewController viewWillAppear:animated];

}



 




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值