文档章节

可移动的浮动按钮

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
模仿今日头条的导航条和菜单--BYDailyNews

这是一个很好地模仿今日头条的导航条及下拉菜单动画效果的Demo. 下拉菜单动画: 当“排序”按钮 未点击时 1.点击上方区域按钮 下拉菜单收回 导航条选择相应按钮 2.点击下方区域按钮 将下方按...

红薯
2015/01/27
2.5K
0
比特大陆推出可移动矿场ANTBOX 最多支持324台矿机

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

人工智能那点事
07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TensorFlow的基础概念02

TensorFlow的计算流图 import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#TensorFlow的计算模型,数据流图'''TensorFlow = Tensor + FlowTensor 张量 数据结构:多维数组Flo...

怪咖先生forever
2分钟前
0
0
大数据技术的发展趋势

大数据领域已经涌现出了大量新的技术,它们成为大数据采集、存储、处理和呈现的有力武器。这些技术下一步将如何发展?它们之中哪些技术将广为流行?又会诞生哪些新的技术? 技术趋向多样化,...

董黎明
17分钟前
2
0
藏在正则表达式里的陷阱

前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 我们可以看到所...

前端小攻略
20分钟前
0
0
关联更新,关联查询

关联更新 update A,B SET A.c1=B.c1,A.c2=B.c2 where A.id=B.id and ... update A inner join on A.id=B.id set A.c1=B.c1,A.c2=B.c2 where... 关联查询 交叉连接(cross join),内连接(inner ......

关元
23分钟前
0
0
django的环境搭建及启用

Pycharm社区版不像商业版那样可以直接创建django工程,需要通过一下步骤创建: 新建一个用于Django开发的虚拟环境 打开命令窗口 新建虚拟环境: conda create -n env_name python=3.6 查看系...

davidwbnu
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部