資料介紹
軟件簡(jiǎn)介
前言
使用 Swift 實(shí)現(xiàn)的轉(zhuǎn)盤菜單,主要用到UIBezierPath
、CALayer
遮罩繪制扇形UIView
,CATransform3DMakeRotation
實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫。代碼設(shè)計(jì)使用默認(rèn)configureCallback
回調(diào)方便創(chuàng)建和設(shè)置基本屬性,參考UITableView
代理和數(shù)據(jù)源模式,支持AutoLayout
和Frame
。
效果圖
1.遮罩繪制扇形View
計(jì)算扇形曲線位置,通過(guò)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.旋轉(zhuǎn)動(dòng)畫
添加UIPanGestureRecognizer
、UITapGestureRecognizer
手勢(shì),根據(jù)手勢(shì)位置使用atan2
函數(shù)計(jì)算旋轉(zhuǎn)角度,然后用CATransform3DMakeRotation
圍繞Z
軸旋轉(zhuǎn)做動(dòng)畫 核心代碼
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.彈出收起動(dòng)畫
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)部細(xì)節(jié)
考慮到方便布局和使用,內(nèi)部使用UIView
疊加旋轉(zhuǎn)實(shí)現(xiàn),這里也可以采用Layer
直接繪制實(shí)現(xiàn),相對(duì)UIView
,層次結(jié)構(gòu)會(huì)簡(jiǎn)單很多
總結(jié)
核心代碼已經(jīng)貼出,完整代碼請(qǐng)查看----->>>CLDemo,如果對(duì)你有所幫助,歡迎Star。
- 可編程攝影轉(zhuǎn)盤開源設(shè)計(jì)
- Labview自定義右鍵快捷菜單功能實(shí)用小技巧 26次下載
- 基于單片機(jī)及C語(yǔ)言的LCD多級(jí)菜單 61次下載
- 基于LCD12864菜單的MCU總體程序下載 35次下載
- 大彩串口屏控件教程10 - 串口屏菜單控件的應(yīng)用
- 使用單片機(jī)設(shè)計(jì)任意菜單結(jié)構(gòu)的資料和程序免費(fèi)下載
- 使用NE555和CD4017設(shè)計(jì)的幸運(yùn)轉(zhuǎn)盤電路圖焊接指導(dǎo)書和物料清單 123次下載
- multisim界面菜單的工具欄的使用和作用詳細(xì)介紹 31次下載
- IOS面試寶典之Swift 0次下載
- Visual FoxPro使用教程之菜單設(shè)計(jì)與建立應(yīng)用程序系統(tǒng) 0次下載
- TI中SWIFT電源芯片系列--慎用PWRGD管腳 19次下載
- Migrating to Swift from Android 0次下載
- SWIFT設(shè)計(jì)軟件工具
- TI SWIFT電源芯片的PWRGD管腳的應(yīng)用須知
- Allegro軟件的菜單功能介紹 0次下載
- 伺服電機(jī)編碼器調(diào)零對(duì)位方法 4635次閱讀
- 一個(gè)產(chǎn)品級(jí)MCU菜單框架設(shè)計(jì) 704次閱讀
- 基于SpringBoot+Redis的轉(zhuǎn)盤抽獎(jiǎng) 1341次閱讀
- 【開源小項(xiàng)目】基于STM32的OLED舵機(jī)菜單顯示 2680次閱讀
- 基于二叉樹的多層的液晶菜單界面設(shè)計(jì) 2459次閱讀
- PADS在WIN10系統(tǒng)中菜單顯示不全怎么解決? 8670次閱讀
- win10開始菜單按鈕失靈的方法 3109次閱讀
- 英創(chuàng)信息技術(shù)ARM9 Linux智能終端菜單界面設(shè)計(jì)介紹 1249次閱讀
- PCB設(shè)計(jì)“幸運(yùn)轉(zhuǎn)盤” 9300次閱讀
- IAR單片機(jī)編程軟件的菜單欄功能及用法全面介紹 9773次閱讀
- 無(wú)轉(zhuǎn)盤微波爐工作原理 2.6w次閱讀
- Swift 2無(wú)人機(jī)模塊化設(shè)計(jì)解決方案 1447次閱讀
- 多級(jí)操作菜單顯示系統(tǒng)設(shè)計(jì) 7240次閱讀
- 宏碁Swift 3筆記本評(píng)測(cè):全金屬+輕薄 2463次閱讀
- 基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)方案 1w次閱讀
下載排行
本周
- 1無(wú)鉛焊接的可靠性
- 1.03 MB | 5次下載 | 1 積分
- 2GBT1094.11-2022電力變壓器第11部分:干式變壓器
- 14.12 MB | 3次下載 | 免費(fèi)
- 3PT500齒輪傳動(dòng)動(dòng)力學(xué)綜合測(cè)試實(shí)驗(yàn)臺(tái)
- 0.16 MB | 3次下載 | 免費(fèi)
- 4爬電距離和電氣間隙計(jì)算
- 0.75 MB | 2次下載 | 1 積分
- 5SX1308應(yīng)用電路圖與SX1308升壓電路圖
- 0.18 MB | 1次下載 | 免費(fèi)
- 6ADC參數(shù)單位換算
- 761.94KB | 1次下載 | 免費(fèi)
- 7串口工具UartAssist5.0.exe
- 0.60 MB | 1次下載 | 免費(fèi)
- 8UCC38C42 25瓦自諧振復(fù)位正激變換器
- 320.6KB | 1次下載 | 免費(fèi)
本月
- 1ACDC變換器的原理圖免費(fèi)下載
- 0.26 MB | 65次下載 | 免費(fèi)
- 2無(wú)刷電機(jī)控制方案設(shè)計(jì)合作
- 1.05 MB | 22次下載 | 免費(fèi)
- 3美的超薄電磁爐TM-S1-09B主板原理圖
- 0.08 MB | 20次下載 | 免費(fèi)
- 4純電動(dòng)汽?的主要部件及?作原理
- 5.76 MB | 11次下載 | 5 積分
- 5GP328和GP88S對(duì)講機(jī)的維修實(shí)列資料合集免費(fèi)下載
- 0.03 MB | 10次下載 | 10 積分
- 6舒爾SLX4無(wú)線話筒接收機(jī)原理圖:二次變頻超外差部分
- 0.27 MB | 8次下載 | 免費(fèi)
- 7IP5385_DEMO開發(fā)資料
- 1.96 MB | 7次下載 | 2 積分
- 8i.MX Linux開發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開發(fā)板
- 17.86 MB | 6次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935115次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191363次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183329次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81580次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73805次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評(píng)論
查看更多