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.掃描二維碼
- 懶載入會話,輸入,輸出
- 判斷會話能不能新增輸入輸出 ,
- 會話新增輸入輸出
- 設定輸出資料型別
- 設定輸出物件代理
- 開始掃描
- 新增預覽圖層