iOS界面-抽屉式交互

iOS和Unity交互之界面跳转 本文介绍了iOS和Unity交互,主要涉及两个界面之间的跳转. 如果对iOS和Unity交互传参方法不熟悉的朋友,可以参考我的另一篇文章 iOS和Unity交互之参数传递 一.程序启动入口. main.mm了解OC或者C的朋友一定知道main方法,这是整个程序的入口.以下是Unity转iOS工程后的main文件中的部分代码.const char* AppControllerClassNam 阅读详情

iOS界面-抽屉式交互

1、介绍

用过网易新闻客户端的同学都会发现,网易新闻向左滑动时,左侧的导航栏会跟着拖动出来,新闻内容列表会拉到最右侧。像一个抽屉拉出来一样。很酷。除了网易新闻,现在好多应用都采用了这样的交互。

对手势识别不熟悉的请参考上篇: iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

这个交互效果主要用到两个手势,一个是pan拖拽,一个是tap点击。拖拽可以把抽屉拉出来,再推回去。点击可以把抽屉推回去。

效果如下:XCode学习随笔03--iOS界面-抽屉式交互

那么这个效果如何实现呢?


2、实现思路和步骤

思路:从实现的效果分析出来,可以这样实现:

这个交互是由两个View组成,左侧导航的View在下面,显示内容列表的View在上面,内容列表的View覆盖住了导航View,拖动内容列表的View向右,这时候导航View就显示出来了。

实现步骤:

  1. 自定义一个View,它做为显示内容的View。给这个View添加两个手势,pan拖拽,tap点击。
  2. 当拖拽这个View时,让view.center向右移动,这样就能看到内容View向右移动了。
  3. 定义一个抽屉打开停止时的x值为:OPENCENTERX,这个是内容View最终停止的位置
  4. 当内容View越过中间靠右的一个x值时,view自动向右动画移动到右边位置停下。
  5. 当内容View在打开的状态下,点击内容View,利用UIView动画把内容View.center移动回到中间。
  6. 设置内容View的阴影效果


3、代码实现

新建CustomView继承UIView

#import

@interface CustomView : UIView
{
    CGPointopenPointCenter;
    CGPointclosePointCenter;
}
-(id)initWithView:(UIView*)contentview parentView:(UIView*)parentview;

@property (nonatomic, strong) UIView *parentView; //抽屉视图的父视图
@property (nonatomic, strong) UIView *contenView; //抽屉显示内容的视图
@end


两个手势在Custom里实现,并在初始化的时候传入内容View和父视图。

#import"CustomView.h"

#define OPENCENTERX220.0
#define DIVIDWIDTH 70.0//OPENCENTERX 对应确认是否打开或关闭的分界线。

@implementationCustomView

-(id)initWithFrame:(CGRect)frame
{
   self = [super initWithFrame:frame];
   if (self) {
       // Initialization code
   }
   return self;
}

- (id)initWithView:(UIView*)contentview parentView:(UIView *)parentview
{
   self = [superinitWithFrame:CGRectMake(0,0,contentview.frame.size.width,contentview.frame.size.height)];
   if (self) {
       self.contenView = contentview;
       self.parentView = parentview;
       
       [self addSubview:contentview];
       UIPanGestureRecognizer *panGestureRecognizer =[[UIPanGestureRecognizer alloc]
                                                       initWithTarget:self
                                                       action:@selector(handlePan:)];
       [self addGestureRecognizer:panGestureRecognizer];
       
       UITapGestureRecognizer *tapGestureRecognizer =[[UITapGestureRecognizer alloc]
                                                       initWithTarget:self
                                                       action:@selector(handleTap:)];


       [self addGestureRecognizer:tapGestureRecognizer];
       openPointCenter = CGPointMake(self.parentView.center.x +OPENCENTERX,
                                     self.parentView.center.y);
       
       NSLog(@"openPointCenter x:%f, openPointCentery:%f",
             openPointCenter.x,
             openPointCenter.y);
   }
   return self;
}

-(void)handlePan:(UIPanGestureRecognizer*) recognizer
{
   CGPoint translation = [recognizertranslationInView:self.parentView];
   
   float x = self.center.x + translation.x;
   NSLog(@"translation x:%f", translation.x);
 
   if (x < self.parentView.center.x) {
       x = self.parentView.center.x;
   }
   self.center = CGPointMake(x, openPointCenter.y);
   
   if(recognizer.state ==UIGestureRecognizerStateEnded)
   {
           [UIView animateWithDuration:0.75
                                 delay:0.01
                               options:UIViewAnimationCurveEaseInOut
                            animations:^(void)
           {
               if (x > openPointCenter.x - DIVIDWIDTH) {
                   self.center = openPointCenter;
               }else{
                   self.center = CGPointMake(openPointCenter.x -OPENCENTERX,
                                             openPointCenter.y); 
               }
           }completion:^(BOOL isFinish){ 
           }];
       }
   [recognizer setTranslation:CGPointZeroinView:self.parentView];
}

