自家也直接在用storyboard+自动布局的办法来搭建UI,则评释内存走漏了

  • #### 1 – 添加字体

    • 将下载好的字体.ttf文件添加进项目
    • 在品种布置的build 布Leighton沙滩se的copy bundle
      resources添加刚刚的书体文件
    • 在info.plist文件中添加新的一行叫Fonts provided by
      application。
      那是一个数组,数组添加刚刚的书体文件。eg:隶变体.ttf
    • 类型代码中援引时用到的名字不是文本名,而是字体名。

阿里IconFont平台

http://www.iconfont.cn/
那里是阿里Baba(Alibaba)UED机构付出的IconFont平台,近日Ali系的分量级产品都在动用,里面有为数不少财富可供使用。这里说说怎么在客户端内使用。
IconFont即便看起来是图标,实际原理跟字体的兑现格局是千篇一律的,所以大家把各类Icon当作一个出奇的文字来了然和处理。

图片 1

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

IconFont使用

  • 率先登录网站,搜索你要用的Icon,把它们进入购物车(点击就足以)。
  • 把购物车里的有着Icon存储在同三个品类中。
  • 跻身项目,接纳“下载至本土”。
  • 打开下载的公文,里面有贰个*.ttf文件,大家须求的具备字体就都在此处了。
  • .ttf文件放入项目,当使用时,把TextView(Android)或UILabel(IOS)的Font设置为加载.ttf生成的自定义字体。那里有个难题,怎么指明我们要来得哪1个Icon呢?
  • 下载贰个字体编辑软件,作者在Mac上边使用的是FontLab
    Studio
    ,打开*.ttf,找到每种图标对应的Unicode值,以”\ue600”那种情势赋值给TextView(Android)或UILabel(IOS)中的文本。就足以了。
  • 导入字体文件
    将字体文件拖入项目(ios襄助的字体格式有:.ttf、.otf,其他格式不分明)
