文档章节

可移动的浮动按钮

mikey961890
 mikey961890
发布于 2017/02/07 16:50
字数 569
阅读 3
收藏 0

自定义代码.h

//  ZMFloatButton.h

//  xinzibao

//

//  Created by mac on 2017/2/7.

//  Copyright © 2017年 jiangzhenmin. All rights reserved.

//

#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

#define SCREEN_WIDTH  ([UIScreen mainScreen].bounds.size.width)

#import <UIKit/UIKit.h>

@class ZMFloatButton;

@protocol ZMFloatButtonDelegate <NSObject>

 

@required

 

- (void)floatTapAction:(ZMFloatButton *)sender;

 

@end

@interface ZMFloatButton : UIView<UIGestureRecognizerDelegate>

@property (nonatomic, assign) id<ZMFloatButtonDelegate> delegate;

@property (nonatomic, strong) UIImageView *bannerIV;//浮标的imageview

@property (nonatomic, assign) BOOL isMoving;//是否可移动

 

@end

自定义代码.m

//  ZMFloatButton.m

//  xinzibao

//

//  Created by mac on 2017/2/7.

//  Copyright © 2017年 jiangzhenmin. All rights reserved.

//

 

#import "ZMFloatButton.h"

//点击后扩大的大小

#define SCALESIZE 5

#define __async_main__ dispatch_async(dispatch_get_main_queue()

 

typedef NS_ENUM (NSUInteger, LocationTag)

{

    kLocationTag_top = 1,

    kLocationTag_left,

    kLocationTag_bottom,

    kLocationTag_right

};

@implementation ZMFloatButton

{    

    float _nLogoWidth;//浮标的宽度

    float _nLogoHeight;//浮标的高度

    

    LocationTag _locationTag;

    float _w; //有效活动宽度

    float _h; //有效活动高度

}

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        // Initialization code

        _nLogoWidth = frame.size.width;

        _nLogoHeight = frame.size.height;

        self.isMoving = YES;

        self.backgroundColor = [UIColor clearColor];

        self.bannerIV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, _nLogoWidth, _nLogoHeight)];

        //此处表示正常情况下父视图的有效范围, 其他尺寸自行更改

        _w = SCREEN_WIDTH;

        _h = SCREEN_HEIGHT-49-64;

        //_bannerIV.image = [UIImage imageNamed:@"publishAdd"];

        _bannerIV.layer.cornerRadius = 23.f;

        _bannerIV.layer.masksToBounds = YES;

        _bannerIV.backgroundColor = [UIColor orangeColor];

        _bannerIV.userInteractionEnabled = YES;

        _bannerIV.alpha = 0.8f;

        [self addSubview:_bannerIV];

        _locationTag = kLocationTag_right;

        _nLogoWidth = frame.size.width;

        _nLogoHeight = frame.size.height;

        self.userInteractionEnabled = YES;

        UITapGestureRecognizer *publishTap= [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)];

        publishTap.delegate = self;

        [_bannerIV addGestureRecognizer:publishTap];

    }

    return self;

}

 

- (void)tapAction{

    [self.delegate floatTapAction:nil];

}

#pragma mark - UIResponder

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    

}

 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSLog(@"touchesCancelled");

}

 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    if (!_isMoving) {

        return;

    }

    [self computeOfLocation:^

     {

         

     }];

}

 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    if (!_isMoving) {

        return;

    }

    UITouch *touch = [touches anyObject];

    CGPoint movedPT = [touch locationInView:[self superview]];

    

    if (

        movedPT.x - self.frame.size.width/2 < 0.f

        ||

        movedPT.x + self.frame.size.width/2 > _w

        ||

        movedPT.y - self.frame.size.height/2 < 0.f

        ||

        movedPT.y + self.frame.size.height/2 > _h

        )

    {

        return;

    }

    NSLog(@"横坐标:%.2f", movedPT.x);

    NSLog(@"纵坐标:%.2f", movedPT.y);

    

    [self setCenter:movedPT];

    

}

- (void)computeOfLocation:(void(^)())complete

{

    

    float x = self.center.x;

    float y = self.center.y;

    CGPoint m = CGPointZero;

    m.x = x;

    m.y = y;

    //取两边靠近--------------------------

    if (x < _w/2)

    {

        _locationTag = kLocationTag_left;

    }else

    {

        _locationTag = kLocationTag_right;

    }

    switch (_locationTag)

    {

        case kLocationTag_top:

            m.y = 0 + _bannerIV.frame.size.width/2;

            break;

        case kLocationTag_left:

            m.x = 0 + _bannerIV.frame.size.height/2+12;

            break;

        case kLocationTag_bottom:

            m.y = _h - _bannerIV.frame.size.height/2;

            break;

        case kLocationTag_right:

            m.x = _w - _bannerIV.frame.size.width/2-12;

            break;

    }

    

    //这个是在旋转是微调浮标出界时

    if (m.x > _w - _bannerIV.frame.size.width/2)

        m.x = _w - _bannerIV.frame.size.width/2;

    if (m.y > _h - _bannerIV.frame.size.height/2)

        m.y = _h - _bannerIV.frame.size.height/2;

    

    [UIView animateWithDuration:0.1 animations:^

     {

         [self setCenter:m];

     } completion:^(BOOL finished)

     {

         complete();

     }];

}

 

