下载更多Xcode版本:
https://developer.apple.com/download/more/
1.App类型:社交、电商、视频、娱乐、新闻
2.App开发模式
①迭代开发(原有基础上开发)
②独立开发
项目开发方式:①storyboard ②纯代码
其他:需求文档、原型图、接口文档、开发设计文档
3.Target-General配置
Display Name 展示名称
Bundle Identifier 捆绑标识符
Info.plist
version: AppStore版本
build: 工程的构建版本
Deployment Target : 开发所支持的最低版本
Devices: 支持的设备(universal、iPhone、iPad)
Main Interface 入口
Device Orientation : 支持设备方向
Status Bar Style : 设置程序启动时的状态栏样式(一般隐藏)
Embedded Binaries : .a 文件
Linked Frameworks and Libraries .添加依赖库
AppIcons and LaunchImages 设置AppIcon和启动图
其他配置
①启动图配置(LaunchScreen>LaunchImage)
/* 启动图配置优先级: 优先级:LaunchScreen > LaunchImage Xcode配置了,不起作用 删掉 LaunchScreenFile-> LaunchScreen.storyboard 1.清空xcodew缓存 2.直接删掉程序 重新运行 如果是通过LaunchImage设置启动界面,那么屏幕的可视范围由图片决定 注意:如果使用launchImage,必须让你的美工设置各种尺寸的启动图片 LaunchScreen Xcode 6 开始才有的 好处: 1.自动识别当前真机或者模拟器的尺寸 2.只要让美工提供一个可拉伸的图片就可以了 LaunchScreen底层实现:把launchScreen截屏,生成一张图片,作为启动界面 */
②项目结构搭建(框架)
UITabBarController+导航控制器
封装:谁的事情谁管理、方便代码维护
③UIApplication作用
/* 1.创建UIApplication(1.打开网页,发短信,打电话 2.设置应用程序提醒数字 3.设置联网状态 4.设置状态栏) 2.创建AppDelegate代理对象,并且成为UIApplication代理,(监听整个app生命周期,处理内存警告) 3.开启主运行循环,保证程序一直运行(runloop:每一个线程都有runloop,主线程有一个runloop自动开启) 4.加载info.plist,判断是否指定了main.storyboard,如果指定,就会去加载 //AppDelegate设置根视图步骤 1.创建窗口 2.设置根控制器 3.显示窗口 */
④插件路径
/* 1.改插件 -> 如何去查找插件 -> 插件开发知识 -> 插件代码肯定有个地方指定安装在什么地方 1.打开插件 2.搜索plug 3.就能找到安装路径 */
⑤load方法和initialize方法的区别
initialize :这个方法会在第一次初始化这个类之前调用,我们用它来初始化静态变量.
调用时机: 类似懒加载,如果没有使用这个类,那么系统默认不会调用这个方法,且默认只加载一次。(在init之前)当向该类发送第一个消息时,先调用类中的,再调用类别中的(类别中如果有重写),如果该类只是引用,没有调用,则不会执行initialize方法。
load :在加载类的时候就被调用,也就是iOS应用启动的时候,就会加载所有的类,就会调用每个类的 +load方法。
调用时机:默认执行且在main函数之前,先调用类中的,再调用类别中的(类别中如果有重写)
共同点:自动调用父类的,不需要super操作,自动调用且仅仅会调用一次(不包括外部显示调用)
注意:initialize可能会执行多次
在创建子类对象时,首先要创建父类对象,所以会调用一次父类的initialize方法,然后创建子类时,尽管自己没有实现initialize方法,但还是会调用父类的方法。
正确使用:
// In Person.m + (void)initialize { if (self == [Person class]) { NSLog(@"Initialize Person, caller Class %@", [self class]); } }
⑥Appearance
/* appearance: 1.只要遵守了UIAppearance协议,还要实现这个方法 2.哪些属性可以通过appearance 设置,只有被UI_APPEARANCE_SELECTOR宏修饰的属性,才能设置 3.[UITabBarItem appearance] 默认设置全局(先remove 然后设置appearance 最后再addSubView) [self.view removeFromSuperView]; UISwitch *switchView = [UISwitch appearance]; switchView.onTinColor = [UIColor redColor]; [[UIApplication sharedApplication].keyWindow addSubView:self.view]; */ //获取整个程序下的TabBarItem // UITabBarItem * tabBarItem = [UITabBarItem appearance]; //开发中建议使用这种 只在某个类设置统一属性 //iOS 9.0之前 //UITabBarItem * tabBarItem = [UITabBarItem appearanceWhenContainedIn:self, nil]; //iOS 9.0之后 UITabBarItem * tabBarItem = [UITabBarItem appearanceWhenContainedInInstancesOfClasses:@[HKTabBarController.self]]; //设置按钮选中标题的颜色:富文本 、颜色、字体、阴影、空心、图文混排 //创建一个描述文本属性的字典 NSMutableDictionary * attrs = [NSMutableDictionary dictionary]; attrs[NSForegroundColorAttributeName] = kBlackColor; [tabBarItem setTitleTextAttributes:attrs forState:UIControlStateSelected];
⑦滑动返回
在HKNavigationController中设置
- (void)viewDidLoad { [super viewDidLoad]; // 控制手势什么时候触发,只有非根控制器才需要触发手势 self.interactivePopGestureRecognizer.delegate = self; //FIXME:BUG:假死状态:程序还在运行,但是界面死了. } #pragma mark - UIGestureRecognizerDelegate // 决定是否触发手势 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return self.childViewControllers.count > 1; }
⑧全屏滑动返回
在HKNavigationController中设置
- (void)viewDidLoad { [super viewDidLoad]; //设置全屏滑动返回 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)]; #pragma clang diagnostic pop [self.view addGestureRecognizer:pan]; // 控制手势什么时候触发,只有非根控制器才需要触发手势 pan.delegate = self; // 禁止之前手势 self.interactivePopGestureRecognizer.enabled = NO; }