close
当前位置: 物联网在线 > 技术文库 > ios >

iOS开源:SDiffuseMenu - 炫酷菜单弹射动画

iOS开源:SDiffuseMenu - 炫酷菜单弹射动画

配置图如下: 

iOS开源:SDiffuseMenu - 炫酷菜单弹射动画

版本记录

V1.2.1 修复代码,以便更好的支持 CocoaPods

V1.2.0 支持 CocoaPods 嵌入代码因访问权限问题致部分功能无法使用,已在1.2.1版修复

V1.1.0 新增任意方向的直线弹出动画\新增常用方向的枚举..

更多记录 请戳一下

一、使用方法:

1.使用 pod 方式嵌入项目: pod 'SDiffuseMenu','~> 1.2.1'

2.直接下载 zip 包内含:

1)SDiffuseMenuDebugDemo.xcodeproj: 调试 demo

2)SDiffuseMenu 文件夹:内含源文件

3)SDiffuseMenuDemo.xcworkspace:CocoaPods 调试 demo ,位于Source 文件夹内

添加协议(动画状态回调) -> 设置选项数组 -> 设置菜单按钮 -> 动画属性配置 -> .addSubview(menu)

1、添加协议

class ViewController: UIViewController, SDiffuseMenuDelegate { var menu: SDiffuseMenu! }

2、设置菜单的选项按钮数据

// 加载图片 guard let storyMenuItemImage = UIImage(named:"menuitem-normal.png") else { fatalError("图片加载失败") } guard let storyMenuItemImagePressed = UIImage(named:"menuitem-highlighted.png") else { fatalError("图片加载失败") } guard let starImage = UIImage(named:"star.png") else { fatalError("图片加载失败") } guard let starItemNormalImage = UIImage(named:"addbutton-normal.png") else { fatalError("图片加载失败") } guard let starItemLightedImage = UIImage(named:"addbutton-highlighted.png") else { fatalError("图片加载失败") } guard let starItemContentImage = UIImage(named:"plus-normal.png") else { fatalError("图片加载失败") } guard let starItemContentLightedImage = UIImage(named:"plus-highlighted.png") else { fatalError("图片加载失败") } var menus = [SDiffuseMenuItem]() for _ in 0 ..< 6 { let starMenuItem = SDiffuseMenuItem(image: storyMenuItemImage, highlightedImage: storyMenuItemImagePressed, contentImage: starImage, highlightedContentImage: nil) menus.append(starMenuItem) }

3、设置菜单按钮

let startItem = SDiffuseMenuItem(image: starItemNormalImage, highlightedImage: starItemLightedImage, contentImage: starItemContentImage, highlightedContentImage: starItemContentLightedImage)

4、添加 SDiffuseMenu

let menuRect = CGRect.init(x: self.menuView.bounds.size.width/2, y: self.menuView.bounds.size.width/2, width: self.menuView.bounds.size.width, height: self.menuView.bounds.size.width) menu = SDiffuseMenu(frame: menuRect, startItem: startItem, menusArray: menus as NSArray, grapyType: SDiffuseMenu.SDiffuseMenuGrapyType.arc) menu.center = self.menuView.center menu.delegate = self self.menuView.addSubview(menu)

5、动画配置

如果配置弧线形动画,则动画中弧线半径变化为:0--> 最大 farRadius--> 最小 nearRadius--> 结束 endRadius

如果配置直线形动画,则动画中半径就是直线段的长度,变化为:0--> 最大 farRadius--> 最小 nearRadius-->结束 endRadius