@end

引入控制器

//  ViewController.m

//  FloatButtonTest

//

//  Created by mac on 2017/2/7.

//  Copyright © 2017年 Mikey. All rights reserved.

//

 

#import "ViewController.h"

#import "ZMFloatButton.h"

@interface ViewController ()<ZMFloatButtonDelegate>

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor lightTextColor];

    ZMFloatButton * floatBtn = [[ZMFloatButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH-60, SCREEN_HEIGHT-176, 46, 46)];

    floatBtn.delegate = self;

    //floatBtn.isMoving = NO;

    floatBtn.bannerIV.image = [UIImage imageNamed:@"publishAdd"];

    [self.view addSubview:floatBtn];

    [self.view bringSubviewToFront:floatBtn];

}

#pragma mark -ZMFloatButtonDelegate

- (void)floatTapAction:(ZMFloatButton *)sender{

    //点击执行事件

}

 

© 著作权归作者所有

mikey961890
粉丝 0
博文 2
码字总数 676
作品 0
杭州
程序员
私信 提问
FloatingDragButton:炫酷的拖拽浮动按钮

IOS的Assistive Touch效果很炫酷,可以任意拖拽,同时点击后会展开菜单栏。然而,这不只是IOS的特权,Android也可以实现。但是由于悬浮窗需要申请权限,所以本文仅在app内实现,可以任意拖拽...

Ruheng
2017/08/10
0
0
FloatingDragButton:炫酷的拖拽浮动按钮

IOS的Assistive Touch效果很炫酷,可以任意拖拽,同时点击后会展开菜单栏。然而,这不只是IOS的特权,Android也可以实现。但是由于悬浮窗需要申请权限,所以本文仅在app内实现,可以任意拖拽...

Ruheng
2017/08/11
0
0
比特大陆首批ANTBOX受热捧 第二批产品开售

  继推出首批可移动矿场ANTBOX后,比特大陆于近日开始发售国内第二批、第三批产品。从比特大陆官网上了解到,因生产批次和发货时间不相同,这两批ANTBOX的产品价格也略有浮动。      可...

人工智能趣闻
2018/05/17
0
0
比特大陆推出可移动矿场ANTBOX 最多支持324台矿机

  提到矿场,一般矿工首先想到自建的厂房式矿场,或者租赁式工厂矿场。相对来说,这些传统型矿场设备较为简单,并不能科学有效地为矿机提供散热更强、环境更佳的挖矿环境,在此背景下,知名...

人工智能那点事
2018/07/06
0
0
比特大陆新品蚂蚁矿机ANTBOX上市 最多可容纳300多台矿机

  提起比特大陆,对于挖矿的人来说都不陌生,这家全球最大的数字货币设备提供商近期不仅推出了蚂蚁矿机B3新品,也推出了一款可移动集装箱矿场ANTBOX,最多一次可容纳300多台矿机。     ...

人工智能那点事
2018/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

非webpack require.js + vue + vueRouter + iView 实现按需加载

适合一个人开发的时候,在整个php框架下,又想单页,又可以直接后端assign变量穿透到模板。又不想写接口搞前后分离脚手架一大堆npm 包, 在php模板下 引入require.js <!DOCTYPE html><html...

一箭落旄头
22分钟前
7
0
新特性解读 | MySQL 8.0 窗口函数详解

原创作者: 杨涛涛 背景 一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能。不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF...

爱可生
28分钟前
3
0
23.5 jumpserver介绍

23.5 jumpserver介绍 开源堡垒机jumpserver介绍: 官网www.jumpserver.org Jumpserver是一款使用Python, Django开发的开源跳板机系统, 助力互联网企业高效 用户、资产、权限、审计 管理 Auth...

oschina130111
34分钟前
4
0
Spring Cloud 入门教程(七): 消息总线(Spring Cloud Bus)(Greenwich.RELEASE)

参考网址:https://blog.csdn.net/forezp/article/details/81041062,由于此文中作者基于git和rabbitMq,为了适应内网我改造为基于mysql和kafka 一、准备工作 1、安装kafka 参考这个:kafka...

pipi1919
35分钟前
3
0
用人工智能改变企业与客户的连接方式

  随着以AI人工智能技术为主的新一代信息技术的快速商业化落地,我国的数字经济正高歌猛进。2017年我国数字经济对GDP的贡献率为55%,接近甚至超越了某些发达国家水平,2018年我国数字经济规...

琴殇的
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部