项目总结-1

作者: MarceauHe | 来源:发表于2016-04-07 16:46 被阅读163次

    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];
    }
    

    UITabBarItemUINavigationItem以及UIBarButtonItem

    • UITabBarItem决定TabBar上按钮的内容
    • UINavigationItem决定导航条上左边,中间,右边的内容
    • UIBarButtonItem决定导航条上按钮具体的内容

    利用KVC来替换系统的TabBar的底层实现

    • 系统的TabBarReadOnly,只能通过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.是代理控制侧滑手势失效的吗?验证:代理做了一些事情,使得侧滑手势失效
    • 系统的侧滑功能底层实现:如果在非根控制器,当触发侧滑手势的时候,手势会通知它的代理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"--->找到一个图标是蓝色工程文件开头的文件,点击之后进去找到路径,然后按照相应的路径去查找,右击显示包内容

    如果发现在设置图片的时候将图片拖进Assets中后在程序中加载不进来,可以直接将整个图片的问价夹放到supportingFile的目录下

    相关文章

      网友评论

      本文标题:项目总结-1

      本文链接:https://www.haomeiwen.com/subject/gbamlttx.html