[精]這里面的,你懂多少?(價(jià)值998元的iOS技能未完待續(xù)...

  • 1 - 添加字體

    • 將下載好的字體.ttf文件添加進(jìn)項(xiàng)目
    • 在項(xiàng)目配置的build Phrase的copy bundle resources添加剛剛的字體文件
    • 在info.plist文件中添加新的一行叫Fonts provided by application。
      這是一個(gè)數(shù)組,數(shù)組添加剛剛的字體文件。eg:隸變體.ttf
    • 項(xiàng)目代碼中引用時(shí)用到的名字不是文件名,而是字體名。

eg:
在finder中打開字體.ttf,標(biāo)題顯示是Bauhaus ITC。
btn1.titleLabel?.font = UIFont(name: "Bauhaus ITC", size: 18)

添加字體
  • 2 - 工廠模式

    • 自定義一個(gè)類,類名可取為通用易懂的名字,eg:GeneralFactory
    • 類里面可以定義常用的常量,這時(shí)候可以當(dāng)作宏定義文件使用
    • 類里面設(shè)計(jì)幾個(gè)類似于addTitleWithTitle這樣的方法,目的只有一個(gè),給目標(biāo)固定添加控件或者事件
class GeneralFactory: NSObject {
    static var fileManager = NSFileManager.defaultManager()
    static var currentUser = AVUser.currentUser()  
    static func addTitleWithTitle(target:UIViewController,leftTitle:String = "取消",rightTitle:String = "確定"){
        let btn1 = UIButton(frame: CGRectMake(10,20,40,20))
        btn1.setTitle(leftTitle, forState: .Normal)
        btn1.setTitleColor(MAIN_RED, forState: .Normal)
        btn1.contentHorizontalAlignment = .Left
        btn1.titleLabel?.font = UIFont(name: MY_FONT, size: 18)
        btn1.tag = 1234
        target.view.addSubview(btn1)
        btn1.addTarget(target, action: Selector("close"), forControlEvents: .TouchUpInside)
}

工廠模式的開發(fā)模式,能夠極大程度上的簡潔代碼,避免代碼的過度重復(fù),使編程成為每一次輕松愉悅的享受。

  • 3 - 閉包

    • 閉包本身是屬于函數(shù)類型
    • 閉包就是匿名函數(shù)
    • 閉包的值捕獲可以讓它在不同的類之間自由傳值
    • 定義閉包之前可以先typealias一下函數(shù)類型
vc1:
typealias CallBack = (title:String)->Void
class vc1:UIViewController{
    var 閉包:CallBack?
    self.閉包!(title:(self.titleTextField?.text)!)
}
vc2:
vc1.閉包 = {(string) in self.Book_Title = string}
  • 4 - 內(nèi)存管理

    • swift中的閉包的使用不會(huì)循環(huán)引用,但不代表不會(huì)內(nèi)存泄露
    • 檢查內(nèi)存泄露的方法,直接在類里面添加deinit方法

[deinit{
print("Controller reallse")

}
如果成功析構(gòu),則沒有內(nèi)存泄露。
如果沒有析構(gòu),沒打印那句話,則表明內(nèi)存泄露了。]()

  • 5 - 動(dòng)態(tài)創(chuàng)建類

    • 開發(fā)項(xiàng)目經(jīng)常遇到根據(jù)類名去創(chuàng)建訪問類
    • 本質(zhì)就是通過字符串方式創(chuàng)建類
    • swift暫時(shí)并沒有直接提供接口,需要簡單造輪
guard let name = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {  
  print("獲取命名空間失敗")
  return  
} 
let class: AnyClass? = NSClassFromString(name + "." + VCName) //VCName:表示試圖控制器的類名  
// Swift中如果想通過一個(gè)Class來創(chuàng)建一個(gè)對(duì)象, 必須告訴系統(tǒng)這個(gè)Class的確切類型  
guard let typeClass = class as? UIViewController.Type else {  
  print("class不能當(dāng)做UIViewController")
  return  
}  
let childController = typeClass.init()  
  • 6 - 初始化StoryBoard的ViewController

    • 經(jīng)??吹?/li>
let home = storyboard.instantiateViewController(withIdentifier: “Homer”)
  • 煩!所以建議一個(gè)控制器對(duì)應(yīng)一個(gè)Storyboard,好處很多
  • 名字一致,方便調(diào)用
  • 直接調(diào)用vc.storyboardInstance()就OK
static func storyboardInstance() -> ThreeViewController? {
        let storyboard = UIStoryboard(name:"ThreeViewController" ,bundle: nil)
        return  storyboard.instantiateViewController(withIdentifier: "ThreeViewController") as?ThreeViewController
    }
  • 7 - 讓沒有內(nèi)容的cell消失

    • tableView?.tableFooterView = UIView()
  • 8 - 添加支持HTTP

    • 可在info.plist里添加一項(xiàng)App Transport Security Settings
    • 再將里面的Allow Arbitrary Loads 設(shè)置成YES
添加支持HTTP
  • 9 - 導(dǎo)航條backItem的title消失

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics: .Default)
  • 10 - 取消cell的選中效果的兩種方法

    • cell?.selectionStyle = .None
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.tableView?.deselectRowAtIndexPath(indexPath, animated: true)
}
  • 11 - 根據(jù)子視圖獲取所在控制器(超有用)

