zoukankan      html  css  js  c++  java
  • 您的位置:首页 » IOS » iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch

    原文地址:http://blog.5ibc.net/p/86562.html

    前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置、第二切换页面后无法使用、第三运行时偶尔会崩溃。然后自己就去度娘、论坛中都查了一些资料,然后结合起来写了这么一个demo。
    思路:实现全局 需要在 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;
    }
  • 相关阅读:
    免费的论文查重网站
    文件上传到tomcat服务器 commons-fileupload的详细介绍与使用
    消防喷头的原理
    [辟谣]下蹲猛起来眼前发黑是心脏衰竭的表现?别扯了!
    noip2010普及组 接水问题分析
    洛谷P1106 删数问题
    老飞侠随机抽取器 v3.0 新春钜惠版
    一个基于VB的简单IRC机器人服务器
    (转)经常有人发错 SQL 的发音,如何华丽丽的引导纠正他们又不失优雅?
    TONGHUA
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyublogs/p/5923602.html
Copyright © 2011-2022 走看看