// 动画时长 menu.animationDuration = CFTimeInterval(animationDrationValue.text!) // 最小半径 menu.nearRadius = CGFloat((nearRadiusValue.text! as NSString).floatValue) // 结束半径 menu.endRadius = CGFloat((endRadiusValue.text! as NSString).floatValue) // 最大半径 menu.farRadius = CGFloat((farRadiusValue.text! as NSString).floatValue) // 单个动画间隔时间 menu.timeOffset = CFTimeInterval(timeOffSetValue.text!)! // 整体角度 menu.menuWholeAngle = CGFloat((menuWholeAngleValue.text! as NSString).floatValue) // 整体偏移角度 menu.rotateAngle = CGFloat((rotateAngleValue.text! as NSString).floatValue) // 展开时自旋角度 menu.expandRotation = CGFloat(M_PI) // 结束时自旋角度 menu.closeRotation = CGFloat(M_PI * 2) // 是否旋转菜单按钮 menu.rotateAddButton = rotateAddButton.isOn // 菜单按钮旋转角度 menu.rotateAddButtonAngle = CGFloat((rotateAddButtonAngleValue.text! as NSString).floatValue) // 菜单展示的形状:直线 or 弧形 menu.sDiffuseMenuGrapyType = isLineGrapyType.isOn == true ? .line : .arc // 为方便使用,V1.1.0版本已枚举常见方位,可直接使用,无需再次设置 rotateAngle && menuWholeAngle // 若对于 rotateAngle\menuWholeAngle 不熟悉,建议查看 source 目录下的配置图片 menu.sDiffuseMenuDirection = .above // 上方180° // menu.sDiffuseMenuDirection = .left // 左方180° // menu.sDiffuseMenuDirection = .below // 下方180° // menu.sDiffuseMenuDirection = .right // 右方180° // menu.sDiffuseMenuDirection = .upperRight // 右上方90° // menu.sDiffuseMenuDirection = .lowerRight // 右下方90° // menu.sDiffuseMenuDirection = .upperLeft // 左上方90° // menu.sDiffuseMenuDirection = .lowerLeft // 左下方90°
(责任编辑:ioter)

用户喜欢...

Semtech利用LoRaWAN推出用于物联网开发的免费开源工具集

Semtech希望通过免费的,开源的,以LoRaWAN为重点的物联网开发教育工具来揭开RF的神秘色彩。 Semtech宣布推出两个新的免费教育工具系列,以帮助设计人员了解LoRaWAN以及如何在设计中实现它,尤...


AI 圣经 PRML《模式识别与机器学习》官方开源了!

红色石头相信任何一个搞机器学习、深度学习的人都应该听说过一本经典教材:《Pattern Recognition and Machine Learning》,中文译名《模式识别与机器学习》,简称 PRML。出自微软剑桥研究院实验室...


开源物联网平台汇总

物联网(IoT)是帮助人工智能(AI)以更好的方式控制和理解事物的未来技术。 我们收集了一些最有名的物联网平台,帮助您以受控方式开发物联网项目。 物联网平台是帮助设置和管理互联网...


Startup将开源驱动到物联网

由Linaro成员组成的创业公司希望成为物联网的红帽,为终端节点,网关和汽车提供Linux和Zephyr RTOS的配置。Foundries.io旨在提供与处理器无关的代码,以便在物联网开发人员具有各种越来越多的特...


CN0398开发板和ADuCM360_demo_cn0398开源软件包解决了土壤测量系统设

保持适当的土壤湿度和pH值是植物健康的基本要求,无论是用于大规模农业还是简单的家庭菜园。然而,为了测量这些土壤特性,开发人员需要设计出具有成本效益的高精度模拟信号链,能够将...


创新的组合:开源和众筹

开源已经被称为力量倍增器,这是使公司的员工,融资和资源更为有效的一个因素。但是,在过去的几年里,开源已经开始与另一个力量倍增器 - 众筹相提并论。现在,这种结合的结果正在出...


推荐 10 个饱受好评且功能独特的开源人工智能项目

关于人工智能的项目,相信大家都看过或者用过不少了,但它们的大多数看上去都十分“高大上”,让人感觉要掌握他们犹如习屠龙之术一样。事实上,有很多关于人工智能的项目还是十分实...


“开源”为何对于IoT如此重要?

物联网、开源、操作系统是目前IT业界的热门词汇,也正是这三个词汇构成了物联网开源操作系统。 对于物联网发展而言,“碎片化”是主要的问题,其中芯片、传感器、通信协议、应用场景...


基于Zedboard的开源软件定义无线电(SDR)设备:Panoradio!

软件定义无线电(Software Defined Radio, SDR)是一种现代无线电广播通信技术,它采用软件定义的无线通信协议而非“纯硬件电路”实现各种通信和信号采集功能,这种方式打破了有史以来设备...


开源工具助你在FPGA上轻松实现二值化神经网络

神经网络技术起源于上世纪五、六十年代,当时叫感知机,拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果,早期感知机的推动者是...