iOS QQ抽屜式導航的實現

QQ個人中心的側滑功能(通常稱為"抽屜式導航")可以通過以下幾種方式在iOS中實現:

主要實現方案

  1. 使用第三方庫

最快速的方式是使用成熟的第三方庫:

  • SWRevealViewController:最流行的側滑菜單庫
  • MMDrawerController:另一個功能豐富的抽屜式導航庫
  • KYDrawerController:輕量級的實現

示例代碼(SWRevealViewController):

// 初始化
let revealViewController = SWRevealViewController(rearViewController: MenuViewController(), frontViewController: MainViewController())// 設置為主窗口根視圖 
window?.rootViewController = revealViewController// 添加手勢 
revealViewController?.tapGestureRecognizer()
revealViewController?.panGestureRecognizer()
  1. 自定義實現

如果需要完全自定義,可以自己實現:

class DrawerController: UIViewController {private var mainViewController: UIViewController!private var menuViewController: UIViewController!private var isMenuOpen = false private let menuWidth: CGFloat = 300init(mainViewController: UIViewController, menuViewController: UIViewController) {self.mainViewController = mainViewController self.menuViewController = menuViewControllersuper.init(nibName: nil, bundle: nil)}override func viewDidLoad() {super.viewDidLoad()addChild(mainViewController)view.addSubview(mainViewController.view)mainViewController.didMove(toParent: self)addChild(menuViewController)view.insertSubview(menuViewController.view, at: 0)menuViewController.didMove(toParent: self)menuViewController.view.frame = CGRect(x: -menuWidth, y: 0, width: menuWidth, height: view.bounds.height)let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))view.addGestureRecognizer(panGesture)}@objc private func handlePanGesture(_ recognizer: UIPanGestureRecognizer) {let translation = recognizer.translation(in: view)switch recognizer.state {case .changed:let newX = mainViewController.view.frame.origin.x + translation.x if newX >= 0 && newX <= menuWidth {mainViewController.view.frame.origin.x = newX menuViewController.view.frame.origin.x = newX - menuWidth }recognizer.setTranslation(.zero, in: view)case .ended:let velocity = recognizer.velocity(in: view)if velocity.x > 0 {openMenu()} else {closeMenu()}default: break}}func openMenu() {UIView.animate(withDuration: 0.3) {self.mainViewController.view.frame.origin.x = self.menuWidthself.menuViewController.view.frame.origin.x = 0}isMenuOpen = true }func closeMenu() {UIView.animate(withDuration: 0.3) {self.mainViewController.view.frame.origin.x = 0self.menuViewController.view.frame.origin.x = -self.menuWidth }isMenuOpen = false}
}

實現要點

  1. 視圖層級:主視圖在上,菜單視圖在下
  2. 手勢處理:需要處理滑動手勢(UIPanGestureRecognizer)
  3. 動畫效果:使用UIView.animate實現平滑過渡
  4. 邊緣手勢:可以添加UIScreenEdgePanGestureRecognizer實現從邊緣滑出的效果
  5. 遮罩效果:QQ通常會在主視圖上添加半透明黑色遮罩

高級優化

  1. 性能優化:使用UIViewPropertyAnimator實現更流暢的交互
  2. 陰影效果:為主視圖添加陰影增加層次感
  3. 狀態保存:記住菜單的打開/關閉狀態
  4. 交互阻斷:菜單打開時阻斷主視圖的交互

SwiftUI實現

如果你使用SwiftUI,可以這樣實現:

struct ContentView: View {@State private var offset: CGFloat = 0 @State private var lastOffset: CGFloat = 0@GestureState private var dragOffset: CGFloat = 0var body: some View {let drag = DragGesture().updating($dragOffset) { value, state, _ instate = value.translation.width}.onEnded { value in withAnimation {if value.translation.width > 100 {offset = 300} else if value.translation.width < -100 {offset = 0 } else {offset = lastOffset }}lastOffset = offset }return ZStack(alignment: .leading) {MenuView().frame(width: 300)MainView().offset(x: max(0, offset + dragOffset)).gesture(drag)}}
}

