UIColor的RGB支持

我们都知道UIColor 开发的过程中有些很坑的问题,ps和其他一般取色软件获取到的颜色值一般都是16进制的RGB值(如:#ffaabb),但是UIColor的API不支持16进制值直接创建,这个时候各路大神就各显神通了

比如宏定义:

//定义rgb颜色 用法:UIColor *color=UIColorFromRGB(0x067AB5);
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

还有静态函数

UIColor* UIColorFromRGB(NSInteger rgbValue) {
    return [UIColor colorWithRed:((float) ((rgbValue & 0xFF0000) >> 16)) / 0xFF
                           green:((float) ((rgbValue & 0xFF00)   >> 8))  / 0xFF
                            blue:((float)  (rgbValue & 0xFF))            / 0xFF
                           alpha:1.0];
}

或者分类(类别)

+ (UIColor *)colorWithRGB:(NSInteger)rgbValue{
    return [UIColor colorWithRed:((float) ((rgbValue & 0xFF0000) >> 16)) / 0xFF
                           green:((float) ((rgbValue & 0xFF00)   >> 8))  / 0xFF
                            blue:((float)  (rgbValue & 0xFF))            / 0xFF
                           alpha:1.0];
}

OK,到此为止,代码内支持RGB颜色设置已经搞定,那么还有个问题,就是Xib/StoryBoard上设置RGB也是很麻烦的事情,那么这时候就需要一个插件来完成了。
百度云(密码: fjv1)

下载完后,解压zib包,然后拷贝HexColorPicker.colorPicker,
打开Finder->前往->前往文件夹(快捷键shift+command+g),输入~/Library/ColorPickers,粘贴到ColorPickers文件夹下,然后万事大吉

然后xib中修改颜色的地方,选择其他,然后选择最右侧的标签,出现如下图所示:

ps:今天的博客简直没有技术含量,但是对开发还是有点帮助的,大家看看就好

以上

iOS限制文字长度(支持中文)

首先,今天是五一,大家节日快乐4fff9fed44c2ceac44c6f啦啦啦啦,可以肆无忌惮的奔弛啦,该浪的浪,该约的约,该xx的xx

嗯,废话结束,话说一种很常见的问题,就是限制文字长度,几乎所有APP都会有这个需求,但是呢,当碰到中文输入不知道大家是否碰到过问题,就是拼音也在长度计算之内!!!!简直不能忍!

so,这种五一的时候,给大家一点奉献,奉献完了我就出门浪咯~~

首先,问题分析,实际上的情况就是,中文输入的时候,拼音是在输入框内,然后是选中状态的,就比如这样:QQ20150501-1@2x,就是说拼音是选中状态的,那么可以根据UITextInput 协议计算出选中文字的UITextRange,然后根据UITextRange计算NSRange,就能知道非选中状态下的中文文字字符串了,当然,以上问题在iOS7下没问题!!

OK,上代码:

#import "ViewController.h"
#import "UITextRange+ELVSubject.h"

//是否iOS7/iOS8
#define IOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]&gt;=7&amp;&amp;[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]<8)
#define IOS8 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=8)

@interface ViewController ()<UITextFieldDelegate>;

@end

@implementation ViewController

- (void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkTextFieldTextLength:) name:UITextFieldTextDidChangeNotification object:nil];
}

- (void)checkTextFieldTextLength:(NSNotification *)noti{
    UITextField *textField = noti.object;
    NSString *text = textField.text;
    //待选文字外的内容
    NSString *tmpStr;
    if (IOS8) {
        //记录中文待选文字记录
        UITextRange *markedTextRange = textField.markedTextRange;
        //待选文字range
        NSRange markedRange = [markedTextRange rangeValueWithInputValue:textField];
        tmpStr = [NSString stringWithFormat:@"%@%@",[text substringToIndex:markedRange.location],[text substringFromIndex:markedRange.location+markedRange.length]];
    }
    else if (IOS7){
        tmpStr = text;
    }
    //修改话题样式
    if (tmpStr.length&gt;10) {
        [textField deleteBackward];
    }
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

#import "UITextRange+ELVSubject.h"

@implementation UITextRange (ELVSubject)

/**
 *  UITextRange 转换成 NSRange
 *
 *  @param input 输入视图
 *
 *  @return NSRange值
 */
- (NSRange)rangeValueWithInputValue:(id<UITextInput>)input
{
    UITextPosition* beginning = input.beginningOfDocument;
    UITextPosition* selectionStart = self.start;
    UITextPosition* selectionEnd = self.end;
    NSInteger location = [input offsetFromPosition:beginning toPosition:selectionStart];
    NSInteger length = [input offsetFromPosition:selectionStart toPosition:selectionEnd];
    return NSMakeRange(location, length);
}

@end

以上。

五一快乐!

自定义Switch控件,可自定义文字以及背景的iOS控件

先上图

QQ20150413-1@2x QQ20150413-2@2x (图随意截的,不要在意)

系统本身的UISwitch其实很漂亮,但是呢,设计师设计的Switch,并不是那么简单的,需要显示文字,然后显示背景,而且大小可控制等等。。

这时候,特喵的系统的Switch就捉襟见肘了,作为一只程序猿,怎么能说功能实现不了呢a

自己动手,丰衣足食伟大的领袖毛老爷子说的名言

言归正传,首先,看UISwitch实现的思路,是基于UIControl实现的。控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏、表格单元,甚至更大的对象。UIControl派生自UIView类,所以每个控件都有很多视图的特性,包括附着于其他视图的能力。所有
控件都拥有一套共同的属性和方法。

那么,咱这个自定义的Switch也是继承UIControl,省很多事情,而且事件的封装都搞定了~

当事件都搞定的时候,这时候需要关心的只是UI了~那么,这个时候,有显示而无事件,这就想到了CALayer,这时候,我选择的时CALayer的subClass:CAShapeLayer(两个重要的subClass:CAGradientLayer和CAShapeLayer)。drawInContext 绘制文字、图片等内容显示~这里有个比较坑的地方,CGContextDrawImage()函数绘制图片的时候,会上下翻转,需要对图片进行处理一下再进行绘制。

OK,提到这里,上代码~

http://pan.baidu.com/s/1sjmdbTr(密码:gccm)

Block中访问成员变量防止循环引用

定义一个成员变量以后,需要在block中引用怎么办呢~

直接写成员变量名称去用,其实会默认引用self,会出现循环引用

若是在block外,定义一个弱引用weakSelf(__weak typeof(self) weakSelf = self;)后,在block中,weakSelf->成员变量 ,这样使用就会报错~

如图:QQ20150402-1

那么,其实代码已经暴露了,在block中对weakSelf再强引用一次就万事大吉啦~~~

QQ20150402-2