資料介紹
軟件簡介
前言
使用 Swift 實現(xiàn)的轉盤菜單,主要用到UIBezierPath
、CALayer
遮罩繪制扇形UIView
,CATransform3DMakeRotation
實現(xiàn)旋轉動畫。代碼設計使用默認configureCallback
回調(diào)方便創(chuàng)建和設置基本屬性,參考UITableView
代理和數(shù)據(jù)源模式,支持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
手勢,根據(jù)手勢位置使用atan2
函數(shù)計算旋轉角度,然后用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.內(nèi)部細節(jié)
考慮到方便布局和使用,內(nèi)部使用UIView
疊加旋轉實現(xiàn),這里也可以采用Layer
直接繪制實現(xiàn),相對UIView
,層次結構會簡單很多
總結
核心代碼已經(jīng)貼出,完整代碼請查看----->>>CLDemo,如果對你有所幫助,歡迎Star。
- 可編程攝影轉盤開源設計
- Labview自定義右鍵快捷菜單功能實用小技巧 26次下載
- 基于單片機及C語言的LCD多級菜單 61次下載
- 基于LCD12864菜單的MCU總體程序下載 35次下載
- 大彩串口屏控件教程10 - 串口屏菜單控件的應用
- 使用單片機設計任意菜單結構的資料和程序免費下載
- 使用NE555和CD4017設計的幸運轉盤電路圖焊接指導書和物料清單 123次下載
- multisim界面菜單的工具欄的使用和作用詳細介紹 31次下載
- IOS面試寶典之Swift 0次下載
- Visual FoxPro使用教程之菜單設計與建立應用程序系統(tǒng) 0次下載
- TI中SWIFT電源芯片系列--慎用PWRGD管腳 19次下載
- Migrating to Swift from Android 0次下載
- SWIFT設計軟件工具
- TI SWIFT電源芯片的PWRGD管腳的應用須知
- Allegro軟件的菜單功能介紹 0次下載
- 伺服電機編碼器調(diào)零對位方法 4635次閱讀
- 一個產(chǎn)品級MCU菜單框架設計 704次閱讀
- 基于SpringBoot+Redis的轉盤抽獎 1341次閱讀
- 【開源小項目】基于STM32的OLED舵機菜單顯示 2680次閱讀
- 基于二叉樹的多層的液晶菜單界面設計 2459次閱讀
- PADS在WIN10系統(tǒng)中菜單顯示不全怎么解決? 8670次閱讀
- win10開始菜單按鈕失靈的方法 3109次閱讀
- 英創(chuàng)信息技術ARM9 Linux智能終端菜單界面設計介紹 1249次閱讀
- PCB設計“幸運轉盤” 9300次閱讀
- IAR單片機編程軟件的菜單欄功能及用法全面介紹 9773次閱讀
- 無轉盤微波爐工作原理 2.6w次閱讀
- Swift 2無人機模塊化設計解決方案 1447次閱讀
- 多級操作菜單顯示系統(tǒng)設計 7240次閱讀
- 宏碁Swift 3筆記本評測:全金屬+輕薄 2463次閱讀
- 基于狀態(tài)機的LCD多級菜單設計方案 1w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 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開發(fā)指南
- 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數(shù)字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設計》 溫德爾著
- 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次下載 | 免費
評論
查看更多