Swift中如何从xib中加载类

我写了一个UIView的类方法

1
2
3
4
5
6
7
extension UIView {
class func viewFromXIB() -> UIView {
let classString = NSStringFromClass(self) as NSString
let view = NSBundle.mainBundle().loadNibNamed(classString.pathExtension, owner: nil, options: nil).first as! UIView
return view
}
}

这边使用NSStringFromClass(self) as NSString,由类取得类名的字符串,这边使用NSString,主要是swift的String方法我没有找到简便的方法来实现我的需求,比如现在的一个控件叫做CRLabel,而项目名为:Test01,那么由上面的操作,classString的值就会是Test01.CRLabel,在这里面Test01为命名空间,意思就是Test01命名空间下面的CRLabel文件,由于是去加载XIB文件,我们只需要后面CRLabel部分,而不需要命名空间,所以我们需要做截取工作,而.pathExtension方法正好满足我们的需求,故有了上面的写法。

写完了此分类后,以后从XIB加载文件,都可以愉快如下使用了:

lazy var label :CRLabel = {
        let view = CRLabel.viewFromXIB() as! CRLabel
        return view
}()

注:版权声明:本文为博主原创文章,未经博主允许不得转载。

解决Xcode7很卡,而且经常崩溃的问题

这两天Xcode7莫名变得奇怪,时不时卡,时不时崩溃,不管是重启啊,还是清理缓存啥的,都不见效,后面在网上看到相关处理方案,就是关掉ids_simd进程,网上的说法是这进程占用5G以上内存,这导致了Xcode很卡的原因,而在我MAC机上占用的并不多,只有40多M。另外一种方式,是关掉如下图所示的几个选项.
xcode

以上两种方式我都执行了,重启Xcode,一整个下午都很流畅了,后面,我把那几个勾又勾回去了,还是老样子,所以猜测第一种方案可能更有效一点,也不知道是不是瞎猫撞见死老鼠,反正我是有效果了,如果有遇到相同情况的而又无解决方案的,可以试试。

Objective-C 枚举转字符串

CREnumHelper.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#import <Foundation/Foundation.h>
//定义枚举类型
/**
* 消息类型
*/
typedef NS_ENUM(NSUInteger, XMPPMessageType){
XMPPMessageTypeText = 0, //文本
XMPPMessageTypeImage, //图片
XMPPMessageTypeVoice, //语音
XMPPMessageTypeSystemTip, //系统消息
XMPPMessageTypeFace, //表情
XMPPMessageTypeVideo, //视频
XMPPMessageTypeLocal //定位
};
static NSString *XMPPMessageTypes[] = {
[XMPPMessageTypeText] = @"文本",
[XMPPMessageTypeImage] = @"图片",
[XMPPMessageTypeVoice] = @"语音",
[XMPPMessageTypeSystemTip] = @"系统消息",
[XMPPMessageTypeFace] = @"表情",
[XMPPMessageTypeVideo] = @"视频",
[XMPPMessageTypeLocal] = @"定位"
};
extern NSString * const XMPPMessageTypeEnumToString(XMPPMessageType Key);
@interface CREnumHelper : NSObject
@end

CALayer

###简单介绍
在iOS中,一般你看得到的,点得着的都是View,比如一个按钮、一个文本输入框、或者图标,都是UIView,而CAlayer则是图层,他们最大的区别是UIView是可交互的,而CAlayer却是相反。

###CAlayer基本属性

常用属性 说明
cornerRadius 设置圆角
shadowOffset 设置阴影偏移量
shadowColor 设置阴影颜色
shadowOpacity 设置阴影透明度
shadowRadius 设置阴影半径
shadowPath 设置阴影路径
borderWidth 设置边框
borderColor 设置边框颜色
masksToBounds 子图层是否跟随主图层
transform 设置CATransform3D动画
position 用来设置CALayer在父层中的位置
zPosition 多个Layer时,数值大的会遮挡数值小的
anchorPoint 设置锚点
anchorPointZ 多个Layer时,数值小的会遮挡数值大的
bounds 参考UIView
frame 参考UIView
hidden 参考UIView
doubleSided 参考UIView
doubleSided 图层有双面
transform 解释
CATransform3DMakeAffineTransform(CGAffineTransform m) 设置2D变形
CATransform3DMakeRotation(angle, x, y, z) 设置3D旋转
CATransform3DMakeScale(x, y, z) 设置3D伸缩
CATransform3DMakeTranslation(x, y, z) 设置3D平移