![](https://upload-images.jianshu.io/upload_images/1845730-92f538ef2690aab2.png)

QQ20160508-0.png
  • 配置iconfont
    将.ttf文件添加到Xcode项目中去,在Build
    Phases配置中确保可以看看导入的文件。
![](https://upload-images.jianshu.io/upload_images/1845730-b7130272adf8f5ea.png)

QQ20160508-1.png



之后在项目的info.plist中,添加Fonts provided by
application字段。这字段是一个数组,可以为项目添加多个字体集。



![](https://upload-images.jianshu.io/upload_images/1845730-2133856876fa17e1.png)

QQ20160508-2.png
  • 找到图标对应的unicode码
    运用FontLab Studio
    5工具打开字体文件(比如fontello.ttf),就可以看看图标与unicode码之间的呼应关系啦。
![](https://upload-images.jianshu.io/upload_images/1845730-31f232960cce1417.png)

QQ20160508-3.png
  • 项目中应用

        let backBtn = UIButton(type: UIButtonType.Custom)
        // IconFont使用
        backBtn.titleLabel?.font = UIFont(name: "yunyou", size: 30)
//        backBtn.setTitle("", forState: .Normal)
        // Swift使用unicode码
        backBtn.setTitle("\u{E64B}", forState: .Normal)
        backBtn.titleLabel?.textAlignment = .Left
        backBtn.setTitleColor(UIColor.grayColor(), forState: .Normal)

怎么在storyboard里面使用xib,并且可以呈现xib效果?

iOS开发最基础的一步就是搭UI,有人用纯代码,有人用xib,有人用storyboard,代码手写UI,xib和StoryBoard间的对弈一直是大家养护商量的政工,小编以为那个事物都有各自的得失,在事实上付出进度中甄选适当的就可以了,没有要求说来制定二个规范,大家必须遵守的。

图片 2

IconFont优势

  • 图标集中处理,防止重复能源,设计师只要表明Color、Size就足以了。
  • 减掉包大小,各个IconFont只是一小段文本,文件大小要比图片方式的icon小3个数量级。
  • 节本省存,IconFont与常见文书一样是行使矢量图的点子绘制的,相比较图片的内存分配办法,消耗的内存可以忽略不计了。

大家先来说下他们分其他得失

添加字体

纯代码UI

纯代码UI在初期是大家都在行使的,当时并未storyboard,xib有各个坑,最关键的是代码UI易于维护(其实小编也没觉得怎么易于维护),最首要的是纯代码UI在对人搭档的时候,假若有争论可以很简单的发现哪个地方不相同,那几个是本身能体悟的最好的地方

  • #### 2 – 工厂情势

    • 自定义二个类,类名可取为通用易懂的名字,eg:GeneralFactory
    • 类里面可以定义常用的常量,那时候可以当作宏定义文件使用
    • 类里面设计多少个类似于addTitleWithTitle那样的办法,目的唯有1个,给目标定位添加控件可能事件

xib

一般用xib的时候都是代码UI和xib混用,文件耦合低,1个view一个XIB都足以,而且很便利复用

Storyboard

在机动布局出现今后,storyboard占据了相当大的商海,尤其适用独立开发者!小编也间接在用storyboard+自动布局的章程来搭建UI,适配起来尤其便宜,其中的便宜何人用何人知道。但是争辩的时候就丰裕不爽,所以本身一般是三个业务三个storyboard。大家可以花半天的时刻来上学一下storyboard和活动布局,相信会拿走良多的。

有关机关布局推荐一套相当的棒的稿子,相信只要用心看了,就能相当慢出手的

一、始发iOS
7中自动布局教程(一)

二、开首iOS
7中自行布局教程(二)
 

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)
}

正题

我们不深刻探讨做项目标时候采用哪个种类布局方案,笔者深信,合适的就是最好的。

后天做项目的时候要做贰个互联网状态指示框,作者不欣赏用代码布局,笔者选取用xib,可是在storyboard里面调用的时候遭受了坑,后来查了比比皆是资料终于爬出来了,以后分享给大家。

一经您不要sizeclass可以把storyboard里面的VCsize调小一些,或然可以更利于布局,当然也足以安装成free,更改方法:

图片 3

VC的size设置

厂子形式的支付情势,可以极大程度上的简要代码,幸免代码的过于重复,使编程成为每1回轻松欢跃的享用。

咱俩的须求,main.storyboard里面的ViewController调用自定义Xib的XVView

1.把xib的file‘s owner设为XVView

2.搭建xib和自行布局

图片 4

XVView.xib

3.@IBOutlet private var contView: UIView! 和xib的view绑定

前面须要重建contView

4.重写init方法:

required init?(coder aDecoder: NSCoder) {

super.init(coder: aDecoder)

initFromXIB()

}

func initFromXIB() {

let bundle = NSBundle(forClass: self.dynamicType)

let nib = UINib(nibName: “XVView”, bundle: bundle)

contView = nib.instantiateWithOwner(self, options: nil)[0] as!
UIView

contView.frame = bounds

self.addSubview(contView)

}

如此啊就足以采用storyboard举办引用,借使必要动用代码创造XVView
,还须求重写下边的点子:

override init(frame: CGRect) {

super.init(frame: frame)

initFromXIB()

}

迄今截止,大家就足以在storyboard的里边拉取3个view,设置class为XVView

图片 5

storyboard引用xib图1

也可以行使代码进行创办:

override func viewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view, typically from a
nib.

let xview  = XVView(frame: CGRectMake(20, 30, 280, 149))

self.view.addSubview(xview)

}

=

  • #### 3 – 闭包

    • 闭包自个儿是属于函数类型
    • 闭包就是匿名函数
    • 闭包的值捕获可以让它在不一样的类之间自由传值
    • 概念闭包从前可以先typealias一下函数类型

黑魔法!!!!!

上边才是大家本次的干货,大家的黑魔法先导了

比方大家可以实时在storyboard里面突显自定义的算计多好,那样大家就可以依照运营结果开展调整和校勘。在
Xcode 6 中,大家就曾经得以创立那样的 UIView 子类了:利用新加盟的
@IBDesignable 和 @IBInspectable。

vc1:
typealias CallBack = (title:String)->Void
class vc1:UIViewController{
    var 闭包:CallBack?
    self.闭包!(title:(self.titleTextField?.text)!)
}

vc2:
vc1.闭包 = {(string) in self.Book_Title = string}

@IBDesignable

@IBDesignable 可以将自定义的View实时渲染到Interface
Builder中。什么意思吧,我们得以钦命壹本性质在storyboard里面举办改动,我们看下怎么用

首先大家使用@IBDesignable来表明XVView

import UIKit

@IBDesignable class XVView: UIView {

下一场大家转到storyboard和下边的“storyboard引用xib图1”相比一下,我们会意识有神奇的变迁了:

图片 6

storyboard引用xib图2

storyboard里面突显了我们xib的情节!

  • #### 4 – 内存管理

    • swift中的闭包的行使不会循环引用,但不意味着不会内存走漏
    • 检查内存走漏的艺术,间接在类里面添加deinit方法

上边大家来讲首个黑魔法:

[deinit{
print(“Controller reallse”)

@IBInspectable

@IBInspectable 可以将自定义的习性实时渲染到Interface Builder中。

咱俩在 XVView中表明八个属性:

@IBInspectable var imageTitle:String?

{

get {

return imageTitleLabel.text

}

set(newTitle){

imageTitleLabel.text = newTitle

}

}

@IBInspectable var image:UIImage?

{

get {

return imageView.image

}

set(newImage) {

imageView.image = newImage

}

}

接下来大家会在storyboard里面找到他们:

图片 7

storyboard引用xib图3

下一场大家就可以对他们开展设置,比如:

图片 8

完结

@IBDesignable 和
@IBInspectable不仅仅可以用在xib搭建的自定义View,纯代码布局的自定义的
UIView
的子类也是足以应用的。那也侧面体现了二〇一六年今后Apple对于使用IB开发所下的决心。

对于电动布局小编想说下,出现争辩是因为布局逻辑出现了难题,比如添加了不等于的左右约束,又添加了垂直居中的约束。自动布局只要您的逻辑没有有失水准态,唯有你想不到的,没有您做不到的,不要把不会作为糟糕用。

咱俩的学科到那里就终止了,希望得以给我们带来启迪,代码我会上传出GIT,有必要的可以去下载

GitDemo 

}
假若成功析构,则尚未内存走漏。
一旦没有析构,没打印那句话,则注解内存败露了。]()

  • #### 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”)
  • 烦!所以指出1个控制器对应1个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

图片 9

添加支持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.添加第3方库
    • 此处强烈推荐IQKeyboardManager库化解键盘遮挡
    • 推荐理由:一行代码化解APP里面的兼具键盘遮挡难题

留意添加subViews的次第!

图片 10

就一行

  • #### 16 – map的高能组建数组格局

    • 想从3个数组转换到另三个封装类型的数组,一定要想到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能源的拿到格局

    • 过多时候想把能源文件统一放在1个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
    • 那还不算什么的话,它还可以直接扭转到您的体系文件夹里面
    • 宏大裁减了支付时间,推荐星级:

图片 11

APP Icon Gear

图片 12

APP Icon Gear

小结一句:你喜爱就好!

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

相关文章