[精]这之中的,你了解多少?(价值998头条之iOS技能未完待续…iOS 字体图标文件。

  • #### 1 – 添加字体

    • 用生充斥好之字体.ttf文件上加进项目
    • 当档次安排的build Phrase的copy bundle
      resources添加正好的书体文件
    • 每当info.plist文件中补充加新的一模一样推行让Fonts provided by
      application。
      顿时是一个屡屡组,数组添加刚刚的字体文件。eg:隶变体.ttf
    • 种代码中援引时用到的讳不是文本称,而是字体名。

于iOS项目中,一般对图纸资源要求发生@2x,@3x两法,以适配不同分辨率的装置。对于生换肤需求的APP来说,还待差不多拟图来配合不同之主题。这样不但无形中增加了开发者和设计者的工作量,而且会增大APP的体积。为了释放开发者、设计者的双手及给APP“减再”,iconfont被引入到iOS开发被来。

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

iconfont,从字面上便能够领悟她便是书,让开发者像用字体一样采用图标。

澳门1495娱乐 1

制作iconfont

生成iconfont需要矢量图。一些网站提供生成iconfont的劳动,比如icomoon和Fontello。阿里巴巴矢量图标库和easyicon提供大量了不起之矢量图。
icomoon和fontello均好透过导入SVG图标或者选择网站本身提供的图标来生成iconfont。值得一提的是,icomoon还好生成PNG,PDF,CSH等格式。本文为icomoon作为转变工具。
当变化的文书夹着,可以找到扩展名为.ttf的书集文件。

补充加字体

配置iconfont

将.ttf文件上加至Xcode项目蒙失,在Build
Phases配置中确保好看看导入的公文。

此后于项目之info.plist中,添加Fonts provided by
application字段。这字段是一个屡组,可以吧品种上加多个字体集。

  • #### 2 – 工厂模式

    • 于定义一个好像,类名可取为通用易懂的名字,eg:GeneralFactory
    • 类里可以定义常用的常量,这时候可以当作宏定义文件使用
    • 看似中设计几乎个像样于addTitleWithTitle这样的艺术,目的就来一个,给目标定位添加控件或者波

使用iconfont

当动用前,让咱们回来生成的文本夹着,在和.ttf的同一个目下,可以找到同名的.svg文件。这是一个xml文件,每一个<glyph>标签对应一个矢量图标,包含它对应之unicode代码和名。我们虽经这个代码在Xcode中运用这些图标。这些代码是&#xXXXX格式的,在Xcode中需转移成\UXXXXXXXX格式的。可以运用在线编码工具进行转译。

<glyph unicode="&#xe900" glyph-name="home" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" />

图标对应之unicode为”&#xe900″, 对应之字符串为”\ U0000E900″,
这个可以经FontLab Studio软件来查阅。

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 60, 300, 50)];
label.font = [UIFont fontWithName:@"icomoon" size:35];
label.text = @"\U0000E900";
label.textColor = [UIColor redColor];
[self.view addSubview:label];
// 按钮示例,FontAwesome是文件名,iconString是unicode转换后的字符串
[button_2 setTitle:[NSString stringWithFormat:@" %@ Delete按钮",iconString] forState:UIControlStateNormal];
    [button_2.titleLabel setFont:[UIFont fontWithName:@"FontAwesome" size:14]];

这么,在运行之后,就可以看到一个图标。

相似情况下,iconfont多用来UIImage类。可以写一个UIImage+iconfont的分类来落实icon作为图片的成效。

.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UIImage(UIImageFontExt)
+ (UIImage*)imageWithIcon:(NSString*)iconCode inFont:(NSString*)fontName size:(NSUInteger)size color:(UIColor*)color;
@end

.m
#import "UIImage+IconFont.h"
@implementation UIImage(UIImageFontExt)
+ (UIImage*)imageWithIcon:(NSString*)iconCode inFont:(NSString*)fontName size:(NSUInteger)size color:(UIColor*)color {
    CGSize imageSize = CGSizeMake(size, size);
    // opaque:NO 不透明
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, [[UIScreen mainScreen] scale]);
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, size, size)];
    label.font = [UIFont fontWithName:fontName size:size];
    label.text = iconCode;
    if(color){
        label.textColor = color;
    }
    [label setNumberOfLines:0];
    label.textAlignment = NSTextAlignmentCenter;
    // 渲染自身
    [label.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *retImage = [UIGraphicsGetImageFromCurrentImageContext() imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIGraphicsEndImageContext();
    return retImage;
}
@end
  • 优点
    可以叫开发者在代码中一直指向图标进行体制的改,而且未欲考虑分辨率适配的题目。

  • 缺点
    保安起来比累。每一样不良生成.ttf文件包含的图标个数是得之,如果欲添加,要以selection.json文件导入到生成器中,添加新的图标,再生成新的.ttf。
    于代码中,使用宏定义将unicode转换成为有义的字符串,更方便使用和维护。

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

澳门1495娱乐 2

丰富支持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下载至本地

    • 开辟项目文件

    ![](https://upload-images.jianshu.io/upload_images/2486936-140cdf037707b25d.png)

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



    ![](https://upload-images.jianshu.io/upload_images/2486936-1b659823e4e32675.png)



    ![](https://upload-images.jianshu.io/upload_images/2486936-d54d1f7d5b1a7aa9.png)

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

-   当然还有一种方法是通过命令行解包,原理一样,不再赘述
  • #### 13 – Xcode颜色管理软件Sip

    • 立Xcode一更新,之前以Xcode安装的插件就是得重装,甚是抑郁
    • 考虑到更设置插件的害处,暂时不安装插件
    • 而是经过安装软件来支援Xcode,比如非常推荐的颜料提取工具Sip
    • 立即款软件200%好用,如果是简单以,那么她不管需教程
    • 要你想愈逼格打造颜色体系,那么它们也断然是首选
    • 引进理由:直接拖动颜色方格及代码中去,直观
    ![](https://upload-images.jianshu.io/upload_images/1326212-93ad913c25de25d2.png)

介绍地点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的顺序!

澳门1495娱乐 3

就一行

  • #### 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)! + "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
    • 这尚不算什么的说话,它还足以直接扭转到您的路文件夹里面
    • 巨大缩短了出时间,推荐星级:

澳门1495娱乐 4

APP Icon Gear

澳门1495娱乐 5

APP Icon Gear

总一句:你欢喜就哼!

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

相关文章