终端使用中遇到的问题

文件出现 ^M 问题

^M 是回车符,他是源于 DOS/Windows 的,但是在 Unix 的系统中这样的符号在执行的时候会报错,在使用 vim 查看文件的时候会直接看到^M 而不是换行。

想替换掉^M,换成\r或者\n, 千万不要直接打上符号^M 进行替换,^M 这个符号要使用 ctrl+v & ctrl+m 生成,在 vim 中使用

:%s/^M/\r/g

进行替换所有回车符。

查看更多

分享到 评论

Vim常用操作命令

Vim是非常强大的文本编辑器,熟练使用vim会给使用linux带来很大帮助,现在很多流行的编辑器都以插件的形式支持vim编辑模式,也从另一面说明vim非常的流行。

使用 Vim 有很长一段时间了,感觉就是越熟悉越好用,刚开始用还是比较痛苦的,所以我把一些常用的命令记下来,有了下面这些命令,使用起 vim 就会更得心应手了。

  • 删除
    dd: 删除整行。
    dt+”字符”: 删除当前字符到指定字符,但不包含自定字符。
    df+”字符”: 删除当前字符到指定字符,且包含自定字符。
    di+”括号或者双引号,单引号,方括号等”: 删除当前的成对的括号内的全部字符,不包括括号。
    da+”括号或者双引号,单引号,方括号等”: 删除当前的成对的括号内的全部字符,包括括号。
    cw: 删除单词并切换为 insert 模式。
    ss: 删除当前字符并切换为 insert 模式。

查看更多

分享到 评论

自制自动布局约束开源库Lite Auto Layout

首先,贴上这个库的源码地址:https://github.com/MellongLau/LiteAutoLayout

这个库也写了好长一段时间了,由于最近忙,一直都没时间把它更新好放上来,特别是文档,拖了这么久总算是补全了一点了。至于好不好用,那就见仁见智了,我之前比较习惯用IB拖auto layout的约束,也是根据IB的使用概念来实现的这个库,下面也有提到这一点,所以,个人认为,习惯使用IB来布局的同学应该会比较容易上手和习惯使用吧。

然后就是,如果——

喜欢这个项目? 点击Github 里面的 Star按钮支持我们吧!

示例项目

可以下载 Demo 文件夹下的示例项目运行,下面是运行后的截图。

Demo

这是一个使用 LiteAutoLayout 编写布局约束的登录框界面,所有的约束代码都在下面的代码截图中:

Code

简介

最近在用 Swift 3.0,Swift 3.0给我们带来了很多新的特性,在学习过程中发现自定义操作符这个写法很适合来写 autolayout 的约束,结合自己平时使用 IB 来创建视图之间的约束的经验,决定使用自定义操作符来让使用代码创建约束更加直观,清晰和简单。

其中,~> 这个符号被我用来作为视图约束于其同级视图或者父级视图的表达式,如 (view1 ~> view2), 中间需要留空格,而创建对于自身的约束,可以使用(~>view1)来创建,中间不需要留空格,后面添加约束是用的简单方便的链式写法。

当然,如果你不想使用~>这个符号来创建约束,我还提供了startLayout()的方法直接创建约束,如:

1
view1.startLayout(toView: view2)

另外,因为项目中使用 IB 编写界面比较多,同时也觉得 IB 添加约束的用法比较简单和方便,所以这里使用的设置约束的方法是用了 IB 添加约束的概念,相信有用过 IB 应该都比较容易接受这种写法,在使用 LiteAutoLayout 后相信会加深对 IB 添加布局约束的理解,两种的使用相互促进,相互提高,这也是这个库的优势之一。

比较 NSLayoutConstraint vs NSLayoutAnchor vs LiteAutoLayout

如设置两个视图之间垂直的距离约束verticalSpacing(), 值得注意的是~>后面的视图默认是在上方,如果是添加水平距离,则~>后面的视图是在左边。

这个库是一个简单的封装,如果你使用过 sdk 原始创建约束的方法的话,你应该会被其繁琐的写法所吓倒。

这里引用 apple 官网的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 使用 NSLayoutConstraint 创建约束
NSLayoutConstraint(item: subview,
attribute: .Leading,
relatedBy: .Equal,
toItem: view,
attribute: .LeadingMargin,
multiplier: 1.0,
constant: 0.0).active = true

NSLayoutConstraint(item: subview,
attribute: .Trailing,
relatedBy: .Equal,
toItem: view,
attribute: .TrailingMargin,
multiplier: 1.0,
constant: 0.0).active = true


// 使用 Layout Anchors 创建相同的约束
let margins = view.layoutMarginsGuide

subview.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true
subview.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true

上面可以看到直接使用 NSLayoutConstraint 创建简单的布局约束需要繁复的代码,使用 NSLayoutAnchor 可以简化约束代码,那 LiteAutoLayout 到底表现如何,下面我们用 LiteAutoLayout 创建相同的布局约束:

1
2
// 使用 Lite Auto Layout 创建相同的约束
(subview ~> view).leading().trailing()

