1.UIButton
-
button 的初始化,点击事件
-
button 传入参数,和不传入参数市一样的,好像只写方法名
-
button 的属性
view.backgroundColor=UIColor.green let btn = UIButton(type: .system) btn.setTitle("button", for: .normal) btn.frame=CGRect(x: 100, y: 100, width: 100, height: 100) btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside) view.addSubview(btn)
func btnClick(buttt:UIButton) { print(buttt) }
2.UITableView
-
懒加载 lazy 关键字 + var 属性名 :[集合中的类型] = { 设置return 类型 } ( )
-
mark 的标记 // MARK:懒加载
lazy var dataSoure: [String] = { return ["11","22","33","44","55"] }()
-
tableView的属性 跟OC类似,
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { override func loadView() { let tv = UITableView(frame: UIScreen.main.bounds) tv.dataSource=self tv.delegate=self view=tv }
-
tableView的代理设置 实现代理,是在类后面逗号隔开
-
tableView的代理方法实现 数据源方法写在extension 中,提高代码的可读性
// extension 想当于 OC中的category extension ViewController : UITableViewDelegate, UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 } //MARK: -数据源方法 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: "cell2") if cell==nil { cell=UITableViewCell(style: .default, reuseIdentifier: "cell2") } cell?.textLabel?.text = dataSoure[indexPath.row] return cell! } }
3.swift - TabBar
-
结构是tabBar 包括四个navigationController
tabBar.tintColor=UIColor.orange addSelfChildViewController(childVC: BillListVC(), title: "账单", imageString: "home_tabbar_zd") addSelfChildViewController(childVC: StatementVC(), title: "报表", imageString: "home_tabbar_bb") addSelfChildViewController(childVC: InvoiceListVC(), title: "发票", imageString: "home_tabbar_fp") addSelfChildViewController(childVC: PartnerVC(), title: "伙伴", imageString: "home_tabbar_hb")
private func addSelfChildViewController(childVC: UIViewController,title:String,imageString:String) { childVC.tabBarItem.image=UIImage(named: imageString) childVC.tabBarItem.selectedImage=UIImage(named: imageString.appending("_h")) childVC.tabBarItem.title=title childVC.title=title; let nav = UINavigationController(rootViewController: childVC) addChildViewController(nav) }
-
字符串用appdend ,拼接字符用**+**号
-
命名空间 可以被修改
let nas = Bundle.main.infoDictionary! ["CFBundleExecutable"] as! String
-
从plist 获取json 进行解析。 从本地加载转化位nsdata, 使用JSONSeriralation 转化为数组,打印数组中的字典
-
contentsOfFile 方法是可选类型,调用 JSONSerialization.jsonObject 方法是需要强制解包,
-
打印 数组中的字典是时候,需要 声明数组中的数据类型
let path = Bundle.main.path(forResource: "home.plist", ofType: nil) if let filePath = path{ do { let data = NSData(contentsOfFile: filePath) let diarry:Any = try JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) for adic in diarry as! [[String:String]] { print(adic) } print(diarry) } catch { print("读取本地数据出现错误!") } }
4.swift-基类未登录界面
抽取基类,控制器作为子类
-
判断登录状态,如果登录就加载子类视图,如果没有登录加载未登录界面
-
设置自定义视图,流出接口方法,进行切换图片和文字
-
首页转盘图片动画
-
登录注册的代理方法
-
app的appearance tabbar,navigaitionBar
上代码
-
三目运算符 判断登录状态
let isHadLoggin :Bool = false lazy var nologvvv : NoLogView = NoLogView.shareNoLogView() override func loadView() { isHadLoggin ? super.loadView(): setNoLogView() }
-
根据控制器的不同,设置未登录页界面的图片和文字
func setUpNologViewInfo(imageString:String,title:String){ rotationView.isHidden=true iconImageView.image=UIImage(named: imageString) messageLable.text=title }
-
设置首页转轮动画
func addRotationAnimation(){ let animation = CABasicAnimation(keyPath: "transform.rotation.z") animation.fromValue = 0 animation.toValue = M_PI * 2 animation.repeatCount=MAXFLOAT animation.isRemovedOnCompletion = false animation.duration = 10 // 结束一次动画的时长 rotationView.layer.add(animation, forKey: "homeRotation") }
-
设置代理 继承 NSObjectProtocol
-
设置代理属性 使用weak 关键字,可选类型
-
使用不用判断代理 直接使用
protocol NoLogViewDelegate :NSObjectProtocol{ func registButtonWillClick() func logginButtonWillClick() } weak var delegate:NoLogViewDelegate? delegate?.registButtonWillClick()
5.自定义转场动画
转场动画
- 需要两个VC,一个VC,弹出另外一个VC
- 需要一个Animator 工具类,遵守UIViewControllerTransitioningDelegate 负责处理动画,和告诉谁是处理展现的控制器
- 需要一个控制器,继承 UIPresentationController, 是Animator 工具类告诉代理,此控制器处理展现View
上代码
- 创建 HomePopOverAnimator,
private lazy var homeAnimator : HomePopOverAnimator = HomePopOverAnimator() func changeAccoountBook(){ let vc = LeftChoseAccountBookVC() vc.modalPresentationStyle = .custom vc.transitioningDelegate = homeAnimator present(vc, animated: true, completion:nil) }
HomePopOverAnimator 处理
-
HomePopOverAnimator 遵守UIViewControllerTransitioningDelegate 协议,实现协议方法
-
在代理中创建负责展现view的HomeUIPresentationVC ,继承自UIPresentationController
-
HomePopOverAnimator负责处理开始,结束动画,需要遵守UIViewControllerAnimatedTransitioning 协议
// MARK:- 自定义转场代理的方法 extension HomePopOverAnimator : UIViewControllerTransitioningDelegate { // 告诉代理,谁是处理展示的VC public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?{ let homePrentVC = HomeUIPresentationVC(presentedViewController: presented, presenting: presenting) return homePrentVC } // 告诉代理,谁处理开始动画 public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning?{ isPresented = true return self } // 告诉代理,谁处理结束动画 public func animationController(forDismissed dismissed: UIViewController) ->UIViewControllerAnimatedTransitioning?{ isPresented = false return self } }
-
UIViewControllerAnimatedTransitioning 代理 弹出和消失动画代理的方法,根据上下文处理动画形式
// MARK:- 弹出和消失动画代理的方法 extension HomePopOverAnimator:UIViewControllerAnimatedTransitioning{ func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval{ return 1 } func animateTransition(using transitionContext: UIViewControllerContextTransitioning){ if isPresented { animationForStartAnimation(ransitionContext: transitionContext) }else{ animationForEndAnimation(ransitionContext: transitionContext) } } }
-
私有方法,开始动画,结束动画,transition 动画
// 开始动画 private func animationForStartAnimation(ransitionContext: UIViewControllerContextTransitioning){ // 获取view,将view加到contenterView上,执行动画 let containerView = ransitionContext.containerView let prentedView = ransitionContext.view(forKey: .to) containerView.addSubview(prentedView!) prentedView?.transform = CGAffineTransform.init(translationX: -containerView.bounds.size.width, y: 0) // prentedView?.layer.anchorPoint = CGPoint(x: 0.5, y: 0) UIView.animate(withDuration: transitionDuration(using: ransitionContext), animations: { prentedView?.transform = CGAffineTransform.identity }) { (Bool) in ransitionContext.completeTransition(true) } } // 结束动画 private func animationForEndAnimation(ransitionContext: UIViewControllerContextTransitioning){ // 获取view, 执行消失动画 let containerView = ransitionContext.containerView let dismissView = ransitionContext.view(forKey: .from) UIView.animate(withDuration: transitionDuration(using: ransitionContext), animations: { dismissView?.transform = CGAffineTransform.init(translationX: -containerView.bounds.size.width, y: 0) }) { (Bool) in dismissView?.removeFromSuperview() ransitionContext.completeTransition(true) } }
HomeUIPresentationVC处理
-
负责显示的View ,左侧抽屉一半view,下面一层蒙版,能响应点击消失
-
设置需要展现视图的大小,设置遮盖为button,响应点击事件
// 懒加载控件 lazy var coverBGView :UIButton = UIButton() // 重写layoutsubviews 设置弹出视图的大小 override func containerViewWillLayoutSubviews(){ super.containerViewWillLayoutSubviews() presentedView?.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width*0.6, height: UIScreen.main.bounds.size.height) setCoverbgViews() }
-
设置遮罩 frame和 响应方法
extension HomeUIPresentationVC { func setCoverbgViews(){ // 设置大小,插入到contenderView的最底层 coverBGView.titleLabel?.text="" coverBGView.frame = containerView!.bounds coverBGView.backgroundColor = UIColor.init(white: 0.8, alpha: 0.2) coverBGView.addTarget(self, action: #selector(tapCoverBgView), for: .touchUpInside) containerView?.insertSubview(coverBGView, at: 0) } } extension HomeUIPresentationVC { @objc func tapCoverBgView(tap:UITapGestureRecognizer){ presentedViewController.dismiss(animated: true, completion: nil) } }
6.extension 使用类扩展增加方法
-
swift 中extension 相当于OC中的category 作为类的扩展
-
单独创建文件做类的扩展
-
在vc 中使用extension 作为 vc 的方法分类 苹果推荐 代理等方法写在extension里。
-
上代码 command + N 创建Swift 文件,名字为UIBarBarItem+category
-
为 UIBarButtonItem 增加一个类方法, 创建item 的titleLable
extension UIBarButtonItem { class func titleLableWithText(title:String)->UILabel{ let lable = UILabel() lable.clipsToBounds = true lable.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width*0.5, height: 30) lable.font = UIFont.systemFont(ofSize: 16) lable.textColor = UIColor.init(red: 51, green: 51, blue: 51, alpha: 1) lable.text = title return lable } }
7.创建二维码
- 1.创建滤镜
- 2.还原滤镜设置
- 3.设置数据存入数据
- 4.取出图片
- 5.增加中间的头像
- 6.设置高清图像
上代码 如下
-
1.2.3.4 步骤
//1.创建滤镜 let filer = CIFilter.init(name: "CIQRCodeGenerator") // 2.还原滤镜的设置 filer?.setDefaults() // 3.设置数据 filer?.setValue(astring.data(using: .utf8), forKey: "inputMessage") // 4.从滤镜中取出图片 CIImage let fileCiImage = filer?.outputImage
-
增加中间的头像 UIGraphicsBegin
// 开启图像上下文 UIGraphicsBeginImageContext(bgImage.size) // 绘制背景大小 bgImage.drawInRect(CGRect(origin: CGPointZero, size: bgImage.size)) // 绘制头像 let width:CGFloat = 50 let height:CGFloat = width let x = (bgImage.size.width - width) * 0.5 let y = (bgImage.size.height - height) * 0.5 iconImage.drawInRect(CGRect(x: x, y: y, width: width, height: height)) // 取出绘制好的图像 let newImage = UIGraphicsGetImageFromCurrentImageContext() // 关闭上下文 UIGraphicsEndImageContext() // 返回头像 return newImage
-
绘制高清图像
/** 根据CIImage生成指定大小的高清UIImage :param: image 指定CIImage :param: size 指定大小 :returns: 生成好的图片 */ private func createNonInterpolatedUIImageFormCIImage(image: CIImage, size: CGFloat) -> UIImage { let extent: CGRect = CGRectIntegral(image.extent) let scale: CGFloat = min(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent)) // 1.创建bitmap; let width = CGRectGetWidth(extent) * scale let height = CGRectGetHeight(extent) * scale let cs: CGColorSpaceRef = CGColorSpaceCreateDeviceGray()! let bitmapRef = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, cs, 0)! let context = CIContext(options: nil) let bitmapImage: CGImageRef = context.createCGImage(image, fromRect: extent) CGContextSetInterpolationQuality(bitmapRef, CGInterpolationQuality.None) CGContextScaleCTM(bitmapRef, scale, scale); CGContextDrawImage(bitmapRef, extent, bitmapImage); // 2.保存bitmap到图片 let scaledImage: CGImageRef = CGBitmapContextCreateImage(bitmapRef)! return UIImage(CGImage: scaledImage) }
8.扫描二维码
- 懒加载会话,输入,输出
- 判断会话能不能添加输入输出 ,
- 会话添加输入输出
- 设置输出数据类型
- 设置输出对象代理
- 开始扫描
- 添加预览图层