[精]这里面的,你懂多少?(价值998元的iOS技能未完待续...

  • 1 - 添加字体

    • 将下载好的字体.ttf文件添加进项目
    • 在项目配置的build Phrase的copy bundle resources添加刚刚的字体文件
    • 在info.plist文件中添加新的一行叫Fonts provided by application。
      这是一个数组,数组添加刚刚的字体文件。eg:隶变体.ttf
    • 项目代码中引用时用到的名字不是文件名,而是字体名。

eg:
在finder中打开字体.ttf,标题显示是Bauhaus ITC。
btn1.titleLabel?.font = UIFont(name: "Bauhaus ITC", size: 18)

添加字体
  • 2 - 工厂模式

    • 自定义一个类,类名可取为通用易懂的名字,eg:GeneralFactory
    • 类里面可以定义常用的常量,这时候可以当作宏定义文件使用
    • 类里面设计几个类似于addTitleWithTitle这样的方法,目的只有一个,给目标固定添加控件或者事件
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 - 闭包

    • 闭包本身是属于函数类型
    • 闭包就是匿名函数
    • 闭包的值捕获可以让它在不同的类之间自由传值
    • 定义闭包之前可以先typealias一下函数类型
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 - 内存管理

    • swift中的闭包的使用不会循环引用,但不代表不会内存泄露
    • 检查内存泄露的方法,直接在类里面添加deinit方法

[deinit{
print("Controller reallse")

}
如果成功析构,则没有内存泄露。
如果没有析构,没打印那句话,则表明内存泄露了。]()

  • 5 - 动态创建类

    • 开发项目经常遇到根据类名去创建访问类
    • 本质就是通过字符串方式创建类
    • swift暂时并没有直接提供接口,需要简单造轮
guard let name = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {  
  print("获取命名空间失败")
  return  
} 
let class: AnyClass? = NSClassFromString(name + "." + VCName) //VCName:表示试图控制器的类名  
// Swift中如果想通过一个Class来创建一个对象, 必须告诉系统这个Class的确切类型  
guard let typeClass = class as? UIViewController.Type else {  
  print("class不能当做UIViewController")
  return  
}  
let childController = typeClass.init()  
  • 6 - 初始化StoryBoard的ViewController

    • 经常看到
let home = storyboard.instantiateViewController(withIdentifier: “Homer”)
  • 烦!所以建议一个控制器对应一个Storyboard,好处很多
  • 名字一致,方便调用
  • 直接调用vc.storyboardInstance()就OK
static func storyboardInstance() -> ThreeViewController? {
        let storyboard = UIStoryboard(name:"ThreeViewController" ,bundle: nil)
        return  storyboard.instantiateViewController(withIdentifier: "ThreeViewController") as?ThreeViewController
    }
  • 7 - 让没有内容的cell消失

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

    • 可在info.plist里添加一项App Transport Security Settings
    • 再将里面的Allow Arbitrary Loads 设置成YES
添加支持HTTP
  • 9 - 导航条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 - 根据子视图获取所在控制器(超有用)

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素材资源

    • 很多时候想借鉴出色APP的图片资源

    • 当解压ipa程序包的时候,只能获取到一部分图片素材

    • 绝大部分素材封装在叫Assets.car的文件夹里面,一般打不开

    • 这时候好用的开源工具cartool就派上用场了!

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

    • 打开项目文件


    • 然后通过 product–>scheme–>edit scheme,然后分别添加 “Assets.car的文件路径“和“存放解压后图片的文件夹路径



    • 添加完毕关闭这个窗口运行下程序,这样所有Assets.car中所有的资源都解包到你所指定的路径中了

    • 当然还有一种方法是通过命令行解包,原理一样,不再赘述

  • 13 - Xcode颜色管理软件Sip

    • 当下Xcode一更新,之前在Xcode安装的插件就得重装,甚是烦恼
    • 考虑到重复安装插件的弊端,暂时不安装插件
    • 而是通过安装软件来协助Xcode,比如非常推荐的颜色提取工具Sip
    • 这款软件200%好用,如果是简单使用,那么它无需教程
    • 如果你想高逼格打造颜色体系,那么它也绝对是首选
    • 推荐理由:直接拖动颜色方格到代码中去,直观


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

  • 14 - 手势的过滤

    • 有些时候上层视图不需要识别特定手势,但上层视图却又自己拦截了
    • 根据响应链的传递,主动让上层视图把事件传递给下层视图

eg:

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

    • 有很多种处理键盘遮挡问题
      • 1.创建scrollView
      • 2.改变约束
      • 3.添加第三方库
    • 这里强烈推荐IQKeyboardManager库解决键盘遮挡
    • 推荐理由:一行代码解决APP里面的所有键盘遮挡问题

注意添加subViews的顺序!

就一行
  • 16 - map的高能组建数组方式

    • 想从一个数组转换成另一个封装类型的数组,一定要想到map方式
    • map采用闭包的形式极为开发者省去了诸多代码
    • map的逻辑非常简单易懂
    • 注意:map返回的是一个你指定类型的数组
eg1:
//   下面两种方式是一个意思
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)
       }

这里有老司机对map和flatMap的解说
http://www.jianshu.com/p/8a9998c137fc

  • 17 - 非mainBundle资源的获取方式

    • 很多时候想把资源文件统一放在一个bundle里
    • 也有很多时候想去调用项目中cocoapods管理库下的bundle资源
    • 这此不再从项目配置的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设计界面的时候,想一边改变值,一边看到效果
    • 这时候@IBDesignable和@IBInspectable可以帮你实现这个梦想
    • 比如Label在属性检查框里面并没有开放出cornerRadius
    • 要想改变cornerRadius,要么在代码中更改,要么就是@IB这两个关键字
@IBDesignable
class GRLabel:UILabel{
    @IBInspectable var cornerRadius1:CGFloat = 0{
        didSet{
            self.layer.cornerRadius = cornerRadius1
            self.layer.masksToBounds = true
        }
    }
}
  • 19 - 集合的过滤筛选fliter方法

    • 用好自带的框架方法,可以在数据处理时事半功倍
    • 比如便捷的fliter方法,对集合类型的数据都有效
    • 官方提供的example是对数组的过滤
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
 let shortNames = cast.filter { $0.characters.count < 5 }
 print(shortNames)
// Prints "["Kim", "Karl"]"
  • 而现在也给一个对字典的过滤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 - 超简便的图标处理工具APP Icon Gear

    • 假如你身边并没有UI工程师,那么开发自己的APP时,很多素材你需要自己去处理
    • APP Icon Gear这款工具,不管你拖入一个多大的image,它都自动帮你生成一个标准的imageSet
    • 这还不算什么的话,它还可以直接生成到你的项目文件夹里面
    • 极大缩短了开发时间,推荐星级:🎖🎖🎖🎖🎖
APP Icon Gear
APP Icon Gear

总结一句:你喜欢就好!

'各位邻居街坊们,点赞,打赏随意哈!'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,441评论 1 14
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,036评论 29 470
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 每次填个人资料的表格,都会有一项特长或者爱好一栏。通常特长我都是一个空白状态,爱好只会写上读书。 自己就是一个普普...
    伍年年阅读 198评论 1 4
  • 第一次在西游记里听到过你的名字总觉得大雁与塔并不应景那位年轻的僧人走出一个盛唐孤独的行走在找寻的路上至今仍在西游的...
    冷榆阅读 778评论 15 22