extension UIView {  
    func findController() -> UIViewController! {
        return self.findControllerWithClass(UIViewController.self)
    }
    func findNavigator() -> UINavigationController! {
        return self.findControllerWithClass(UINavigationController.self)
    } 
    func findControllerWithClass<T>(_ clzz: AnyClass) -> T? {
        var responder = self.next
        while(responder != nil) {
            if (responder!.isKind(of: clzz)) {
                return responder as? T
            }
            responder = responder?.next
        }   
        return nil
    }
}
  • 12 - 獲取Assets.car素材資源

    • 很多時(shí)候想借鑒出色APP的圖片資源

    • 當(dāng)解壓ipa程序包的時(shí)候,只能獲取到一部分圖片素材

    • 絕大部分素材封裝在叫Assets.car的文件夾里面,一般打不開

    • 這時(shí)候好用的開源工具cartool就派上用場(chǎng)了!

    • 先去https://github.com/steventroughtonsmith/cartool下載到本地

    • 打開項(xiàng)目文件


    • 然后通過 product–>scheme–>edit scheme,然后分別添加 “Assets.car的文件路徑“和“存放解壓后圖片的文件夾路徑



    • 添加完畢關(guān)閉這個(gè)窗口運(yùn)行下程序,這樣所有Assets.car中所有的資源都解包到你所指定的路徑中了

    • 當(dāng)然還有一種方法是通過命令行解包,原理一樣,不再贅述

  • 13 - Xcode顏色管理軟件Sip

    • 當(dāng)下Xcode一更新,之前在Xcode安裝的插件就得重裝,甚是煩惱
    • 考慮到重復(fù)安裝插件的弊端,暫時(shí)不安裝插件
    • 而是通過安裝軟件來協(xié)助Xcode,比如非常推薦的顏色提取工具Sip
    • 這款軟件200%好用,如果是簡單使用,那么它無需教程
    • 如果你想高逼格打造顏色體系,那么它也絕對(duì)是首選
    • 推薦理由:直接拖動(dòng)顏色方格到代碼中去,直觀


介紹地址https://www.waerfa.com/sip-color-picker

  • 14 - 手勢(shì)的過濾

    • 有些時(shí)候上層視圖不需要識(shí)別特定手勢(shì),但上層視圖卻又自己攔截了
    • 根據(jù)響應(yīng)鏈的傳遞,主動(dòng)讓上層視圖把事件傳遞給下層視圖

eg:

extension UIScrollView{
override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  self.next?.touchesBegan(touches, with: event)
}  
  • 15 - 鍵盤遮擋處理神器IQKeyboardManager

    • 有很多種處理鍵盤遮擋問題
      • 1.創(chuàng)建scrollView
      • 2.改變約束
      • 3.添加第三方庫
    • 這里強(qiáng)烈推薦IQKeyboardManager庫解決鍵盤遮擋
    • 推薦理由:一行代碼解決APP里面的所有鍵盤遮擋問題

注意添加subViews的順序!

就一行
  • 16 - map的高能組建數(shù)組方式

    • 想從一個(gè)數(shù)組轉(zhuǎn)換成另一個(gè)封裝類型的數(shù)組,一定要想到map方式
    • map采用閉包的形式極為開發(fā)者省去了諸多代碼
    • map的邏輯非常簡單易懂
    • 注意:map返回的是一個(gè)你指定類型的數(shù)組
eg1:
//   下面兩種方式是一個(gè)意思
imageV.animationImages = (1...4).map({ (int) -> UIImage in
         UIImage(named: "MyLucky\(int)")!
})
 imageV.animationImages = (1...4).map{
          UIImage(named: "MyLucky\($0)")!
 }
