iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛逼的技术运行时(Runtime)

关于运行时这里就不多说了,请查看笔者之前搬过来了精选文章,这里主要是怎么在实际开发中使用运行时实现我们想要的功能。

比如,在iOS开发中有这样一个问题,关于导航栏中我们点击一个按钮会跳到对应的子控制器,但是这里问题就来了,我们在对应的字控制器中可以点击对应的back按钮实现返回,但是如果用户使用的是滑动的话,这里就会出问题,除什么问题呢?

问题就是:用户只能在对应的子控制器中的最左边滑动返回,音文一般我们都是实现全局界面滑动都可以的,所以这里我要解决的就是这样问题。

这里的思路是:

修改系统自带的手势滑动方法,我自己来实现,并且增加一些相应的功能。

好了下面来看看怎么使用这种牛逼的技术

一:首先我们需要导入运行时库

二:然后使用runtime的方式打印系统对应的成员属性

获取成员变量,知道属性名,

怎么通过运行时机制获取属性值,首先得要获取属性的名,通过KVC获取值

获取target,需要使用运行时机制,遍历出类里面所有属性名

利用运行时获取属性名,只能获取当前类下的所有属性名,并不能获取它的子类或者父类。

copyIvarList:获取成员属性列表

Class:获取哪个类下面的属性

outCount:这个类有多少个成员属性,成员属性的总数

 1   /**
 2
 3      *  打印属性
 4
 5      */
 6
 7     unsigned int count  = 0;
 8
 9     // 获取UIGestureRecognizer里所有的成员属性
10
11     Ivar *ivars = class_copyIvarList([UIGestureRecognizer class], &count);
12
13
14
15     for (int i = 0; i < count; i++) {
16
17         // 获取成员属性
18
19         Ivar ivar =  ivars[i];
20
21
22
23         // 获取成员属性的属性名
24
25        NSString *name =   @(ivar_getName(ivar));
26
27
28
29 //        NSLog(@"%@",name);
30
31     }

三:由于我们需要改变的死系统对应的手势,所以这里需要分析一下系统手势的方法和对应的属性,并且把他替换掉

  1. 系统的滑动手势触发的时候,会调用Target的action,去做滑动返回的事情(action),
  2. 获取系统滑动返回的target和action

// action:=> handleNavigationTransition:

UIScreenEdgePanGestureRecognizer *gesture = self.interactivePopGestureRecognizer;

四:从上面运行时方法打印出来的属性我们可以知道,系统对应的手势方法值是 _targets,所以我们可以使用KVC的方式改掉他。

 1     NSArray *targets  =  [gesture valueForKeyPath:@"_targets"];
 2
 3
 4
 5     id gestureRecognizer = targets[0];
 6
 7
 8
 9     id target = [gestureRecognizer valueForKeyPath:@"_target"];
10
11
12
13 //    NSLog(@"%@",target);
14
15
16
17     self.interactivePopGestureRecognizer.enabled = NO;
18
19
20
21     // 借用系统的滑动手势的功能,当触发自己的滑动手势的时候,调用系统的滑动返回功能
22
23     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
24
25
26
27     pan.delegate = self;
28
29
30
31     [self.view addGestureRecognizer:pan];
32
33  
时间: 2024-12-26 14:22:28

iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势的相关文章

iOS开发——高级技术OC篇&amp;运行时(Runtime)机制

运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档. 下面就来看看什么是运行时,我们要怎么在iOS开发中去使用它. 官方介绍: 这里我们主要关注的是最后一种! 下面来看看Runtime的相关总结 #pragma mark 获取属性成员 /********************************************************

ios开发——实用技术篇OC篇&amp;iOS的主要框架

iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core Graphics框架帮助你创建图形 Core Animation允许你创建高级的动画和虚拟效果 OpenGL ES 框架提供2D和3D绘图工具 将别的框架添加到工程里 本文是<Sunvey the Major Framworks>一文的翻译 框架是一个目录,这个目录包含了共享库,访问共享库里代码

iOS开发——数据持久化OC篇&amp;(七)CoreData高级常识

CoreData高级常识 关于CoreData貌似实际开发中很少用到,基本上是个有九个公司不会使用它,因为都说是性能不好,但是作为一个程序员,了解及其使用时必须了, 下面是我从一位大神那里搬过来的一下Core详细介绍,相信以后总有一天会帮我解决不少学习CoreData中的问题! 一.技术概览 1. Core Data 功能初窥 对于处理诸如对象生命周期管理.对象图管理等日常任务,Core Data框架提供了广泛且自动化的解决方案.它有以下特性. (注:对象图-Object graph的解释:在面

iOS开发——新特性OC篇&amp;IOS9 SDK新特性

iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍(@onevcat)对WWDC上透露的iOS 9 SDK新特性的总结,分享给广大的iOS开发者. 年年岁岁花相似,岁岁年年人不同.今年的 WWDC 一如既往的热闹,得益于 Apple 的随机抽选机制,这两年有更多的中国开发者有机会亲临现场进行体验,并与全球开发者取得更多的交流.更多的开发者可能只能在

iOS开发——网络实用技术OC篇&amp;网络爬虫-使用青花瓷抓取网络数据

网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS开发中的抓包中具有重要作用.最大的三点用处,一就是拦截别人软件的发送的请求和后端接口,练习开发.二是自己后端返回的response拦截修改后再接收以达到测试临界数据的作用.三写脚本重复拦截

iOS开发——数据持久化OC篇&amp;(三)对象归档

归档 iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 /

iOS开发——网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据

网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一片文章已经介绍我们可以使用两个方式来抓取网络数据实现网络爬虫,并且大致介绍了一下怎么使用正则表达式去实现数据的抓取 由于笔者曾经学过一段时间java和android相关的技术,今天就讲讲怎么使用java去抓取网络数据,关于Python有机会等笔者好好研究一下再来分享,但其实会一种就可以,除非你的需求

iOS开发——高级UI—OC篇&amp;退出键盘

退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中的一种活着几种. 一:textView 1 //通过委托来实现放弃第一响应者 2 #pragma mark - UITextView Delegate Method 3 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(N

iOS开发——数据持久化OC篇&amp;总结

数据持久化总结 1 //1.沙盒:/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3 2 /** 3 // 1.获取程序的Home目录 4 NSString *home = NSHomeDirectory(); 5 NSLog(@"应用程序目录:%@", home); 6 7 // 2.获取Documents目录 8