剖析Path侧边栏抽屉效果原理(抽屉效果,Path效果)

抖音小游戏侧边栏复访功能接入指南:Cocos Creator实现与审核避坑 在移动小游戏开发中,提升用户留存率是核心目标之一。其原理在于通过轻量化技术手段降低用户回访成本,从而优化关键数据指标。侧边栏复访功能正是实现这一目标的重要技术方案,它允许用户在无需重启完整游戏的情况下,通过平台侧边栏快速返回并完成特定操作。从技术价值看,该功能能有效提升次日留存与七日留存,尤其适用于模拟经营、放置养成等具有等待机制的游戏类型。在应用场景上,开发者需在游戏主逻辑中调用平台API设置入口,并准备独立的复访页处理业务逻辑。本文以Cocos Creator引擎为例,详细解析了如何接入抖音小游戏的侧边 阅读详情

 如今很多App应用,都用到了侧边栏的效果,比如网易新闻(还带有偏移缩小),今日头条(普遍这种),Path(最先应用这种抽屉效果,所以这种效果也叫Path效果),code4App上已经有很多网友写的第三方侧边栏类,大家可以直接拿来用.这里我主要的是介绍一下这种效果的实现原理,涉及了几个知识点,在其他地方也能用到.

            UINavigationController和UITabBarController是2个主要的视图控制容器,都有属性viewControllers,能够很好地管理多个视图控制器.但有的时候,系统给的有很大的局限性,我们做效果,更多是基于系统UI,自定义很多的控件.就拿侧边栏效果举例,表面上看上去,它只有3个UIViewController,left-mid-right,中间的minViewController作为根控制器.其实,不是的,有4个,应该还有一个RootViewController,作为管理它们的视图控制容器,它的作用,就像UITabBarController,只做管理那3个视图控制器之用,并不参与任何子ViewController的视图,数据的操作.

           这里,又要讲一下UIView和UIViewController的关系了.UIView(视图)在展示用户界面和响应用户界面交互方面起很重要的作用,我们所看到的内容,都是通过视图展示给我们的,属于MVC中的V.而UIViewController(视图控制器),保存所管理视图的引用,协调Model和View之间的数据,通常作为委托或者数据源,简而言之就是实现数据操纵的地方.为什么要讲这个呢?因为我有朋友,直接在一个RootViewController加了3个UIView,我就说他,你干嘛不用UIViewController,他说你那不是控制器嘛,又不是视图.....晕倒,每个UIViewController都有自己管理的view,直接.view不就出来了嘛.

           不仅仅是侧边栏是这样,网易App主界面标签控制的内容也是这样,标签"头条"-"娱乐"-"体育"-"财经"-"科技"等等,其实每个都是对应了一个UIViewController,而不是UITableView,MVC的本意就是M和V不交互,数据的操作还是要放在controller中的,利用iOS5新出的属性addChildViewController,这样就不需要在一个controller处理所有的标签内容,而是将不同数据的处理各自对应一个viewController,一个主UIViewController用来做控制作用(额,是不是有点混乱,没关系,我在下一章会将网易标签栏对应各个内容的功能剖析出来)


