文档章节

可移动的浮动按钮

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的产品价格也略有浮动。      可...

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

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

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

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

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

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
1
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
7
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
3
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部