第二天:Swift手势操控弹性按钮

  参考链接:https://www.jianshu.com/p/f080ede0f3a8

                         

  1 import UIKit
  2 
  3 fileprivate let buttonH: CGFloat = 200
  4 
  5 class ViewController: UIViewController, UIGestureRecognizerDelegate {
  6 
  7     @IBOutlet weak var segmentControl: UISegmentedControl!
  8     var randomBtn: UIButton!
  9     override func viewDidLoad() {
 10         super.viewDidLoad()
 11 
 12         // Do any additional setup after loading the view.
 13         
 14         setupUI()
 15     }
 16 
 17     
 18     @IBAction func segmentedControlAction(_ sender: UISegmentedControl) {
 19         
 20         switch sender.selectedSegmentIndex {
 21         case 0:
 22             randomBtn.backgroundColor = UIColor.red
 23         case 1:
 24             randomBtn.backgroundColor = UIColor.green
 25         case 2:
 26             randomBtn.backgroundColor = UIColor.blue
 27         case 3:
 28             randomBtn.backgroundColor = UIColor.randomColor()
 29         default:
 30             randomBtn.backgroundColor = UIColor.yellow
 31         }
 32     }
 33     
 34     override func didReceiveMemoryWarning() {
 35         super.didReceiveMemoryWarning()
 36         // Dispose of any resources that can be recreated.
 37     }
 38     
 39 
 40     /*
 41     // MARK: - Navigation
 42 
 43     // In a storyboard-based application, you will often want to do a little preparation before navigation
 44     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
 45         // Get the new view controller using segue.destinationViewController.
 46         // Pass the selected object to the new view controller.
 47     }
 48     */
 49 
 50 }
 51 
 52 extension ViewController {
 53     func setupUI() {
 54         // 添加背景色
 55         let backgroundLayer = CAGradientLayer()
 56         backgroundLayer.colors = [UIColor.yellow.cgColor, UIColor.white.cgColor]
 57         backgroundLayer.startPoint = CGPoint(x: 0.5, y: 0)
 58         backgroundLayer.endPoint = CGPoint(x: 0.5, y: 1)
 59         backgroundLayer.frame = self.view.bounds
 60         self.view.layer.addSublayer(backgroundLayer)
 61         
 62         self.view.bringSubview(toFront: segmentControl)
 63         
 64         // 添加 button
 65         self.randomBtn = UIButton()
 66         randomBtn.frame.size = CGSize(width: buttonH, height: buttonH)
 67         randomBtn.backgroundColor = UIColor.red
 68         randomBtn.center = self.view.center
 69         randomBtn.setTitle("MineCode", for: .normal)
 70         randomBtn.layer.cornerRadius = buttonH / 2
 71         randomBtn.titleLabel?.font = UIFont.systemFont(ofSize: 24)
 72         randomBtn.titleLabel?.textColor = UIColor.white
 73         self.view.addSubview(randomBtn)
 74         
 75         addGesture()
 76     }
 77     
 78     func addGesture() {
 79         
 80         let singleTapGes = UITapGestureRecognizer(target: self, action:#selector(signleTapAction(_ :)))
 81         singleTapGes.numberOfTapsRequired = 1
 82         self.randomBtn.addGestureRecognizer(singleTapGes)
 83         
 84         let longPressGes = UILongPressGestureRecognizer(target: self, action:#selector(longPressAction(_ :)))
 85         longPressGes.allowableMovement = 10
 86         longPressGes.minimumPressDuration = 1
 87         self.randomBtn.addGestureRecognizer(longPressGes)
 88         
 89         let panGes = UIPanGestureRecognizer(target: self, action:#selector(panGesAction(_ :)))
 90         panGes.minimumNumberOfTouches = 1
 91         panGes.maximumNumberOfTouches = 1
 92         self.randomBtn.addGestureRecognizer(panGes)
 93         
 94         let pinchGes = UIPinchGestureRecognizer(target: self, action:#selector(pinchAction(_ :)))
 95         pinchGes.delegate = self
 96         self.randomBtn.addGestureRecognizer(pinchGes)
 97         
 98         let rotationGes = UIRotationGestureRecognizer(target: self, action:#selector(rotationAction(_ :)))
 99         rotationGes.delegate = self
100         self.randomBtn.addGestureRecognizer(rotationGes)
101     }
102 }
103 
104 extension ViewController {
105     @objc func signleTapAction(_ tap: UITapGestureRecognizer) {
106         
107         print("Tap click...")
108         
109         let animation = CABasicAnimation(keyPath: "transform.rotation.z")
110         
111         animation.duration = 0.08
112         animation.repeatCount = 4
113         animation.fromValue = (-M_1_PI)
114         animation.toValue = (M_1_PI)
115         animation.autoreverses = true
116         self.randomBtn.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
117         self.randomBtn.layer.add(animation, forKey: "rotation.z")
118     }
119     
120     @objc func longPressAction(_ longGes: UILongPressGestureRecognizer) {
121         
122         print("Long Start...")
123         
124         let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
125         
126         animation.duration = 0.08
127         animation.repeatCount = 2
128         
129         animation.values = [0, -self.randomBtn.frame.width / 4, self.randomBtn.frame.width / 4, 0]
130         animation.autoreverses = true
131         self.randomBtn.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
132         self.randomBtn.layer.add(animation, forKey: "rotation.x")
133     }
134     
135     @objc func panGesAction(_ panGes: UIPanGestureRecognizer) {
136         
137         print("Pan Start")
138         
139         let movePoint = panGes.translation(in: self.view)
140         var curPoint = self.randomBtn.center
141         curPoint.x += movePoint.x
142         curPoint.y += movePoint.y
143         self.randomBtn.center = curPoint
144         
145         panGes.setTranslation(CGPoint.zero, in: self.view)
146     }
147     
148     @objc func pinchAction(_ pinch: UIPinchGestureRecognizer) {
149         
150         print("PinchAction start")
151         
152         let pinchScale = pinch.scale
153         self.randomBtn.transform = self.randomBtn.transform.scaledBy(x: pinchScale, y: pinchScale)
154         
155         pinch.scale = 1.0
156     }
157     
158     @objc func rotationAction(_ rotation: UIRotationGestureRecognizer) {
159         
160         print(("rotation Start"))
161         
162         let rotationR = rotation.rotation
163         self.randomBtn.transform = self.randomBtn.transform.rotated(by: rotationR)
164         
165         rotation.rotation = 0.0
166     }
167     
168     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
169         return true
170     }
171 }
172 
173 extension UIColor {
174     convenience init(r: CGFloat, g: CGFloat, b: CGFloat) {
175         self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: 1.0)
176     }
177     
178     class func randomColor() -> UIColor {
179         return UIColor(r: CGFloat(arc4random_uniform(256)), g: CGFloat(arc4random_uniform(256)), b: CGFloat(arc4random_uniform(256)))
180     }
181 }

 

转载于:https://www.cnblogs.com/chmhml/p/8294874.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ionic2 安装与cordova打包

1.安装: cnpm install -g cordova ionic ionic start name cd name cnpm install 2、环境配置: http://www.cnblogs.com/changyaoself/p/6544082.html 这里是具体配置。 测试环境: cordova platform list 如下才可以: 3、添加…

mysql vacuum_PostgreSQL DBA快速入门(四) - 体系架构

PostgreSQL在开源关系型数据库市场是最先进的数据库。他的第一个版本在1989年发布,从那时开始,他得到了很多扩展。根据db-enginers上的排名情况,PostgreSQL目前在数据库领域排名第四。 本篇博客,我们来讨论一下PostgreSQL的内部架…

总结mysql的基础语法_mysql 基础sql语法总结 (二)DML

二、DML(增、删、改)1)插入数据第一种写法:INSERT INTO 表名 (列名1,列名2,,......)VALUES(列值1,列值2,......)第二种写法:INSERT INTO 表名 VALUES(列值1,列值2,......…

提高团队协作效率

提高团队协作效率 分工合理,责任明确 团队是由个人组成的,团队中的个人往往经历不同、背景不同、性格有差异、水平有高低。在团队形成后、正式开工前,首先应该进行合理分工,要结合每个 人的特点和爱好,充分发挥出每个人…

Java中Array和ArrayList之间的9个区别

array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用。 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间的差异对于成为一名优秀的Java开发人员也至关重要。 如果您知道相似点和不同点,则可以明智地决定何时…

vue 在已有的购买列表中(数据库返回的数据)修改商品数量

连续加班一个月 连续通宵三天 到最后还是少了一个功能 心碎 简介:一个生成好的商品列表(数据库返回的数据) 首先拿到我们需要渲染的数组 在data中定义 我是在测试的时候 直接写了两条数据 下面开始点击删除 点击添加是一样的代码 只不过加号…

python饼状图教程_Python数据可视化:饼状图的实例讲解

使用python实现论文里面的饼状图:原图:python代码实现:# # 饼状图# plot.figure(figsize(8,8))labels [uCanteen, uSupermarket, uDorm, uOthers]sizes [73, 21, 4, 2]colors [red, yellow, blue, green]explode (0.05, 0, 0, 0)patches,…

小看--单例设计模式

(一)单例设计描述 只要了解过设计模式的同学都会知道:单例设计模式,大家都知道单例设计模式是一种创建行的设计模式。既然是创建型,那么先来讲讲,对象的创建的过程吧。 --静态成员:静态成员在程…

selenium原理python_从python角度解析selenium原理

1、selenium工作流程2、selenium工作原理(1)客户端和服务端之间实际是通过http协议进行通信,服务端的接口文档可参考:https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement(2)客户端按照服务端接口要求传入请求方式、…

Jmeter(二)Jmeter目录介绍

看过许多有关Jmeter的博客,算得上的收获颇丰;不过最牛逼的博客还是“官方文档”,官方文档是ApacheJmeter自己对自己产品的说明,论起对自己产品的理解程度,那肯定是自己嘛。。。因此推荐大家从Jmeter的官方文档开始学习…

使用Spring Data MongoDB和Spring Boot进行数据聚合

MongoDB聚合框架旨在对文档进行分组并将其转换为聚合结果。 聚合查询包括定义将在管道中执行的几个阶段。 如果您对有关该框架的更深入的细节感兴趣,那么 mongodb docs是一个很好的起点。 这篇文章的重点是编写一个用于查询mongodb的Web应用程序,以便从…

结合前段修改mysql表数据_jquery实现点击文字可编辑并修改保存至数据库

这个方法网上可以查到很多,但是好多只有点击文字编辑并保持,但是没有完整的代码写怎么保存到数据库。因为本人才疏学浅,费啦好长时间才写好把修改的内容只用一条sql语句保存到数据库,今天在这里和大家分享这是运行图片这是前台页面…

java 设置两个方法互斥_分享两个操作Java枚举的实用方法

1. 前言Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中:枚举统一接口范式2. 如何把枚举值绑定的下拉列表这种场景非常常见,如果你把状态、类别等属性封装成枚举的结构&…

Spring管理的交易说明-第2部分(JPA)

在本系列的第一部分中 ,我展示了事务如何在普通JDBC中工作 。 然后,我展示了Spring如何管理基于JDBC的事务。 在本系列的第二部分中,我将首先展示事务如何在普通的JPA中工作。 然后展示Spring如何管理基于JPA的事务。 资金转移 为了帮助说明…

CCC数字钥匙设计【BLE】--车主配对之BLE OOB配对

本文主要介绍CCC3.0采用BLE进行车主配对时,关于蓝牙OOB配对的内容。 首先,介绍下BLE Pairing的一些基础知识,有一些基本概念。之后,再着重介绍CCC规范定义的BLE OOB配对流程。 1、BLE Pairing基础知识 下面先简单介绍下BLE 5.0协…

Linux 查看内存状态

# 查看系统内存 命令:free 注:默认k单位显示注:-m 以MB注:-g以GB 单位显示total used free shared buffers cached Mem: 497 463 33 0 13 124 -/ buffe…

Altium Designer导入pcb原件之后都是绿的

转载于:https://www.cnblogs.com/chulin/p/8342041.html

在JConsole和VisualVM中查看DiagnosticCommandMBean

我已经将JConsole用作合适的通用JMX客户端已有很多年了。 该工具通常随Oracle JDK一起提供,并且易于使用。 在JMX交互方面,JConsole优于VisualVM的最大优点是JConsole带有内置的MBeans选项卡,而必须为VisualVM中的相同功能应用插件。 但是&am…

人人商城生成app教程_人人商城APP打包教程(APICLOUD版)

一.APP环境搭建和配置编译1.登录APICLOUD后台新建应用step1 注册账号注册apicloud 账号并登录APICLOUD控制台step2 新建应用再账户下面找到开发控制台>开发控制台>创建应用 填写应用名和说明,必选Native App创建Native App2 .开发工具下载安装APICLOUD开发工具…

WPF快速入门系列(2)——深入解析依赖属性

一、引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列。尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF。今天继续分享WPF中一个最重要的知识点——依赖属性。 二…