選擇哪種實現方式取決于你的項目需求和技術棧。第三方庫可以快速實現,自定義實現則更加靈活可控。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82741.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行標簽或列標簽前添加指定前綴的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行標簽或列標簽后添加指定后綴的方法DataFram…

長短期記憶網絡 (LSTM) 詳解:從原理到應用

一、引言&#xff1a;序列數據處理的挑戰? 在自然語言處理、語音識別、時間序列分析等領域&#xff0c;數據通常以序列形式存在&#xff0c;前后數據點之間存在依賴關系。傳統循環神經網絡 (RNN) 雖然能捕捉序列依賴&#xff0c;但存在嚴重的梯度消失 / 爆炸問題&#xff0c;…

三天掌握PyTorch精髓:從感知機到ResNet的快速進階方法論

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。 一、分析式AI基礎與深度學習核心概念 1.1 深度學習三要素 數學基礎&#xff1a; f(x;W,b)σ(Wxb)(單層感知機) 1.2 PyTorch核心組件 張量操作示例…

Linux操作系統概述

一、操作系統的作用 1、五大基本功能 &#xff08;1&#xff09;進程和線程的管理&#xff1a;進程線程的狀態、控制、同步互斥、通信調度等 (2&#xff09;存儲管理&#xff1a;分配/回收、地址轉換、存儲保護等 (3&#xff09;文件管理&#xff1a;文件目錄、文件操作、磁盤…

Python爬蟲第22節- 結合Selenium識別滑動驗證碼實戰

目錄 一、引言 二、滑動驗證碼原理與反爬機制 2.1 驗證碼原理 2.2 反爬機制 三、工程實戰&#xff1a;滑動驗證碼識別全流程 3.1 工程準備 3.1.1 環境依賴 3.1.2 目標網站與驗證碼識別案例 3.2 核心破解流程 3.2.1 自動化打開網頁與登錄 3.2.2 獲取驗證碼圖片&#…

NSSCTF-[NISACTF 2022]huaji?

下載附件得到文件 放到kali里面看看 發現是一張圖片 用binwalk命令對其進行分離 發現需要密碼 用010打開圖片進行查看 對其進行解密 分別得到 ctf_NISA_2022 nisa_2022 發現ctf_NISA_2022是密碼 得到flag NSSCTF{Nls_FumYEnnOjy}

nt!CcGetVacbMiss函數分析之設置好nt!_VACB然后調用函數nt!SetVacb

第一部分&#xff1a;MmMapViewInSystemCache函數返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …

Uniapp+UView+Uni-star打包小程序極簡方案

一、減少主包體積 主包污染源&#xff08;全局文件依賴&#xff09;勁量獨立導入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷&#xff0c;未配置manifest.json中mp-weixin節點 "usingComponents" : true,"lazyCodeLoading" : "requiredC…

Teigha應用——解析CAD文件(DWG格式)Teigha在CAD C#二次開發中的基本應用

Teigha是一款專為開發者設計的工具&#xff0c;其核心技術在于強大的API和豐富的功能集&#xff0c;提供了一系列工具和方法&#xff0c;使開發者能夠輕松地讀取、解析和操作DWG文件。它支持多種操作系統&#xff0c;能在處理大型DWG文件時保持高效性能&#xff0c;還可用于構建…

JavaWeb:SpringBoot Bean管理

獲取Bean Bean作用域 解決循環依賴方式 1.粗暴刪除依賴 2.打破依賴配置 3.使用lazy注解 引入第三方Bean

Lua 腳本在 Redis 中的運用-23(Lua 腳本語法教程)

在 Redis 中編寫和執行 Lua 腳本 Lua 腳本是在 Redis 中執行自定義邏輯的強大功能&#xff0c;可以直接在 Redis 服務器上執行。這減少了延遲&#xff0c;提高了性能&#xff0c;并能夠實現客戶端腳本難以或不可能實現的原子操作。通過在 Redis 中嵌入 Lua 腳本&#xff0c;您…