显然,使用 LiteAutoLayout 甚至比 NSLayoutAnchor 还简单,并且代码阅读更加清晰易懂,而且 NSLayoutAnchor 目前只支持 iOS9+,LiteAutoLayout 目前支持 iOS7+。

最后,需要注意的是:

  • 左边是子视图,右边为父视图(subview ~> view, 左侧的subview 是 view 的子视图)。
  • 左边是位于右边的视图的右侧或者下方(view2 ~> view1, 则 view2 在 view1的右侧或者下方)。

目前支持的特性:

  1. 支持>=, <=, ==操作符。
  2. 支持指定优先级。
  3. 支持链式写法。

如何安装

下载文件 LiteAutoLayout.swift 并将其复制到项目文件夹下,添加引用到项目中即可。

使用 LiteAutoLayout?

如果你在你的项目中使用了 LiteAutoLayout,请发邮件(邮件地址在下面)告诉我一声,我会把你的 app 的下载链接添加到这里!

贡献

欢迎为此项目提供任何的帮助,包括意见建议,资金,代码或者精神鼓励等,为此项目贡献代码请提交 pull request, 代码经过审核后会立即合并到主分支中。

License

MIT License

分享到 评论

iOS如何跳转到Facebook指定用户界面

第一步,先要检测Facebook是否安装,如果安装就直接跳转到app里面指定的用户主页,否则直接用浏览器打开指定的用户主页网页地址。

1
2
3
4
5
6
7
BOOL isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]] 
if (isInstalled) {
// 直接跳转到app里面指定的用户主页。
}
else {
// 用浏览器打开指定的用户主页网页地址。
}

值得注意的是,iOS9+需要的Info.plist里面加上键名为LSApplicationQueriesSchemes加上值:fb

使用下面代码进行跳转:

1
2
NSURL *url = [NSURL URLWithString:@"fb://profile/<facebook id>"]; 
[[UIApplication sharedApplication] openURL:url];

可以通过这个网站获取到你的Facebook id:http://findmyfbid.com/

分享到 评论

Swift 3.0之下标

类,结构体和枚举都可以定义下标,使用下标可以快速访问集合,列表或者序列的数据成员元素。可以使用someArray[index]来访问Array, 使用someDictionary[key]来访问Dictionary。

一个类型可以定义多个下标。

定义一个get set的下标:

1
2
3
4
5
6
7
8
subscript(index: Int) -> Int {
get {
// return an appropriate subscript value here
}
set(newValue) {
// perform a suitable setting action here
}
}

查看更多

分享到 评论

Swift中如何把UILabel数字的颜色设置为红色

这篇文章源于群友的一个问题:如何把『注:此商品只能整件(12的倍数发货),已选1袋,还差11袋』这段文字中的数字使用红色在 UILabel 中显示?

大概思路是:我们可以使用UILabelattribute string 属性,通过正则表达式匹配获取数字的范围,然后添加对应的 attribute。

查看更多

分享到 评论

Swift 3.0之枚举

枚举在编程中很多时候要用到,在 Swift 中,枚举具有更多的特性。

枚举语法

使用关键字 enum 定义一个枚举

1
2
3
enum SomeEnumeration {
// enumeration definition goes here
}

例如,指南针有四个方向:

1
2
3
4
5
6
enum CompassPoint {
case north
case south
case east
case west
}

这里跟 c 和 objective-c 不一样的是,Swift 的枚举成员在创建的时候没有给予默认的整型值。所以上面代码中的东南西北并不是0到3,相反,不同的枚举类型本身就是完全成熟的值,具有明确定义的CompassPoint类型。

查看更多

分享到 评论

pod setup命令失败解决方法

最近运行pod setup出现以下问题:

1
2
3
4
5
remote: Compressing objects: 100% (34/34), done.
error: RPC failed; curl 56 SSLRead() return error -3613.00 KiB/s
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

查看更多

分享到 评论

Swift 3.0之扩展

扩展可以为类,结构体,枚举和协议添加新的功能。包括可以对没有源码访问权限的类型进行扩展。扩展和 Objective-C 分类 的概念类似。(和 Objective-C 的分类不一样的是,Swift 扩展没有名称)。

在 Swift 中,扩展可以做到:

  • 添加计算的实例属性和计算的类型属性
  • 定义实例方法和类型方法
  • 提供新的初始化器
  • 定义下标
  • 定义并使用新的嵌套类型
  • 使现有类型符合协议

值得注意的是:扩展可以为类型添加功能,但是不可以重写现有的功能。

查看更多

分享到 评论

迁移到swift3.0有用的技巧

不久之前swift3.0发布了,新版本可以在Xcode 8中使用了,或者你可以直接从swift.org下载编译器。

从代码可读性来看,新版本有很多提升,函数调用的连续性,更好的命名约定和移除了部分c风格的元素。

从代码可读性来来看,NS前缀已经从Foundation类型中移除,例如NSBundle.mainBundle()现在改为Bundle.mainBundle().

查看更多

分享到 评论