-
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í)用到的名字不是文件名,而是字體名。

添加字體
-
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)
}
-
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)了!
-
打開項(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)顏色方格到代碼中去,直觀
-
14 - 手勢(shì)的過濾
- 有些時(shí)候上層視圖不需要識(shí)別特定手勢(shì),但上層視圖卻又自己攔截了
- 根據(jù)響應(yīng)鏈的傳遞,主動(dòng)讓上層視圖把事件傳遞給下層視圖
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里面的所有鍵盤遮擋問題
- 有很多種處理鍵盤遮擋問題

就一行
-
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)贊,打賞隨意哈!'