@展示主要代码:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  2. {  
  3.     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  
  4.     // Override point for customization after application launch.  
  5.     self.window.backgroundColor = [UIColor whiteColor];  
  6.       
  7.     DNWLeftViewController * leftVC = [[DNWLeftViewController alloc] init];  
  8.     //UINavigationController * leftNC = [[UINavigationController alloc] initWithRootViewController:leftVC];  
  9.       
  10.     DNWRightViewController * rightVC = [[DNWRightViewController alloc] init];  
  11.     //UINavigationController * rightNC = [[UINavigationController alloc] initWithRootViewController:rightVC];  
  12.   
  13.     DNWMidViewController * midVC = [[DNWMidViewController alloc] init];  
  14.     UINavigationController * midNC = [[UINavigationController alloc] initWithRootViewController:midVC];  
  15.       
  16.       
  17.     DNWRootViewController * rootVC = [[DNWRootViewController alloc] init];  
  18.     //UINavigationController * rootNC = [[UINavigationController alloc] initWithRootViewController:rootVC];  
  19.     rootVC.leftViewController = leftVC;  
  20.     rootVC.rightViewController = rightVC;  
  21.     rootVC.midViewController = midNC;  
  22.       
  23.     self.window.rootViewController = rootVC;  
  24.       
  25.     [self.window makeKeyAndVisible];  
  26.     return YES;  
  27. }  

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view.  
  5.   
  6.     /** 
  7.      *  1.加载视图的顺序,中间视图放在最后加,因为程序一开始它要显示在最上面 
  8.      *  2.所有ViewController的View如果不设置的话,默认全屏大小(标签栏展示效果的话,所有的ViewController都是标签栏以下大小) 
  9.      *  3.这里的self-->RootViewController,不要设置为导航控制器 
  10.      *  4.只做视图切换,不做其他任何数据操作 
  11.      *  5.手势切换,原理一样,自己可以加上,点击或者拖拉都想,这个我就不在这里描述了 
  12.      *   
  13.      */  
  14.     [self addChildViewController:self.leftViewController];  
  15.     [self.view addSubview:self.leftViewController.view];  
  16.       
  17.     [self addChildViewController:self.rightViewController];  
  18.     [self.view addSubview:self.rightViewController.view];  
  19.       
  20.     [self addChildViewController:self.midViewController];  
  21.     [self.view addSubview:_midViewController.view];  
  22.       
  23.     UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeSystem];  
  24.     leftButton.frame = CGRectMake(0, 20, 40, 40);  
  25.     [leftButton setTitle:@"left" forState:UIControlStateNormal];  
  26.     [leftButton addTarget:self action:@selector(didClickLeftBarButtonAction:) forControlEvents:UIControlEventTouchUpInside];  
  27.     [self.midViewController.view addSubview:leftButton];  
  28.       
  29.     UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeSystem];  
  30.     rightButton.frame = CGRectMake(280 ,20, 40, 40);  
  31.     [rightButton setTitle:@"right" forState:UIControlStateNormal];  
  32.     [rightButton addTarget:self action:@selector(didClickRightBarButtonAction:) forControlEvents:UIControlEventTouchUpInside];  
  33.     [self.midViewController.view addSubview:rightButton];  
  34. }  
  35.   
  36. //  网易侧边栏效果  
  37. - (void)didClickLeftBarButtonAction:(UIBarButtonItem *)leftButton{  
  38.   
  39.     //  用这个判断条件是为了左边视图出来后,再点击按钮能够回去  
  40.     if (self.midViewController.view.frame.origin.x == 0) {  
  41.           
  42.         [UIView animateWithDuration:0.3 animations:^{  
  43.             //  ScreenWidth  ScreenHeight  屏幕实际大小宏  
  44.             self.leftViewController.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);  
  45.             //  也可以通过这种方式来实现  
  46.             //self.midViewController.view.transform = CGAffineTransformTranslate(self.midViewController.view.transform, 280,64 );  
  47.             self.midViewController.view.frame = CGRectMake(280, 64, ScreenWidth, ScreenHeight-64*2);  
  48.             self.rightViewController.view.frame = CGRectMake(280, 64, ScreenWidth, ScreenHeight-64*2);  
  49.               
  50.         } completion:^(BOOL finished) {  
  51.         }];  
  52.           
  53.     }else{  
  54.           
  55.         [UIView animateWithDuration:0.3 animations:^{  
  56.               
  57.             self.midViewController.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);  
  58.             self.rightViewController.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);  
  59.               
  60.         } completion:^(BOOL finished) {  
  61.         }];  
  62.     }  
  63.   
  64.       
  65. }  
  66.   
  67. //  标准侧边栏效果  
  68. - (void)didClickRightBarButtonAction:(UIBarButtonItem *)rightButton{  
  69.       
  70.     if (_midViewController.view.frame.origin.x == 0) {  
  71.           
  72.         [UIView animateWithDuration:1.1 animations:^{  
  73.               
  74.             _midViewController.view.frame = CGRectMake(-280, 0, ScreenWidth, ScreenHeight);  
  75.             _rightViewController.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);  
  76.               
  77.         } completion:^(BOOL finished) {  
  78.               
  79.         }];  
  80.           
  81.     }else{  
  82.           
  83.         [UIView animateWithDuration:1.1 animations:^{  
  84.               
  85.             _midViewController.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);  
  86.             _rightViewController.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);  
  87.               
  88.         } completion:^(BOOL finished) {  
  89.               
  90.         }];  
  91.     }  
  92. }  
【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库01 此方案可满足千万级并发需求,同时支持时序数据、知识图谱和文档数据库的高效处理,通过云原生架构实现极致弹性。​:每月约$15-20万(100节点K8s集群+数据库集群+CDN流量)1. 宠物上架/下架流程。 阅读详情

相关推荐

Qt实现VS右侧抽屉样式(VS里右侧停靠板)

使用Qt4.7实现在QMainWindow中基于QDockWidget形成的QTabBar的类似VS右侧抽屉样式

[零基础][完结]vue后台管理系统开发流程全记录(四)_侧边栏实现原理及配置 | 路由配置

项目本身带有一个侧边栏,点击可以跳转到预制好的默认页面,但这不是我们需要的,我们首先的任务是更改侧边栏内容,再让它指向我们自己的页面。

技术圈 1281

QT实现抽屉效果

QToolBox很好的实现了抽屉效果还有唯美的扁平化设置风格。