-(void)handleTap:(UITapGestureRecognizer*) recognizer
{
   [UIView animateWithDuration:0.75
                         delay:0.01
                       options:UIViewAnimationTransitionCurlUpanimations:^(void){
                           self.center = CGPointMake(openPointCenter.x -OPENCENTERX,
                                                     openPointCenter.y);
   }completion:nil];
}
@end


4、viewController的调用

为了实现自定义视图的阴影,添加需要使用QuartzCore框架。在项目里添加QuartzCore框架后引入头文件。

-(void)viewDidLoad
{
   [super viewDidLoad];
   
   CGRect rect = CGRectMake(0, 0,
                            self.view.frame.size.width,
                            self.view.frame.size.height);
   NSLog(@"w:%f, h:%f", rect.size.width,rect.size.height);
   UIImageView *imageleft = [[UIImageView alloc]initWithImage:[UIImageimageNamed:@"left.png"]];
   imageleft.frame = rect;
   [self.view addSubview:imageleft];
   
   UIView *contentView = [[UIView alloc]initWithFrame:rect];
   
   UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImageimageNamed:@"index.png"]];
   imageView.frame = rect;
   [contentView addSubview:imageView];

   CustomView *customView = [[CustomView alloc]initWithView:contentView
                                                  parentView:self.view];
   [[customView layer] setShadowOffset:CGSizeMake(10,10)];
   [[customView layer] setShadowRadius:20];
   [[customView layer] setShadowOpacity:1];
   [[customView layer] setShadowColor:[UIColorblackColor].CGColor];
   
   [self.view addSubview:customView];
}

9、iOS 应用基础交互与界面控件开发指南 本博客详细介绍了iOS应用开发中的基础交互与界面控件实现方法。内容涵盖按钮点击事件处理、标签文本更新、NSAttributedString样式应用、应用委托的生命周期管理,以及多种界面控件(如滑块、开关、分段控件、按钮等)的交互逻辑。通过实例演示了复杂界面的构建与交互流程,并提供了代码示例与流程图帮助开发者深入理解iOS应用开发的核心概念与实践技巧。 阅读详情

相关推荐

10、iOS 应用界面交互开发指南

本博客详细介绍了iOS应用界面交互开发的全过程,包括添加输出口和动作方法、布局和连接界面元素(如分段控件、开关和按钮),以及实现动作表单和警报视图的用户反馈机制。同时,还涵盖了代码可读性、内存管理和用户体验优化等方面的实践建议,帮助开发者构建功能完善且用户友好的iOS应用。

s8t9u0v1w的博客 46

App主界面交互框架(其中包括标签式、跳板式、列表式、旋转木马、抽屉式、点聚式、陈列馆式、瀑布流)

App主界面交互框架(其中包括标签式、跳板式、列表式、旋转木马、抽屉式、点聚式、陈列馆式、瀑布流)

AFun_day的博客 8915

12、iOS 应用界面交互功能实现指南

本博客详细介绍了如何在iOS应用中实现基本的界面交互功能,包括文本框编辑完成后的键盘关闭、触摸背景隐藏键盘、滑块与标签的动态交互,以及使用Auto Layout添加约束来适配不同屏幕尺寸。此外,还探讨了优化标签大小、拓展其他控件(如按钮和分段控件)的交互功能,旨在提升用户界面的友好性和应用的可用性。

book8的博客 52

开源分享:TTS-Web-Vue系列:抽屉式布局与交互体验优化

抽屉式布局的实现是TTS-Web-Vue界面设计的一次重大飞跃,它彻底改变了用户与应用交互的方式。通过将设置选项移至侧边抽屉,我们不仅提供了更加清晰、高效的操作界面,还在根本上解决了传统TTS工具在处理大段文本时的操作痛点。这一设计充分体现了现代Web应用的交互理念——将界面简化到最低限度,让用户专注于核心任务,同时又能轻松访问所有功能选项。我们相信,这种以用户为中心的设计思维,将引领TTS-Web-Vue在未来的发展中继续创新,为用户带来更加卓越的使用体验。

hujian401387616的博客 1309

7、iOS界面交互开发指南

本博客详细介绍了在iOS应用开发中如何使用Xcode设计用户界面并实现基本的交互功能。内容包括添加按钮和标签、创建动作方法和出口、自动引用计数(ARC)的使用、动作方法的编写,以及代码优化和功能扩展的思路。同时探讨了性能优化的相关注意事项,如内存管理和响应性能问题。通过本博客的学习,开发者可以掌握iOS界面交互开发的基本流程,并具备进一步扩展应用功能的能力。

info6的博客 46

8、iOS 应用开发:基础交互与界面控制详解

本博客详细介绍了iOS应用开发中的基础交互与界面控制实现,包括按钮点击事件处理、NSAttributedString样式添加、应用委托的作用与实现、以及复杂界面控件的交互逻辑。通过具体代码示例,讲解了如何构建和控制图像视图、滑块、分段控件、开关和按钮等常用控件,并深入探讨了主动模式、静态模式和被动模式的使用场景。最后总结了整个开发流程,并展望了进一步学习的方向。