基中position和anchorPoint,是CAlayer里面非常重要的两个属性,而且也比较容易误解,特别是锚点,position对于设置了frame的layer,他几乎等价于UIView里面的中点,而锚点,默认值为{0.5,0.5},决定着CALayer的某个点最终和position所在的点重合决定图层的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) CALayer *layer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view.layer addSublayer:self.layer];
self.layer.anchorPoint = CGPointMake(0, 0);
//self.layer.anchorPoint = CGPointMake(0.5, 0.5);
//self.layer.anchorPoint = CGPointMake(1, 1);
}
- (CALayer *)layer {
if (_layer == nil)
{
_layer = [[CALayer alloc]init];
_layer.backgroundColor = [UIColor blueColor].CGColor;
_layer.frame = CGRectMake(100, 100, 100, 100);
}
return _layer;
}

描点用例图
描点用例图
描点用例图
描点用例图

比方说用上面的代码创建了一个图层,则position的值为(50,50),为上图绿点表示,我们通过self.layer.anchorPoint改锚点的值,看上面的图,将能很好的理解,你不需要想太多,只要想着,锚点最终会和position点重合,套用上面图的做法,就可以了。

###属性设置注意事项

属性设置时,存在部分属性冲突问题,如设置了阴影,如果再设置masksToBounds属性为YES,则会发现阴影没有设置成功。

用Delegate或者是Block

在我做iOS,知道通常回调用 block 或者 delegate 来做,所以我一直就有几个问题,直到我看到了这文章,我觉得有好多想法和我走到一起的东西,也写写文章,来记录一下。

  • 什么时候用 block
  • 什么时候用 delegate
  • 后面出来的 block 那么强大,那么是不是它是不是可以完全取代delegate
  • 什么时候我是用 block 代替 delegate 用于回调

ReactiveCocoa 实现登录逻辑

  折腾了ReactiveCocoa不少天了,前面时间主要停留在看的阶段,今天通过一个小例子来记录一下,我遇到的一些问题,为减少篇幅,CRLoginViewController里面的内容,我主要贴核心部分,其他的UI啦啥的,就不在文章中贴了,例子内容我也简要描述一下,要求用户名为邮箱,要求密码不少于3位,如果不符合规则,则文本框背景为红色,符合规则则为白色,登录按钮摆设用,不是这次描述内容的关注点,所以直接略过吧,直接上图和代码:

ReactiveCocoa Login

与自己的对话

  距离上一次发博客已经有一个月之久了,这一个月,我几乎很难看到我的成长,我可以说我一个月都在折腾ReactiveCocoa,昨晚还在我妹子面前流利的说出R-E-A-C-T-I-V-E C-O-C-O-A,但我却没能喊出的实际读音,单词真的是看多了,我竟然就记下来了,而却没读出来,自然原因我知道是出在于懒(现在赶紧查百度补充一下,[riˈæktɪv],[ˈkəʊkəʊ]),但我每次都不会改。很多时候,我都会以我很忙,我忙不过来,我没时间,但当你回过神来,就像你每月到了还信用卡的时候,有时看到一笔不少的账单时,你会吃惊,你会想着查账,但却发现无账可查,这时你会凌乱了,并且说下个月不行,我要记录下来,可是到下一月,你还是会是那样,因为懒,我们总缺少了一份坚持。

OC-札记02

##C程序
代码

1
2
3
4
5
#include <stdio.h>
int main(){
printf("123\n");
return 0 ;
}

结果

1
2
3
4
5
6
cc -c 01.first.m
cc 01.first.o
./a.out
输入结果:123
这其中的过程分为,编译-链接-执行