侧边栏抽屉控件,点击按钮在上下左右弹出窗口

# CDrawer.py #!/usr/bin/env python # -*- coding: utf-8 -*- from PySide2.QtCore import Qt, QPropertyAnimation, QEasingCurve, QPoint, QPointF from PySide2.QtGui import QMouseEvent from PySide2.QtWidgets import QWidget, QApplication class CDrawer(QWidget):

weixin_43956958的博客 1591

CrewAI 多 Agent 实战包 v1(Mock免Key跑通+通义千问可选+流水线样例)

本资源是 CrewAI 风格多 Agent 可运行工程包:研究→写作→审校等流水线样例。无 API Key 时自动降级 Mock 引擎跑通;有 DASHSCOPE_API_KEY 时可接真实 CrewAI + 通义千问。含中文 README、samples、smoke 留档、单元测试。本包不含密钥。关联博客:https://blog.youkuaiyun.com/mtl1994

相控阵多功能雷达工作模式识别技术综述

本文综述了相控阵雷达工作模式识别技术的研究进展。首先介绍了相控阵雷达的典型工作模式分类及其信号特征参数,包括搜索模式(VS、RWS、TWS)、跟踪模式(STT、MTT、TAS)和其他模式(SAM、SAR)等。随后重点阐述了基于信号特征的识别方法,包括时域特征(PRI分析、脉冲幅度包络、数据率)、频域特征(载频变化、调制方式)和混合特征分析方法。最后讨论了当前技术面临的挑战与发展趋势,包括复杂信号环境下的识别难题、新型雷达技术的适应需求以及深度学习技术的应用前景。该领域的研究对电子侦察和威胁评估具有重要意义。

Grow into a more wonderful you 1795

Qt--自定义抽屉盒子控件

一、前言 因项目需求,需要用到类似于抽屉的控件,归类摆放不同的器件,熟悉Qt的朋友一定马上联想到了QToolBox,我一开始也是这么做的,但是QToolBox有个弊端:它同一时刻只能打开一个抽屉,即抽屉间是互斥的关系。虽然能满足归类的需求,但是实际使用过程中很不便利,我希望能同时打开多个抽屉,抽屉的开关由我自己控制,实现真正的自由。 二、思路 采用QWidget::setVisible(bool)来选择是否显示控件 每添加一个抽屉,就创建一个按钮和一个widget,然后对按钮和widget进去垂直布局,例

贝勒里恩的博客 7071

生物信息学新手必备:5分钟搞定GEO补充数据下载(含西柚云代理配置)

本文为生物信息学新手提供了快速下载GEO数据库补充数据的完整方案。核心在于解析GEO文件存储逻辑,构造正确的FTP下载链接,并利用云端代理服务(如西柚云)解决国内访问NCBI速度慢、易中断的问题。通过分步教程,用户无需命令行即可在5分钟内稳定获取大型测序文件,极大提升数据获取效率。

weixin_28314575的博客 637

侧边栏原理