brown的博客 117

抽屉式侧滑布局交互示例,应用更加高炫拽!

此分享是对官网不久前上线的 api.openDrawerLayout( 抽屉式侧滑 window 布局 )方法做了一个简单的实例,基于这个简单的布局大家可以在这之上再去做更复杂的布局交互,或者直接使用这个到你的应用当中,让你的应用更加的高炫拽。1../index.html我这里并没有在 index.html 初始时完成以后立马布局侧滑,原因是我得给大家演示了关闭侧滑的方法,而实际我们为了应用体验更...

rachel_4869的博客 1423

8、构建iOS应用界面:从位置模拟到多彩交互

本文详细介绍了如何在iOS应用开发中构建丰富的用户界面,涵盖位置模拟、RGB颜色混合器实现以及使用UIAlertController创建警告视图和操作表等核心技术。通过Xcode的Interface Builder与Swift代码结合,逐步演示界面搭建、约束设置、控件交互与逻辑实现,帮助开发者掌握实际开发中的常见功能与问题解决方案,提升对iOS界面构建的整体理解与实践能力。

silver的专栏 55

弹窗、抽屉、页面跳转区别 | web交互入门

当用户点击或触发浏览页面的某个操作,有很多web交互方式,可以大致分为弹窗、抽屉、跳转新页面三种web交互方式。虽然这三种web交互方式看起来没什么不同,但实际上弹窗、抽屉、跳转新页面对交互体验有蛮大的影响。

l1m0_的博客 2694

10、iOS 开发:基础交互与界面控件详解

本博客详细解析了iOS开发中的基础交互与界面控件使用,包括按钮布局调整、文本样式设置、应用程序委托的作用、多种界面控件的实现模式,以及操作表与警报的使用方法。通过实例代码和流程图展示了交互逻辑的构建,帮助开发者掌握构建复杂iOS应用程序的核心技能。

blue42的博客 118

11、iOS应用界面交互与提示组件开发指南

本博客详细介绍了iOS应用中常见的界面交互与提示组件的开发方法,包括滑块、标签、开关、按钮、分段控件、动作表和警报的实现步骤。通过具体的代码示例和操作流程,帮助开发者快速掌握如何构建用户友好、交互性强的iOS应用界面,并提供了代码优化和功能扩展的建议。

nice1的博客 62

总结Swift语言在iOS开发界面交互中的运用技巧

Swift语言在iOS开发界面交互中应用广泛,从基础的视图创建与布局,到复杂的手势识别、交互逻辑处理以及动画效果实现,掌握这些技巧能打造出优质、用户体验良好的iOS应用。通过SnapKit,只用简洁的几行代码就能实现标签在父视图中心的布局,比传统的Auto Layout代码更易读、易维护。在上述代码中,先实例化一个UIButton,设置其标题、位置、大小,并添加点击事件的响应方法,最后将按钮添加到视图中。对于复杂的界面交互,如图片缩放、拖拽等,需要结合多种手势和视图动画。一、视图的创建与布局。

wenlong5o02的博客 399

8、iOS 应用开发:基础交互与用户界面进阶

本博客深入讲解了iOS应用开发中的基础交互与用户界面进阶内容,涵盖从基础测试、应用委托解析到多种控件的使用技巧。通过构建简单和复杂的应用实例,详细介绍了MVC模式、控件的三种使用模式(主动、静态、被动)、Interface Builder操作、图像视图、滑块、文本字段、分段控件、开关、按钮以及操作表和警报的实现方式。同时提供了详细的代码示例和开发注意事项,帮助开发者掌握iOS界面交互的核心技能。

nice1的博客 125

IOS抽屉效果的Demo

IOS 5.0 中实现的抽屉效果 的demo

掌握Android界面交互:抽屉、Fragment与滑动视图

抽屉菜单(Navigation Drawer)是Android应用中一种常见的侧滑菜单,提供了用户界面的一种导航方式。它通常从屏幕的边缘滑出,显示主要的导航选项,帮助用户在不同的页面或功能间快速切换。在自定义抽屉菜单时,开发者可以更改菜单项的样式、添加头部视图或实现特定的点击事件处理逻辑。自定义外观时,可以通过设置的属性或修改其XML布局文件。调整行为通常涉及到监听抽屉的开启和关闭事件,以及用户与菜单项的交互事件。// 获取NavigationView并设置监听器// 处理菜单项点击事件。

weixin_42103128的博客 1144

ios应用源码之很炫的抽屉式侧边栏导航效果 2018127

ios应用源码之很炫的抽屉式侧边栏导航效果 .

IOS实现点击滑动抽屉效果

主要为大家详细介绍了IOS实现点击滑动抽屉效果的相关资料,感兴趣的小伙伴们可以参考一下

iOS 抽屉效果 毛玻璃效果 下拉筐效果 高仿网易新闻

iOS 抽屉效果 毛玻璃效果 下拉筐效果 高仿网易新闻

上一篇: ios屏幕强制旋转
下一篇: iOS左右菜单PPRevealSideviewController
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值