ios App实战流程
来源:互联网 发布:网络干货分享 编辑:程序博客网 时间:2024/06/05 19:29
(待续)
demo地址 http://download.csdn.net/detail/xoxo_x/9711895
知识点:
App开发的全部流程
如何进行短信验证码登录
如何进行密码登录
Swift与OC进行互调的流程
Swift的语法结构
使用代码和Storyboard进行交互
如何自定义导航栏
音频合成
视频美颜
数据库处理
视频播放器
音频播放器
直播技术
图片处理
常用工具
一、创建名为FSKDemo的项目
语言选择Objective-C
xcode为7.3.1(关于如何运行10.2系统的真机请查看:)
如图:
二、工程设置
在BuildSeting中搜索bitcode ,并设置为No(有些SDK不支持bitcode)
项目使用oc与swift混编,swift版本为2.3
如何在最新的xcode中使用Swift2.3或者2.0版本:http://blog.csdn.net/xoxo_x/article/details/53526281 (7.3.1无需设置,跳过)
清理工程删除ViewController.h和.m文件 以及main.storyboard
并设置下图内容,将入口制空:
新建一个Login.storyboard
- 在Login.storyboard中添加一个navigationController:
整理后如下:
- 新建一个LoginVc.swift
这时候会自动创建FSKDemo-Bridging-Header.h
这个文件就是进行使用swift调用oc的地方
将在swift中需要使用的头文件放到这里就可以
我们在这个里边添加appdelegate.h
回到Login.storyboard中,删除RootViewController添加一个ViewController并且改为LoginVc
将UINavigationController的rootViewControler设为LoginVc
如果你没看懂,先下载Demo
三、开始工程,编写AppDelegate.m
- 设置入口,初始化window
- 在代码中调用特定的storybord 根据Identifier 查找Vc
- 设置导航
- 去导航黑线
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; //在代码中调用特定的storybord 根据Identifier 查找Vc //进入登录页面 UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Login" bundle:nil]; NSString *str = @"LoginNav"; self.window.rootViewController = [storyBoard instantiateViewControllerWithIdentifier:str]; //去导航黑线 并隐藏 [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; [self.window makeKeyAndVisible]; return YES;}
四、处理登录界面
如图:
这里使用约束进行屏幕适配,对于Scrollview,没有办法进行内部内容的约束,因为他的contentsize不固定,需要手写代码进行添加。
func setScrollView() { self.loginScrollView.delegate = self self.loginScrollView.contentSize = CGSizeMake(self.view.frame.width*2, 0) let tap = UITapGestureRecognizer.init(target: self, action: #selector(textFResignFirstResponder)) self.loginScrollView.addGestureRecognizer(tap) addLoginView() }
func addLoginView() { self.quickLoginView.frame = CGRectMake(0, 0, self.loginScrollView.frame.size.width, self.loginScrollView.frame.size.height) self.loginScrollView.addSubview(quickLoginView) self.usuallyLoginView.frame = CGRectMake(self.loginScrollView.frame.size.width, 0, self.loginScrollView.frame.size.width, self.loginScrollView.frame.size.height) self.loginScrollView.addSubview(usuallyLoginView) self.loginScrollView.layoutSubviews() self.loginScrollView.layoutIfNeeded() }
这时候我们发现运行的时候似乎约束没有起作用,frame值不正确,这是因为storybord中的约束还没来得及适应屏幕就被加载了,因此:
在这里viewDidAppear,更改frame,他会自动调用layoutIfNeed() 实现更新UI
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) self.quickLoginView.frame = CGRectMake(0, 0, self.loginScrollView.frame.size.width, self.loginScrollView.frame.size.height) self.usuallyLoginView.frame = CGRectMake(self.loginScrollView.frame.size.width, 0, self.loginScrollView.frame.size.width, self.loginScrollView.frame.size.height) }
demo地址 http://download.csdn.net/detail/xoxo_x/9711895
运行效果:
五、自定义Tabbar
当我们登录完成之后,需要跳转到主页,这时候需要自己自定义tabbar,下面为了以后开发方便,我们封装一下tabbar
普通 的tabbar (没有凸起的tabbarItem)最常规的
有凸起的那种,类似直播的
继承UITabBarController 创建BaseTabbarVc 并添加 UITabBarControllerDelegate
class BaseTabbarVc: UITabBarController , UITabBarControllerDelegate{}
import UIKitvar currentTabIdx = 0var maxTabIdx = 0var changeTabBySlide = 0class BaseTabbarVc: UITabBarController , UITabBarControllerDelegate{ var navs = ["SearchWordVcNav","LearnWordVcNav","MeVcNav"] var storys = ["Search","Learn","Me"] var icons = ["Search","Learn","Me"] override func viewDidLoad() { super.viewDidLoad() self.delegate = self maxTabIdx = navs.count - 1 currentTabIdx = 0 var vcs = [UIViewController]() for i in 0...icons.count-1{ let vc = viewControllerWithTabTitle(storys[i],id: navs[i],title: "",img: "tab-\(icons[i])-inactive",selectedImg: "tab-\(icons[i])") vcs.append(vc) } self.viewControllers = vcs self.tabBar.backgroundColor = UIColor.clearColor() //去掉tabBar顶部线条 let rect2 = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); UIGraphicsBeginImageContext(rect2.size); let context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, UIColor.clearColor().CGColor); CGContextFillRect(context, rect2); let img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); self.tabBar.shadowImage = img UITabBar.appearance().shadowImage = UIImage() self.tabBar.barTintColor = UIColor.whiteColor() //tabbar的frame var rect = self.tabBar.frame; rect.size.height = 25; self.tabBar.frame = rect; UITabBar.appearance().clipsToBounds = true }
颜色工具
func colorFromHex(hexString:String) -> UIColor{ let hexint = intFromHexString(hexString) let color = UIColor(red: ((CGFloat) ((hexint & 0xFF0000) >> 16))/255, green: ((CGFloat) ((hexint & 0xFF00) >> 8))/255, blue: ((CGFloat) (hexint & 0xFF))/255, alpha: 1) return color } func intFromHexString(hexString:String)->UInt32{ let scanner = NSScanner(string: hexString) scanner.charactersToBeSkipped = NSCharacterSet(charactersInString: "#") var result : UInt32 = 0 if scanner.scanHexInt(&result) { print(result) } return result //let num = strtoul(hexString, nil, 16) }
循环创建
func viewControllerWithTabTitle(storyboard:String,id:String,title:String,img:String, selectedImg: String)->UIViewController{ let image = UIImage(named: img)?.imageWithRenderingMode(.AlwaysOriginal) let selectedImage = UIImage(named: selectedImg)?.imageWithRenderingMode(.AlwaysOriginal) let vc = getVcByStoryboardId(storyboard, id: id) as! UIViewController let tab = UITabBarItem(title: title, image: image, selectedImage: selectedImage) vc.tabBarItem = tab let titleDict: NSDictionary = [NSForegroundColorAttributeName: colorFromHex("00d5e5")] let titleDict2: NSDictionary = [NSForegroundColorAttributeName: colorFromHex("eba50e")] vc.tabBarItem.setTitleTextAttributes(titleDict as? [String : AnyObject], forState: UIControlState.Normal) vc.tabBarItem.setTitleTextAttributes(titleDict2 as? [String : AnyObject], forState: UIControlState.Selected) return vc }//通过id获取Vc func getVcByStoryboardId(srotyboard:String,id:String)->AnyObject!{ let storyboard: UIStoryboard = UIStoryboard(name: srotyboard,bundle: nil) let vc: AnyObject! = storyboard.instantiateViewControllerWithIdentifier(id) return vc }
没看懂下demo- 地址 :http://download.csdn.net/detail/xoxo_x/9711895
- ios App实战流程
- [实战]iOS APP企业开发者账户申请流程(图文)
- [实战]iOS APP企业开发者账户申请流程(图文)
- IOS APP设计流程
- iOS App 上架流程
- IOS APP提交流程
- IOS APP提交流程
- iOS APP 开发流程
- IOS APP提交流程
- IOS app 上线流程
- IOS APP提交流程
- IOS APP提交流程
- IOS APP提交流程
- iOS App 发布流程
- iOS App提交流程
- iOS 上传app流程
- iOS 上传app流程
- iOS App上架流程
- 第十六周 项目1(2)直接选择排序
- androdstudio工程提交svn过滤文件列表
- 第16周项目1-(7)归并排序
- 很好的一个分析bug的文章,供以后疑难bug参考,转一下:一次segfault错误的排查过程
- 第十五周项目3—B-树的基本操作
- ios App实战流程
- [Java并发包学习九]Java中的阻塞队列
- 第12周项目4 - 利用遍历思想求解图问题(7)
- 第十六周项目一(4)堆排序
- 第十六周项目1-验证算法(3)冒泡排序
- java对象流重载 serialVersionUID 属性
- C++ STL 一般总结
- [转]How to easy split the Android boot image
- 修改kafka topic的offset几种方法