swift學習筆記《1》

ytmaylover發表於2018-09-05

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.掃描二維碼

  • 懶載入會話,輸入,輸出
  • 判斷會話能不能新增輸入輸出 ,
  • 會話新增輸入輸出
  • 設定輸出資料型別
  • 設定輸出物件代理
  • 開始掃描
  • 新增預覽圖層

相關文章