-
設想:
- 為什么當push進去的控制器,會有滑動功能。
- 是不是系統(tǒng)調(diào)用了,某個對象的某個方法。
- 是不是自己給控制器的view加個滑動手勢pan,然后去實現(xiàn)那個對象的那個方法,就能實現(xiàn)全屏滑動呢。
-
實現(xiàn)
- 添加手勢,很容易。但是怎么得到
對象和方法
。 - 我們有
self.interactivePopGestureRecognizer
從這里入手,來取得對象和方法
. - 打印可以直接獲得方法
- 系統(tǒng)的滑動手勢觸發(fā)的時候,會調(diào)用Target的action,去做滑動返回的事情(action),
- 獲取系統(tǒng)滑動返回的target和action
- action:=> handleNavigationTransition:
- 可以通過
運行機制
來得到變量名 - 添加頭文件
#import <objc/runtime.h>
- 獲取成員變量,知道屬性名,
- 怎么通過運行時機制獲取屬性值,首先得要獲取屬性的名,通過KVC獲取值 (系統(tǒng)內(nèi)部非開源屬性,只能用KVC獲取,修改)
- 獲取target,需要使用運行時機制,遍歷出類里面所有屬性名
- 利用運行時獲取屬性名,只能獲取當前類下的所有屬性名,并不能獲取它的子類或者父類。
- 添加手勢,很容易。但是怎么得到
- (viod)viewDidLoad
{
unsigned int count = 0;
// 獲取UIGestureRecognizer里所有的成員屬性
Ivar *ivars = class_copyIvarList([UIGestureRecognizer class], &count);
for (int i = 0; i < count; i++) {
// 獲取成員屬性
Ivar ivar = ivars[i];
// 獲取成員屬性的屬性名
NSString *name = @(ivar_getName(ivar));
// NSLog(@"%@",name);
// 取得屬性中的對象
NSArray *targets = [gesture valueForKeyPath:@"_targets"];
id gestureRecognizer = targets[0];
// 去得其_target,屬性值
id target = [gestureRecognizer valueForKeyPath:@"_target"];
//
// NSLog(@"%@",target);
self.interactivePopGestureRecognizer.enabled = NO;
// 借用系統(tǒng)的滑動手勢的功能,當觸發(fā)自己的滑動手勢的時候,調(diào)用系統(tǒng)的滑動返回功能
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
pan.delegate = self;
[self.view addGestureRecognizer:pan];
}
- copyIvarList:獲取成員屬性列表
- Class:獲取哪個類下面的屬性
- outCount:這個類有多少個成員屬性,成員屬性的總數(shù)
- 注意,如果是根控制器的話,則不需要進行滑動,不觸發(fā)手勢。代碼實現(xiàn)
// 如果返回no,表示不觸發(fā)這個手勢
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 只有非跟控制器才能擁有滑動返回功能 子控件數(shù)為1,因為根控制器也為其子控制器。所以為1時,就是只子控制器。
return self.childViewControllers.count != 1;
}