<script type="text/javascript"> window.onload = function() { var oSide = document.getElementById('side'); oSide.onmousemove = function() { leftMove(); } oSide.onmouseout= function()

诸葛苍穹 638

视觉辅助RIS波束追踪:用摄像头“看见”用户,实现毫秒级波束对准

在无线通信领域,波束成形技术是提升高频段信号覆盖与质量的核心手段,其原理是通过调整天线阵列的相位,使信号能量在特定方向相干叠加,形成高增益定向波束。这项技术的价值在于能有效克服高频信号路径损耗大、穿透性差的瓶颈,广泛应用于5G/6G、毫米波通信及室内定位等场景。然而,传统波束追踪依赖信道估计或波束扫描,存在训练开销大、实时性差的问题。本文聚焦于一种创新解决方案:将计算机视觉与可重构智能表面(RIS)相结合。通过摄像头直接感知用户位置,并利用RIS快速重构反射波束方向,实现了近乎零开销、毫秒级延迟的波束追踪,

weixin_33552698的博客 620

从零到一:Livox Mid-360 激光雷达的硬件集成与避坑实战

本文详细介绍了Livox Mid-360激光雷达的硬件集成全流程,包括硬件准备、网络配置、驱动编译和常见问题解决方案。通过实战经验,帮助开发者高效完成从设备拆箱到数据输出的完整链路,避免在IP设置、驱动编译和固件兼容性等环节踩坑。

salt的博客 1028

Android模糊效果深度解析:BlurView架构设计与性能优化实战

Android模糊效果作为现代移动应用UI设计的关键技术,能够显著提升界面视觉层次感和用户体验。BlurView开源库为开发者提供了完整的模糊效果解决方案,支持多种模糊算法和实时更新模式,帮助开发者轻松实现iOS风格的毛玻璃效果。本文将深入分析BlurView的技术架构、核心算法实现、性能优化策略以及实际应用场景,为有经验的开发者和技术决策者提供全面的技术参考。 ## 技术背景与架构设计 ##

gitblog_00490的博客 398

GLDAS数据高效处理指南:基于Matlab的NC4转GeoTIFF实战解析

本文提供了一份基于Matlab的GLDAS数据处理实战指南,详细解析了如何将NetCDF4格式的GLDAS数据高效、准确地批量转换为GIS友好的GeoTIFF格式。文章核心内容包括数据理解、环境搭建、核心代码逐步拆解、效率提升技巧以及常见避坑方案,旨在帮助全球生态、水文与气候领域的研究者打通数据预处理的关键环节,提升科研工作效率。

weixin_29094775的博客 311

一个很简单的侧边栏导航实现

一个简单的sidebar的小例子。在实习的项目中,有一个重要的UI部分就是一个sidebar.之前一直很想自己能够重构这一部分,但是无论是参考项目代码还是到GitHub上的代码,我都感觉到很吃力。因为大部分设计到很多跳转,让我一下子很难理清楚。五一的时候重新整理了下写代码的思路,觉得要自己先理清楚基本的过程,写每一个方法前都要明白这个方法要达到什么样的功能。今天花了一上午参考了一个GitHub的样例

之行的专栏 1万+

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 904

ASM准入小助手卸载没有密码的方法:读取明文密码2024年7月有效

在一次工作过程中,电脑中意外的安装了一个ASM准入小助手软件,工作结束以后回来发现没有卸载,然后就决定把它卸载掉,但是居然给了我一个大大的提示框:由于联系不到当时给我安装的那个人了,所以一时陷入了焦灼的状态,因为我安装另一个终端准入,会直接提示冲突了。所以经过注册表(regedit)、任务管理器等各种折腾之后,最后都失败了,然后想起了多年前在吾爱论坛学到过的东西,最后意外的找到了密码,然后就完美成功卸载了。

布啦啦 7804

可折叠侧边栏菜单

在线演示 本地下载

weixin_34248849的博客 1215

使用 Visual Studio Code 连接 ABAP On-Premise 系统做开发的详细配置步骤

本文详细介绍了如何在Visual Studio Code中通过ABAP Development Tools扩展连接ABAP On-Premise系统。关键步骤包括:通过Ctrl+Shift+P打开命令行面板选择「ABAP: New Destination...」创建RFC连接(仅支持SSO单点登录),选择本地SAPGUI中已有的系统,输入Client ID、语言和用户名(无需密码),最后将目标系统添加到工作区即可开始开发。文章强调了企业安全考虑下仅支持SSO的设计理念,并展示了连接配置的JSON格式示例。整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 985

Qt基础学习(5)-----抽屉效果之QToolBox

//mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include class QToolBox; class MyDialog : public QDialog { Q_OBJECT public: explicit MyDialog(QWidget *parent = 0); signals: public s

代码人生 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

左侧抽屉视图效果的实现

#import "ViewController.h" #import "LeftView.h" @interface ViewController () @property (nonatomic, weak) LeftView *leftView; @property (nonatomic, assign) BOOL slideL

baidu_25845567的博客 1156

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

微信小程序开发教程-抽屉菜单

抽屉菜单是app上常见的菜单设计方式,典型的抽屉菜单如下图所示下面展示如何基于微信小程序实现抽屉菜单,最终效果如下图所示: 页面包含一个主页和抽屉菜单页,为了实现滑动效果,页面采用absolute布局,代码如下 index.wxml<view id='id-main-page' class='main-page' animation='{{animationData}}' style='left

crazytea的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Qt 侧边栏

通过QToolButton来实现侧边栏,或者说侧边工具栏,可以通过接口直接自由添加按钮,可以设置工具按钮对应的QWidget,进而点击不同的按钮可以显示不同的QWidget。 实现代码: #ifndef QSIDEBAR_H #define QSIDEBAR_H #include #include #include #include #include class QSid

GreenArrowMan-优快云博客 8668

git开源库——视图控件——左侧抽屉侧边栏

1、MaterialDrawer 提供了各种Material风格的侧边栏 GitHub: https://github.com/mikepenz/MaterialDrawer

xzgww0902的专栏 1303

Qt中使用QToolBox实现抽屉效果

#ifndef DRAWER_HPP #define DRAWER_HPP #include #include #include "listwidget.hpp" #include "listwidgetitem.hpp" class Drawer : public QToolBox { Q_OBJECT public: Drawer(const QIcon &iconOp

周翔的专栏 1万+
上一篇: iOS开发之邮件发送
下一篇: 从下往上增加的柱状图生成动画(适用于统计类应用)
SMY_API
博客等级 码龄13年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值