资料介绍
软件简介
前言
使用 Swift 实现的转盘菜单,主要用到UIBezierPath
、CALayer
遮罩绘制扇形UIView
,CATransform3DMakeRotation
实现旋转动画。代码设计使用默认configureCallback
回调方便创建和设置基本属性,参考UITableView
代理和数据源模式,支持AutoLayout
和Frame
。
效果图
1.遮罩绘制扇形View
计算扇形曲线位置,通过CALayer
的mask
属性绘制出扇形UIView
核心代码
func setMaskLayer(_ startAngle: CGFloat, endAngle: CGFloat) {
let center = CGPoint(x: bounds.width * 0.5, y: bounds.height * 0.5)
let layer = CAShapeLayer()
path.addArc(withCenter: center, radius: bounds.width * 0.5, startAngle: startAngle, endAngle: endAngle, clockwise: true)
path.addLine(to: center)
layer.path = path.cgPath
layer.rasterizationScale = UIScreen.main.scale
layer.shouldRasterize = true
self.layer.mask = layer
}
2.中间镂空
func createHole(in view : UIView, radius: CGFloat) {
let path = CGMutablePath()
path.addArc(center: view.center, radius: radius, startAngle: 0.0, endAngle: 2.0 * .pi, clockwise: true)
path.addRect(CGRect(origin: .zero, size: view.bounds.size))
let maskLayer = CAShapeLayer()
maskLayer.path = path
maskLayer.fillRule = .evenOdd
view.layer.mask = maskLayer
view.clipsToBounds = true
}
3.旋转动画
添加UIPanGestureRecognizer
、UITapGestureRecognizer
手势,根据手势位置使用atan2
函数计算旋转角度,然后用CATransform3DMakeRotation
围绕Z
轴旋转做动画 核心代码
func handlePanGesture(_ sender: UIPanGestureRecognizer) {
let location = sender.location(in: self)
switch sender.state {
case .began:
startPoint = location
case .changed:
let radian1 = -atan2(startPoint.x - menuLayerView.center.x, startPoint.y - menuLayerView.center.y)
let radian2 = -atan2(location.x - menuLayerView.center.x, location.y - menuLayerView.center.y)
menuLayerView.transform = menuLayerView.transform.rotated(by: radian2 - radian1)
startPoint = location
default:
let angle = 2 * CGFloat(Double.pi) / CGFloat(cells.count)
var menuViewAngle = atan2(menuLayerView.transform.b, menuLayerView.transform.a)
if menuViewAngle < 0 {
menuViewAngle += CGFloat(2 * Double.pi)
}
var index = cells.count - Int((menuViewAngle + CGFloat(Double.pi / 4)) / angle)
if index == cells.count {
index = 0
}
setSelectedIndex(index, animated: true)
}
}
func handleTapGesture(_ sender: UITapGestureRecognizer) {
let location = sender.location(in: menuLayerView)
for (index, cell) in cells.enumerated() {
if cell.path.contains(location) {
setSelectedIndex(index, animated: true)
}
}
}
4.弹出收起动画
func openMenuView(withAnimate animate: Bool = true) {
openMenu = true
UIView.animate(withDuration: animate ? configure.animationDuration : 0, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 5.0, options: .curveEaseInOut) {
self.centerButton.transform = CGAffineTransform(rotationAngle: .pi * -0.5)
self.centerButton.setImage(self.configure.closeImage, for: .normal)
self.menuLayerView.transform = CGAffineTransform(scaleX: 1, y: 1).rotated(by: self.currentAngle)
}
}
func closeMenuView(withAnimate animate: Bool = true) {
openMenu = false
let scale = (configure.centerRadius * 2) / bounds.width
UIView.animate(withDuration: animate ? configure.animationDuration : 0, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 5.0, options: .curveEaseInOut) {
self.centerButton.transform = .identity
self.centerButton.setImage(self.configure.openImage, for: .normal)
self.menuLayerView.transform = CGAffineTransform(scaleX: scale, y: scale).rotated(by: self.currentAngle)
}
}
5.内部细节
考虑到方便布局和使用,内部使用UIView
叠加旋转实现,这里也可以采用Layer
直接绘制实现,相对UIView
,层次结构会简单很多
总结
核心代码已经贴出,完整代码请查看----->>>CLDemo,如果对你有所帮助,欢迎Star。
- 可编程摄影转盘开源设计
- Labview自定义右键快捷菜单功能实用小技巧 26次下载
- 基于单片机及C语言的LCD多级菜单 64次下载
- 基于LCD12864菜单的MCU总体程序下载 35次下载
- 大彩串口屏控件教程10 - 串口屏菜单控件的应用
- 使用单片机设计任意菜单结构的资料和程序免费下载
- 使用NE555和CD4017设计的幸运转盘电路图焊接指导书和物料清单 125次下载
- multisim界面菜单的工具栏的使用和作用详细介绍 31次下载
- IOS面试宝典之Swift 0次下载
- Visual FoxPro使用教程之菜单设计与建立应用程序系统 0次下载
- TI中SWIFT电源芯片系列--慎用PWRGD管脚 19次下载
- Migrating to Swift from Android 0次下载
- SWIFT设计软件工具
- TI SWIFT电源芯片的PWRGD管脚的应用须知
- Allegro软件的菜单功能介绍 0次下载
- STM32CubeMX的菜单介绍 153次阅读
- 一个产品级MCU菜单框架设计 865次阅读
- 基于SpringBoot+Redis的转盘抽奖 1571次阅读
- 【开源小项目】基于STM32的OLED舵机菜单显示 3202次阅读
- 基于二叉树的多层的液晶菜单界面设计 2698次阅读
- PADS在WIN10系统中菜单显示不全怎么解决? 8914次阅读
- win10开始菜单按钮失灵的方法 3218次阅读
- 英创信息技术ARM9 Linux智能终端菜单界面设计介绍 1354次阅读
- PCB设计“幸运转盘” 9836次阅读
- IAR单片机编程软件的菜单栏功能及用法全面介绍 1w次阅读
- 无转盘微波炉工作原理 2.6w次阅读
- Swift 2无人机模块化设计解决方案 1498次阅读
- 多级操作菜单显示系统设计 7472次阅读
- 宏碁Swift 3笔记本评测:全金属+轻薄 2842次阅读
- 基于状态机的LCD多级菜单设计方案 1w次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多