eg2:
   //   map的酸爽用法
        let mapPointArr =  pointArr.map { (i) -> BMKMapPoint in
        BMKMapPointForCoordinate(i.coordinate)
        }
        let mapPointArr = pointArr.map { BMKMapPointForCoordinate($0.coordinate)
       }

這里有老司機(jī)對(duì)map和flatMap的解說
http://www.itdecent.cn/p/8a9998c137fc

  • 17 - 非mainBundle資源的獲取方式

    • 很多時(shí)候想把資源文件統(tǒng)一放在一個(gè)bundle里
    • 也有很多時(shí)候想去調(diào)用項(xiàng)目中cocoapods管理庫下的bundle資源
    • 這此不再從項(xiàng)目配置的Copy Bundle Resources中解決問題
    • 直接擼代碼
     let bundlePath = (Bundle.main.resourcePath)! + “/你想獲取資源所在的bundle名.bundle/"
        let bundle = Bundle(path: bundlePath)
        var tmpBundle : String?
        tmpBundle = (bundle?.resourcePath)! + "/images/icon_nav_bus.png"
        if let imagePath =  tmpBundle{
            if let image = UIImage(contentsOfFile: imagePath){
                annotationView?.image = image
            }    
        }else{
            print("---not found image---")
        }
  • 18 - 用好@IBDesignable和@IBInspectable

    • 在用storyboard設(shè)計(jì)界面的時(shí)候,想一邊改變值,一邊看到效果
    • 這時(shí)候@IBDesignable和@IBInspectable可以幫你實(shí)現(xiàn)這個(gè)夢(mèng)想
    • 比如Label在屬性檢查框里面并沒有開放出cornerRadius
    • 要想改變cornerRadius,要么在代碼中更改,要么就是@IB這兩個(gè)關(guān)鍵字
@IBDesignable
class GRLabel:UILabel{
    @IBInspectable var cornerRadius1:CGFloat = 0{
        didSet{
            self.layer.cornerRadius = cornerRadius1
            self.layer.masksToBounds = true
        }
    }
}
  • 19 - 集合的過濾篩選fliter方法

    • 用好自帶的框架方法,可以在數(shù)據(jù)處理時(shí)事半功倍
    • 比如便捷的fliter方法,對(duì)集合類型的數(shù)據(jù)都有效
    • 官方提供的example是對(duì)數(shù)組的過濾
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
 let shortNames = cast.filter { $0.characters.count < 5 }
 print(shortNames)
// Prints "["Kim", "Karl"]"
  • 而現(xiàn)在也給一個(gè)對(duì)字典的過濾example
let Dictionarys = [“a”:1,“b”:2,“c”:3]
let afterFliter = Dictionarys.filter { (item:(key: String, value: Int)) -> Bool in
            item.value == 2
        }
print(afterFliter)
//Prints [(“b”,2)]
  • 20 - 超簡便的圖標(biāo)處理工具APP Icon Gear

    • 假如你身邊并沒有UI工程師,那么開發(fā)自己的APP時(shí),很多素材你需要自己去處理
    • APP Icon Gear這款工具,不管你拖入一個(gè)多大的image,它都自動(dòng)幫你生成一個(gè)標(biāo)準(zhǔn)的imageSet
    • 這還不算什么的話,它還可以直接生成到你的項(xiàng)目文件夾里面
    • 極大縮短了開發(fā)時(shí)間,推薦星級(jí):??????????
APP Icon Gear
APP Icon Gear

總結(jié)一句:你喜歡就好!

'各位鄰居街坊們,點(diǎn)贊,打賞隨意哈!'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,727評(píng)論 1 14
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,606評(píng)論 30 472
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評(píng)論 19 139
  • 每次填個(gè)人資料的表格,都會(huì)有一項(xiàng)特長或者愛好一欄。通常特長我都是一個(gè)空白狀態(tài),愛好只會(huì)寫上讀書。 自己就是一個(gè)普普...
    伍年年閱讀 355評(píng)論 1 4
  • 第一次在西游記里聽到過你的名字總覺得大雁與塔并不應(yīng)景那位年輕的僧人走出一個(gè)盛唐孤獨(dú)的行走在找尋的路上至今仍在西游的...
    冷榆閱讀 812評(píng)論 15 22

友情鏈接更多精彩內(nèi)容