1.安装
Realm github下载地址
如果使用cocoapods
,示例语句如下
platform :ios, '8.0'
target 'Simona_Realm' do
pod 'Realm', '~> 3.0.0-beta.3'
end
2.创建简易模型,继承于RLMObject
,存储在数据库的模型都需要继承于RLMObject
-
-
-
-
@interface Person : RLMObject
-
-
@property NSString *personId;
-
-
-
-
-
-
-
-
-
-
-
+ (NSString *)primaryKey {
-
-
-
-
-
+ (NSArray<NSString *> *)requiredProperties {
-
-
-
-
-
+ (NSArray<NSString *> *)ignoredProperties {
-
-
-
-
-
+ (NSDictionary *)defaultPropertyValues {
-
-
-
-
-
+ (NSArray<NSString *> *)indexedProperties {
-
return @[@”sex”,@”woman”];
-
-
-
关于RLMObject
1.Realm
忽略了OC
的属性特性(如nonatomic, atomic, strong,retain, weak,copy
等),所以在声明属性时可不写,,这些特性会一直生效直到被写入数据库。
2.Realm
支持以下的类型BOOL, NSInteger, long, double, CGFloat, NSString, NSDate, NSData
等
3.定义了RLM_ARRAY_TYPE(Person)
表示支持RLMArray
属性,相当于允许RLMArray<Person>
属性的使用,例如:在其他属性里可@property RLMArray<Person *><Person> *personal
如此使用,相当于继承关系(本文暂不做赘述)
3.使用
<1.>存储
-
-
RLMRealm *realm = [RLMRealm defaultRealm];
-
[realm transactionWithBlock:^{
-
for (int i = 0; i < 10000; i++) {
-
Person *person = [[Person alloc]init];
-
person.personId = [NSString stringWithFormat:@“张%d”,i];
-
person.sex = @“Not scanned”;
-
-
[realm addObject:person];
-
-
这里的
[realm transactionWithBlock:^{ }];
等同于
[realm beginWriteTransaction];
[realm commitWriteTransaction];
每次打开关闭数据库时都应执行此操作
<2.>删除
-
RLMRealm *realm = [RLMRealm defaultRealm];
-
[realm beginWriteTransaction];
-
[realm deleteAllObjects];
-
[realm commitWriteTransaction];
<3.>查询
-
-
-
NSPredicate *pred = [NSPredicate predicateWithFormat:@”status = %ld”, NO];
-
RLMResults *result = [Person objectsWithPredicate:pred];
-
Person *per = result[indexPath.row];
-
-
-
RLMResults *result = [Person objectsWhere:@”status = ‘NO’ AND personId BEGINSWITH ‘张1′”];
-
Person *per = result[indexPath.row];
-
-
-
RLMResults *persons = [Person allObjects];
-
Person *per = persons[indexPath.row];
<4.>更新
-
-
NSPredicate *pred = [NSPredicate predicateWithFormat:@“personId = %@”, strScan];
-
RLMResults *result = [Person objectsWithPredicate:pred];
-
-
-
RLMRealm *r = [RLMRealm defaultRealm];
-
[r beginWriteTransaction];
-
-
Person *person = result[0];
-
person.sex = @“Has been scanned”;
-
-
[r commitWriteTransaction];
-
-
-
2.创建一个新值并更新数据库,createOrUpdateInRealm:通过主键来更新插入
-
-
NSPredicate *pred = [NSPredicate predicateWithFormat:@“personId = %@”, strScan];
-
RLMResults *result = [Person objectsWithPredicate:pred];
-
-
-
Person *person = [[Person alloc]init];
-
person.personId = @“Simona1”;
-
-
-
RLMRealm *r = [RLMRealm defaultRealm];
-
[r beginWriteTransaction];
-
[Person createOrUpdateInRealm:r withValue:person];
-
[r commitWriteTransaction];
Levenshtein的经典算法,参考http://en.wikipedia.org/wiki/Levenshtein_distance的伪代码实现的,同时参考了一些C++的实现,求字符串相似度。
下面求出结果是0.0~100.0, 表示为0%~100%。
-
static inline int min(int a, int b) {
-
-
-
-
+(float)likePercentByCompareOriginText:(NSString *)originText targetText:(NSString *)targetText{
-
-
-
int n = (int)originText.length;
-
int m = (int)targetText.length;
-
-
-
-
-
-
-
-
matrix = (int **)malloc(sizeof(int *)*N);
-
-
-
for (int i = 0; i < N; i++) {
-
matrix[i] = (int *)malloc(sizeof(int)*M);
-
-
-
for (int i = 0; i<N; i++) {
-
for (int j=0; j<M; j++) {
-
-
-
-
-
for(int i=1; i<=n; i++) {
-
-
-
for(int i=1; i<=m; i++) {
-
-
-
-
-
unichar si = [originText characterAtIndex:i-1];
-
-
-
unichar dj = [targetText characterAtIndex:j-1];
-
-
-
-
-
-
-
-
const int above = matrix[i-1][j]+1;
-
const int left = matrix[i][j-1]+1;
-
const int diag = matrix[i-1][j-1]+cost;
-
matrix[i][j] = min(above, min(left,diag));
-
-
-
return 100.0 – 100.0*matrix[n][m]/MAX(m,n);
-
IQKeyboardManager的使用非常简单,只需要在项目使用到的地方之前给IQKeyboardManager的单例设置一些属性就能轻松实现。下面来介绍一下这些属性:
建议在AppDelegate的
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullableNSDictionary *)launchOptions{}方法中设置属性。
例如:属性设置(配置信息)
IQKeyboardManager *manager = [IQKeyboardManagersharedManager];
manager.enable = YES; // 控制整个功能是否启用。
manager.shouldResignOnTouchOutside =YES; // 控制点击背景是否收起键盘
manager.shouldToolbarUsesTextFieldTintColor =YES; // 控制键盘上的工具条文字颜色是否用户自定义
manager.enableAutoToolbar =YES; // 控制是否显示键盘上的工具条
manager.toolbarManageBehaviour =IQAutoToolbarByTag; // *新版的设置键盘的returnKey的关键字 ,可以点击键盘上的next键,自动跳转到下一个输入框,*后一个输入框点击完成,自动收起键盘。
在需要使用的界面设置
IQKeyboardReturnKeyHandler *retuenKeyHandler = [[IQKeyboardReturnKeyHandleralloc]initWithViewController:self];
retuenKeyHandler.lastTextFieldReturnKeyType =UIReturnKeyDone; // 设置*后一个输入框的ReturnKey关键字
这样设置后就能实现输入框随着键盘的弹出自动上下浮动,点击背景收起键盘了,不用再自己实现,非常方便。
*新版的只需要在这个方法中
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullableNSDictionary *)launchOptions{
// 设置键盘监听管理
[[IQKeyboardManager sharedManager] setToolbarManageBehaviour:IQAutoToolbarByPosition];
}
就可以实现。
如果因为不知名的原因需要在某个页面禁止自动键盘处理事件相应,也很简单。
– (void) viewWillAppear: (BOOL)animated {
//打开键盘事件相应
[IQKeyboardManager sharedManager].enable = NO;
}
– (void) viewWillDisappear: (BOOL)animated {
//关闭键盘事件相应
[IQKeyboardManager sharedManager].enable = YES;
px与pt区别
字体大小的设置单位,常用的有2种:px、pt。这两个有什么区别呢?
先搞清基本概念:
- px就是表示pixel,像素,是屏幕上显示数据的*基本的点;
- pt就是point,是印刷行业常用单位,等于1/72英寸。
px全称为pixel,是一个点,它不是自然界的长度单位,谁能说出一个“点”有多长多大么?可以画的很小,也可以很大。如果点很小,那画面就清晰,我们称它为“分辨率高”,反之,就是“分辨率低”。所以,“点”的大小是会“变”的,也称为“相对长度”。
pt全称为point,但中文不叫“点”,查金山词霸可以看到,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位,也称为“*对长度”。
因此就有这样的说法:
iPhone各种屏幕分辨率
设备 |
屏幕尺寸 |
分辨率(pt) |
Reader |
分辨率(px) |
渲染后 |
PPI |
iPhone 3GS |
3.5吋 |
320×480 |
@1x |
320×480 |
|
163 |
iPhone 4/4s |
3.5吋 |
320×480 |
@2x |
640×960 |
|
330 |
iPhone 5/5s/5c |
4.0吋 |
320×568 |
@2x |
640×1136 |
|
326 |
iPhone 6 |
4.7吋 |
375×667 |
@2x |
750×1334 |
|
326 |
iPhone 6Plus |
5.5吋 |
414×736 |
@3x |
1242×2208 |
1080×1920 |
401 |
iPhone 6s |
4.7吋 |
375×667 |
@2x |
750×1334 |
|
326 |
iPhone 6sPlus |
5.5吋 |
414×736 |
@3x |
1242×2208 |
1080×1920 |
401 |
iPhone 7 |
4.7吋 |
375×667 |
@2x |
750×1334 |
|
326 |
iPhone 7Plus |
5.5吋 |
414×736 |
@3x |
1242×2208 |
1080×1920 |
401 |
指定截屏代码实现
全屏截图效果
全屏截图效果
指定区域截屏效果
指定区域截屏效果
这里先上代码,代码后面有相关方法的解释
*种方法
代码下载
-
-
-
-
-
-
-
-
UIGraphicsBeginImageContextWithOptions([[UIScreen mainScreen] bounds].size, YES, 0.0);
-
UIView * view = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:YES];
-
-
-
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
-
-
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
-
-
UIGraphicsEndImageContext();
-
-
-
-
-
-
-
CGImageRef imageRef =viewImage.CGImage;
-
-
-
CGRect rect = CGRectMake(CGImageGetWidth(imageRef)/4, CGImageGetHeight(imageRef)/2–CGImageGetWidth(imageRef)/2, CGImageGetWidth(imageRef)/2, CGImageGetWidth(imageRef)/2);
-
-
CGImageRef imageRefRect =CGImageCreateWithImageInRect(imageRef, rect);
-
-
UIImage *sendImage =[[UIImage alloc] initWithCGImage:imageRefRect];
-
第二种方法
代码下载
-
-
-
-
CGFloat imageWH = self.baseImageView.image.size.width;
-
NSLog(@”=========%f”,imageWH);
-
-
-
CGSize size =CGSizeMake(imageWH + 2*borderWH, imageWH + 2*borderWH);
-
-
UIGraphicsBeginImageContextWithOptions(size,NO,0);
-
-
-
UIBezierPath*path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0, size.width, size.height)];
-
-
-
UIColor *color = [UIColor redColor];
-
-
-
-
-
-
path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderWH, borderWH, imageWH, imageWH)];
-
-
-
-
-
-
[self.baseImageView.image drawAtPoint:CGPointMake(borderWH, borderWH)];
-
-
-
UIImage*newImage =UIGraphicsGetImageFromCurrentImageContext();
-
-
-
UIGraphicsEndImageContext();
-
-
self.bottonImageView.image = newImage;
-
相关知识详解
UIGraphicsBeginImageContext
创建一个基于位图的上下文(context)
,并将其设置为当前上下文(context)
。方法声明如下:
void UIGraphicsBeginImageContext(CGSize size);
参数size
为新创建的位图上下文的大小。它同时是UIGraphicsGetImageFromCurrentImageContext
函数返回的图形大小。
该函数的功能同UIGraphicsBeginImageContextWithOptions
的功能相同,相当与UIGraphicsBeginImageContextWithOptions
的opaque
参数为NO,scale
因子为1.0。
UIGraphicsBeginImageContextWithOptions
函数原型为:
void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
size——同UIGraphicsBeginImageContext
opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
scale—–缩放因子 iPhone 4是2.0,其他是1.0。虽然这里可以用[UIScreen mainScreen].scale
来获取,但实际上设为0后,系统就会自动设置正确的比例了。
其他的截屏方法
第二种
这是在比较常见的截图方法,不过不支持Retina屏幕。
-
-
UIGraphicsBeginImageContext(self.view.frame.size);
-
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
-
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
-
UIGraphicsEndImageContext();
-
-
第三种
从iPhone 4、iPod Touch 4开始,Apple逐渐采用Retina屏幕,于是在iOS 4的SDK中我们有了,上面的截图方法也自然变成了这样。
-
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0);
-
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
-
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
-
UIGraphicsEndImageContext();
-
第四种
或许你会说有时Hook的是一个按钮的方法,用第三个方法的话,根本找不到view来传值,不过还好,iOS 7又提供了一些UIScreen的API。
-
UIView * view = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:YES];
-
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
-
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
-
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
-
UIGraphicsEndImageContext();
-