資料介紹
軟件簡介
前言
使用 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。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
- 可编程摄影转盘开源设计0次下载
- Labview自定义右键快捷菜单功能实用小技巧27次下载
- 基于单片机及C语言的LCD多级菜单64次下载
- 基于LCD12864菜单的MCU总体程序下载35次下载
- 大彩串口屏控件教程10 - 串口屏菜单控件的应用5次下载
- 使用单片机设计任意菜单结构的资料和程序免费下载3次下载
- 使用NE555和CD4017设计的幸运转盘电路图焊接指导书和物料清单125次下载
- multisim界面菜单的工具栏的使用和作用详细介绍31次下载
- IOS面试宝典之Swift0次下载
- Visual FoxPro使用教程之菜单设计与建立应用程序系统0次下载
- TI中SWIFT电源芯片系列--慎用PWRGD管脚19次下载
- Migrating to Swift from Android0次下载
- SWIFT设计软件工具34次下载
- TI SWIFT电源芯片的PWRGD管脚的应用须知40次下载
- Allegro软件的菜单功能介绍0次下载
- STM32CubeMX的菜单介绍282次阅读
- 伺服电机编码器调零对位方法6343次阅读
- 一个产品级MCU菜单框架设计939次阅读
- 基于SpringBoot+Redis的转盘抽奖1702次阅读
- 【开源小项目】基于STM32的OLED舵机菜单显示3543次阅读
- 基于二叉树的多层的液晶菜单界面设计2893次阅读
- PADS在WIN10系统中菜单显示不全怎么解决?9044次阅读
- win10开始菜单按钮失灵的方法3308次阅读
- 英创信息技术ARM9 Linux智能终端菜单界面设计介绍1418次阅读
- PCB设计“幸运转盘”9963次阅读
- 无转盘微波炉工作原理26906次阅读
- Swift 2无人机模块化设计解决方案1535次阅读
- 多级操作菜单显示系统设计7578次阅读
- 宏碁Swift 3笔记本评测:全金属+轻薄3403次阅读
- 基于状态机的LCD多级菜单设计方案10901次阅读
下載排行
本周
- 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次下載 | 免費
評論