main程序入口
UIApplication里面做了哪些事情
- 1.创建
UIApplication对象
(UIApplication对象
的作用:1.打电话,发短信,打开网页 2.设置应用提醒数字 3.设置联网状态 4.控制器导航栏) - 2.创建
UIApplication代理对象
(UIApplication代理对象
作用:1.监听整个应用程序的生命周期 2.处理内存警告,清空图片缓存) - 3.开启主运行循环,保证程序一直运行,runloop(重要),每个线程都有一个runloop,主线程的runloop自动开启,其他线程的runloop需要手动去开启
- 4.加载
info.plist
文件,判断是否指定了main
,如果指定了,就去加载- 加载
main.storyboard
的时候做的几件事情- 创建窗口
- 创建窗口的根控制器
- 显示窗口
- 加载
为什么要自定义类
- 谁的事情谁管理,方便以后改需求,迅速找到对应的类做事情
- 系统的类不能满足我们的要求
修改了控制器的返回按钮,但是没有点击按钮按钮的时候按钮也能做出响应,如何解决?
//设置按钮的尺寸为自适应,此时按钮的尺寸并不大,但是当鼠标点击按钮右侧很远的位置的时候这个按钮也会被点击,为了解决这个问题,可以换用一个View将按钮包装起来,然后用item将View包装起来
UIView *view = [[UIView alloc] initWithFrame:btn.bounds];
[view addSubview:btn];
return [[UIBarButtonItem alloc] initWithCustomView:view] ;
隐藏push出来的控制器的TabBar
- (void)setting
{
HMXSettingViewController *settingVc = [[HMXSettingViewController alloc] init];
// 一定要注意:在Push之前去设置这个属性(通过方法名可以看出,是在push的时候有效)
settingVc.hidesBottomBarWhenPushed = YES;
// 跳转到设置界面
[self.navigationController pushViewController:settingVc animated:YES];
}
UITabBarItem
和UINavigationItem
以及UIBarButtonItem
-
UITabBarItem
决定TabBar
上按钮的内容 -
UINavigationItem
决定导航条上左边,中间,右边的内容 -
UIBarButtonItem
决定导航条上按钮具体的内容
利用KVC来替换系统的TabBar的底层实现
-
系统的
TabBar
为ReadOnly
,只能通过KVC,调用[self setValue:tabBar forKey:@"tabBar"]
方法去修改系统的TabBar
-
那么KVC底层是怎么样实现的呢?
- 系统首先去查找类中有没有
setTabBar
方法 - 查找有没有
tabBar
属性 - 查找有没有
_tabBar
- 系统首先去查找类中有没有
-
被
readOnly
修饰的属性不会生成setter
方法,只会生成getter
方法
富文本属性
- 如果想修改
NavigationBar
或者TabBar
上面按钮文字的属性,可以通过UITabBarItem
或者UINavigationBar
去设置titleTextAttributes
一个恶心的BUG
- 在获取全局导航条的时候,如果
[UINavigationBar appearance]
去获取整个应用程序下的导航条,在iOS7的时候,如果将短信界面的导航条也改了就会使联系人界面出现一片黑
系统自带的侧滑返回功能
-
系统有个自带的侧滑返回功能,就是一个导航控制器下的子控制器push出下的一个控制器之后,想返回上一个子控制器就可以在左侧侧滑返回,但是一旦重写了系统的左侧返回按钮,那么该功能就会失效
-
推测:两种原因导致侧滑返回功能失效:
- 1.系统的滑动手势不在了?(经过验证,侧滑手势还在,进入导航控制器,搜索gesture就可以找出侧滑的手势为
interactivePopGestureRecognizer
) - 2.是代理控制侧滑手势失效的吗?验证:代理做了一些事情,使得侧滑手势失效
- 1.系统的滑动手势不在了?(经过验证,侧滑手势还在,进入导航控制器,搜索gesture就可以找出侧滑的手势为
-
系统的侧滑功能底层实现:如果在非根控制器,当触发侧滑手势的时候,手势会通知它的代理
self.interactivePopGestureRecognizer.delegate
去让Target
调用handleNavigationTransition:
方法,实现侧滑,而通过打印验证,这个Target
正是self.interactivePopGestureRecognizer.delegate
本身,如果在根控制器触发手势,那么,系统去做一些控制不去让代理调用这个方法 -
目前的需求:又想要系统的侧滑返回,又要自定义返回按钮
-
解决方案:
- (void)viewDidLoad {
[super viewDidLoad];
// Bug:假死状态:程序一直在跑,但是界面死了
//自己的理解:
//在根控制器,系统原本的做法是会让代理做一些控制,即使用户触发了侧滑手势,也不实现侧滑,由于这里根控制器的左侧返回按钮没有重写,所以它的代理还是有效的,在没有push出下一个控制器之前,在根控制器上触发侧滑手势,代理会去做一些控制
//我们这里的做法是将系统侧滑手势的代理给换了,如果用户在根控制器触发侧滑手势,这个手势将找不到原来的代理去做一些控制,因此出现了假死的现象
//因此我们要禁止在根控制器触发侧滑手势,在手势的代理方法中可以禁止掉
//在push出来的控制器上触发侧滑,由于我们将系统自带的侧滑手势的代理给换了,系统原本的做法是如果自定义了左侧的返回按钮,那么这个侧滑返回功能会失效,这个是通过它原本的代理做的一些控制,但是我们将它的代理给换掉了,它找不到原本的代理做控制,因此,侧滑功能海还会保留
// 清空手势代理,恢复滑动返回功能
self.interactivePopGestureRecognizer.delegate = self;
}
#pragma mark - UIGestureRecognizerDelegate
// 是否触发手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// 在根控制器下 不要 触发手势
return self.childViewControllers.count > 1;
}
全屏侧滑
- (void)viewDidLoad {
[super viewDidLoad];
// 全屏滑动功能
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:pan];
// 调用代理方法来控制手势什么时候触发(非根控制器的时候才触发)
pan.delegate = self;
// 让系统的侧滑手势失效
self.interactivePopGestureRecognizer.enabled = NO;
}
#pragma mark - UIGestureRecognizerDelegate
// 是否触发手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// 在根控制器下 不要 触发手势
return self.childViewControllers.count > 1;
}
占位视图的实现
- 当一个界面,层次结构已经清晰,但是中间某一层位置或者尺寸不确定,可以采用占位视图
如何修改一个第三方框架的配置文件
- 打开工程文件 --->搜索"plug"--->找到一个图标是蓝色工程文件开头的文件,点击之后进去找到路径,然后按照相应的路径去查找,右击显示包内容
网友评论