從零實現本地語音識別(FunASR)

FunASR 是達摩院開源的綜合性語音處理工具包&#xff0c;提供語音識別&#xff08;ASR&#xff09;、語音活動檢測&#xff08;VAD&#xff09;、標點恢復&#xff08;PUNC&#xff09;等全流程功能&#xff0c;支持多種主流模型&#xff08;如 Paraformer、Whisper、SenseVoic…

deepseek開源資料匯總

參考&#xff1a;DeepSeek“開源周”收官&#xff0c;連續五天到底都發布了什么? 目錄 一、首日開源-FlashMLA 二、Day2 DeepEP 三、Day3 DeepGEMM 四、Day4 DualPipe & EPLB 五、Day5 3FS & Smallpond 總結 一、首日開源-FlashMLA 多頭部潛在注意力機制&#x…

【C++ Qt】認識Qt、Qt 項目搭建流程(圖文并茂、通俗易懂)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章將開啟Qt的學習&#xff0c;Qt是一個較為古老但仍然在GUI圖形化界面設計中有著舉足輕重的地位&#xff0c;因為它適合嵌入式和多種平臺而被廣泛使用…

AI應用 Markdown 渲染對比與原生實現方案

DeepSeek、豆包、騰訊元寶、ChatGPT 渲染實現對比表 產品解析方式渲染引擎/庫UI 組件架構Markdown支持范圍流程圖/導圖支持擴展架構及裁剪流式解析渲染DeepSeek原生解析&#xff08;非WebView&#xff09;采用 CommonMark 標準解析器&#xff08;推測使用 Markwon 庫&#xff…

Ubuntu20.04系統安裝,使用系統盤安裝

1、系統安裝 Ubuntu20.04系統安裝&#xff0c;使用系統盤安裝 查看ubuntu系統版本 lsb_release -a&#xff1a;顯示發行版名稱、版本號及代號 (base) rootai-System-Product-Name:/media/ai/wh/clash-for-linux-master# lsb_release -a No LSB modules are available. Distri…

(自用)Java學習-5.19(地址管理,三級聯動,預支付)

1. 地址管理模塊 地址展示 前端&#xff1a;通過 showAddress() 發起 Ajax GET 請求&#xff0c;動態渲染地址列表表格&#xff0c;使用 #{tag}、#{name} 等占位符替換真實數據。 后端&#xff1a; 控制器層調用 AddressService&#xff0c;通過 AddressMapper 查詢用戶地址數…

Spring 循環依賴:從原理到解決方案的全面解析

Spring 循環依賴&#xff1a;從原理到解決方案的全面解析 一、循環依賴的定義與分類 1. 什么是循環依賴&#xff1f; 在 Spring 框架中&#xff0c;循環依賴指的是多個 Bean 之間形成了依賴閉環。例如&#xff1a; Bean A 依賴 Bean BBean B 依賴 Bean CBean C 又依賴 Bean…

n 階矩陣 A 可逆的充分必要條件是 ∣ A ∣ ≠ 0

n 階矩陣 A 可逆的充分必要條件是 ∣ A ∣ ≠ 0 |A| \neq 0 ∣A∣0 的幾何意義 1. 行列式的幾何意義回顧 行列式 ∣ A ∣ |A| ∣A∣&#xff08;或 det ? ( A ) \det(A) det(A)&#xff09;表示矩陣 A A A 所對應的線性變換對空間的體積縮放因子&#xff1a; ∣ A ∣ &…

Rockey Linux 安裝ffmpeg

1.環境準備 Rockey linux 9.2 ffmpeg 靜態資源包 這個是我自己的&#xff1a; https://download.csdn.net/download/liudongyang123/90920340https://download.csdn.net/download/liudongyang123/90920340 這個是官網的 Releases BtbN/FFmpeg-Builds GitHub 以上兩個資…