資料介紹
軟件簡(jiǎn)介
前言
使用 Swift 實(shí)現(xiàn)的轉(zhuǎn)盤菜單,主要用到UIBezierPath
、CALayer
遮罩繪制扇形UIView
,CATransform3DMakeRotation
實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫(huà)。代碼設(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)畫(huà)
添加UIPanGestureRecognizer
、UITapGestureRecognizer
手勢(shì),根據(jù)手勢(shì)位置使用atan2
函數(shù)計(jì)算旋轉(zhuǎn)角度,然后用CATransform3DMakeRotation
圍繞Z
軸旋轉(zhuǎn)做動(dòng)畫(huà) 核心代碼
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)畫(huà)
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)盤開(kāi)源設(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)書(shū)和物料清單 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次閱讀
- 【開(kāi)源小項(xiàng)目】基于STM32的OLED舵機(jī)菜單顯示 2680次閱讀
- 基于二叉樹(shù)的多層的液晶菜單界面設(shè)計(jì) 2459次閱讀
- PADS在WIN10系統(tǒng)中菜單顯示不全怎么解決? 8670次閱讀
- win10開(kāi)始菜單按鈕失靈的方法 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山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多