swift学习笔记《1》

187 阅读6分钟

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.扫描二维码

  • 懒加载会话,输入,输出
  • 判断会话能不能添加输入输出 ,
  • 会话添加输入输出
  • 设置输出数据类型
  • 设置输出对象代理
  • 开始扫描
  • 添加预览图层