南山忆的技术博客

回忆是抓不住的月光,握紧就变黑暗

0%

本文提供两种简单的AttributedString的生成方式

  iOS中的NSAttributedString一直觉得不太好用,每次要加一个稍微复杂点的特征字符串就很麻烦,你可能会看到这样的代码

1
2
3
4
5
6
7
8
9
let attrS = NSMutableAttributedString(string: "回忆是抓不到的月光,")
let att1 = NSAttributedString(string: "握紧就变黑暗", attributes: [.font: UIFont.systemFont(ofSize: 20), .foregroundColor: UIColor.red ])
attrS.append(att1)
attrS.append(NSAttributedString(string: ",让虚假的背影消失于晴朗,阳光在"))
let attch = NSTextAttachment()
attch.image = UIImage(named: "Lock")
attch.bounds = CGRect(x: 0, y: -20, width: 50, height: 50)
attrS.append(NSAttributedString(attachment: attch))
attrS.append(NSAttributedString(string: "身上流转,等所有业障被原谅"))

创建一个不太复杂的字符串就需要很长的代码,而且不是很直观。

Read more »

简述

  iOS的新页面的弹出方式分为两种Push&PopPresent&Dismiss,转场方式的自定义也主要针对这两种方式进行。其中Push&Pop方式需要针对Push和Pop分别定义动画,也就是说需要分别创建动画文件。而Present&Dismiss方式的话只需要一个即可。

Read more »

  首先我们都知道在iOS应用启动的时候会调用所有类和其分类的+load方法。子类的load方法会在父类方法执行完成之后执行,分类的+load会在主类执行之后执行。不可继承,子类没有实现的时候,文件加载的时候是不会调用父类的load方法的。那么为什么+load的方法会有这样的特性,runtime又有哪些巧妙的处理呢。今天我们来刨根问底一下+load方法。

Read more »

KVC

  (KVC)键值编码相信大家都不陌生,常用来访问对象属性,也可以访问集合属性。还有一些可以给通过此方法访问一些系统没有开放的API,通过KVC的方式进行使用。(今天的重点不在这里,有需要自己看)

重点valueForKeyPath:

了解valueForKeyPath:方法

  它返回指定的键路径对应的值。如果keyPath中包含不符合规定的字符(比如没有这个属性字符)就会接收到一条valueForUndefinedKey:消息。

Read more »

Protocol Buffer简介

  Protocol Buffer是google于2008推出的一种数据交换的格式,它独立于语言,独立于平台。,google 提供了多种语言的实现,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 和 json 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。现今经过多个版本迭代已经到了3.x版本
  其实说白了Protocol Buffer就是一个协议,和解释器。可以用proto文件把model或者其他数据序列化Or反序列化(把二进制数据解析为Model或者把Model转为二进制数据)。它添加了多语言的支持,在不同语言下,遵守同样的协议(使用同样的proto),这样就可以保证在不同端,数据可以交互,而且不用担心数据的序列化问题。
  下面是支持的语言:

Language Source
C++ (include C++ runtime and protoc) src
Java java
Python python
Objective-C objectivec
C# csharp
JavaNano javanano
JavaScript js
Ruby ruby
Go golang/protobuf
PHP php
Dart dart-lang/protobuf
Read more »

  不知道大家有没有经历过,公司给配个mac,最低配,没有ssd,Cpu1.4GHz。全量编译一次一二十分钟,增量编译也要至少三分钟,尤其是在调UI的时候。真的是能捉急死人!
  搜罗各地找到一个比较实用的加快编译的方法。

Read more »

这个功能用的最多的就是在微博里面,里面有用户名@南山忆,网址http://www.jianshu.com/users/774b1d5616a7/latest_articles,#话题# 等需要特别现实,还需要有点击事件,这种情况下普通的label显示已经满足不了需求了。需要我们来自己写一个可实现相应功能的label。
  好了废话不多说,让我们开始,大致流程如下:

Read more »

NSString我们必不可少的类,但是在你@property的时候,到底是用Strong,还是Copy修饰。你用对了吗?

用例子来说明一下
先使用NSString
1
2
3
4
@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic,   copy) NSString *copyedStr;
//不可以写成copyStr会报property follows cocoa naming convention for returning 'owned' objects
//意思是不能使用copy来作为开头命名,copy是cocoa用的

  这里声明了两个NSString变量,一个用strong修饰,另一个用copy来修饰,下面我们来用一个NSString对两个string赋值。

Read more »

先来看一下效果


这是通过调用iOS的陀螺仪和加速度计。通过倾斜手机实现的效果

Core Motion

  加速度计和陀螺仪是通过Core Motion框架,来管理访问的。此框架提供了CMMotionManager类,它提供的数据都是用来描述设备的移动的。还提供了CMAccelerometerData和CMGroData,他们可以访问原生的加速度计和陀螺仪信息。另外还有CMDeviceMotion,这个类里面包含有加速度计和陀螺仪的测量数据,以及方位信息。即设备是平放,朝上,朝下,还是朝左等信息。话不多说还是直接上代码。
  先来个坐标系作为参考

Read more »

在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决。在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法。比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有可能你都知道,大神就不必往下看了)

控件的局部圆角问题

  你是不是也遇到过这样的问题,一个button或者label,只要右边的两个角圆角,或者只要一个圆角。该怎么办呢。这就需要图层蒙版来帮助我们了

1
2
3
4
5
6
7
8
CGRect rect = CGRectMake(0, 0, 100, 50);
CGSize radio = CGSizeMake(5, 5);//圆角尺寸
UIRectCorner corner = UIRectCornerTopLeft|UIRectCornerTopRight;//这只圆角位置
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corner cornerRadii:radio];
CAShapeLayer *masklayer = [[CAShapeLayer alloc]init];//创建shapelayer
masklayer.frame = button.bounds;
masklayer.path = path.CGPath;//设置路径
button.layer.mask = masklayer;

举例为button,其它继承自UIView的控件都可以

Read more »