文档章节

可移动的浮动按钮

mikey961890
 mikey961890
发布于 2017/02/07 16:50
字数 569
阅读 3
收藏 0
点赞 0
评论 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
模仿今日头条的导航条和菜单--BYDailyNews

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

红薯
2015/01/27
2.5K
0
DM8261_U盘维修过程

同事的U盘,说无法完成格式化,且容量现在显示为0,求救于我。 拿到U盘后在电脑上看了一下,的确 先用“芯片无忧”看主控 杯具的主控,史上最烂的DM8261,加上杯具的TLC,山寨害人啊。去网上...

lzlutao
2012/07/14
0
0
3dsMaxMax脚本的入门讲解之怎样定义控件和工具条(2)

一。我们首先要知道MAX的几个和脚本编写和测试有关的地方。  单击命令面板中的 按钮,打开应用程序面板,再单击MAXScript按钮,在应用程序面板出现MAXScript卷帘窗,如图1-1所示。 脚本监听...

jieshu
2013/01/22
0
0
使用UltraISO制作U盘启动盘

1、鼠标右键“以管理员身份运行”UltraISO图标 2、打开UltraISO的窗口后依次点击左上角的“文件”-“打开” 3、浏览到存放镜像文件的目录,选中该目标文件,点击“打开”按钮 4、然后再次回到...

北海vs
2016/03/31
12
0
Android5.0+(CoordinatorLayout)

英文原文:https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout 这篇文章专门讲解和CoordinatorLayout相关的知识点,这也是Design Support Library中最重要与最难...

让代码飞一会
2015/07/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

什么是Base64

一、什么是Base64? 百度百科中对Base64有一个很好的解释:“Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。 什么是...

Jack088
7分钟前
0
0
SQL多表联查leftjoin左边加表单

SELECT IFNULL(u.USER_ACCOUNT, o.USER_ACCOUNT) u.USER_ACCOUNT, o.* FROM gh_orders o LEFT JOIN gh_user u ON o.PARENT_ID = u.ROW_ID 1.假如u.USER_ACCOUNT不空返回u.USER_ACCOUNT,否则返......

森火
11分钟前
0
0
expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统

expect脚本同步文件 更改权限 执行脚本 查看执行结果 expect eof需要加上,作用是等脚本命令执行完再进行退出 expect脚本指定host和要同步的文件 更改权限,执行脚本 构建文件分发系统 需求背...

Zhouliang6
49分钟前
1
0
Hive应用:外部分区表

Hive应用:外部分区表 介绍 Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示...

星汉
59分钟前
3
0
点击Enter登录

1. 效果 2. 实现过程(记得引入jq文件) //6.回车事件 登录 $(function() { document.onkeydown = function(event) { var e = event || window.event || arguments.callee.caller.arguments......

Lucky_Me
今天
1
0
点击菜单内容切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .mao{ ......

南桥北木
今天
1
0
OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
今天
613
8
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
10
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
1
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部