美文网首页IOS开发iOS_收藏iOS开发
[精]这里面的,你懂多少?(价值998元的iOS技能未完待续..

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

作者: ChinaSwift | 来源:发表于2017-06-07 09:31 被阅读376次
    • 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

    总结一句:你喜欢就好!

    '各位邻居街坊们,点赞,打赏随意哈!'

    相关文章

      网友评论

      • 32d457acafb3:原来开发可以玩的那么溜!文中分享了很多提高开发效率的方法!良心文章,点赞:+1:

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

      本文链接:https://www.haomeiwen.com/subject/gezotxtx.html