(待续)
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 UIKit
var currentTabIdx = 0
var maxTabIdx = 0
var changeTabBySlide = 0
class 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
}