因为厌倦了一直反复编写大量(感觉像模板化的)Objective-C 代码,我决定制作一些有用的工具,让我的生活变得更轻松,间接地也让你们的生活变得更轻松。这是一个不断增长的函数库,应该能在开发过程中帮助到你们。我鼓励你们阅读他们的实现,以便了解后台发生了什么,而不要对那些函数的高度抽象表示感到舒适。
所有重要的类都位于本仓库的顶级目录 Classes
中。以下是您需要的:
NSString+BGStringUtilities.{h,m}
NSScanner+BGScannerUtilities.{h,m}
UIView+BGViewUtilities.{h,m}
BGSystemUtilities.{h,m}
BGUtilities.h
最后一个类,BGUtilities.h
是上述所有类的集合,这意味着您只需在任何类中导入 "BGUtilities.h"
,即可获得此系列中所有方法。
Cocoapods
pod 'BGUtilities'
您可以操作 NSString 的许多有趣事物,但唯一的问题是有时您必须深入研究并使用一些其他的 NSObject 类来完成它们。这里是一个不断增长的方法列表,我认为这些方法应该能帮助任何 iOS 开发者处理 NSString 操作。
包含搜索
两个方法 contains:
和 containsAnyInArray:
用于检查子字符串是否存在于 NSString 内。这些比较是不区分大小写的,所以大写字母和的小写字母被视为相同。这是它们的用法
NSString *mainString = @"Contains";
BOOL containsSubString = [mainString contains:@"Con"];
BOOL containsAnySubString = [mainString containsAnyInArray:@[@"BG",@"Con"]];
正则表达式
尽管正则表达式的语法令人作呕,但它们仍然是非常强大的工具。话虽如此,这是评估字符串是否匹配正则表达式的主要方法
BOOL matches = [@"HelloWorld" matchesRegex:@"{2,10}"];
您也可以对字符串中的匹配项进行枚举
[@"1 2 3 4 5" enumerateRegexMatches:@"\\d+" usingBlock:^(NSString *match, NSInteger index, NSRange matchRange, BOOL *stop) {
// Use the match or range how you need to
// Set stop = YES to end the enumeration loop
}];
除了标准的正则表达式评估外,还有一个方便的方法用于确定电子邮件地址是否有效。
BOOL isValid = [@"[email protected]" isValidEmail];
单词
有时您想将文本视为含有单词,并对其采取行动。这里也有一些方便的方法用于确定任何 NSString 中包含的单词数量。
NSString *sentence = @"This sentence contains 6 unique words words.";
NSArray *words = [sentence words];
NSSet *uniqueWords = [sentence uniqueWords];
NSInteger *wordCount = [sentence numberOfWords];
除了这些简写方法之外,还有一个用于枚举句子中所有单词的主要方法。
NSString *sentence = @"This sentence contains 6 unique words words.";
[sentence enumerateWordsUsingBlock:^(NSString *word, NSInteger index, BOOL *stop){
// Do something with word here.
// Set stop = YES to break the enumeration loop.
}];
连接 NSStrings
在 Objective-C 中连接字符串可能会相当麻烦,我这里可以部分减轻痛苦。不幸的是,我们并没有像 @"Hello" + @" World"
这样的简单性,但这比使用 stringWithFormat:
来得好。希望你会喜欢这种妥协。
NSString *concatenated = [NSString stringByConcatenating:@"Hello",@" World",nil];
扫描两个字符串之间的字符串
NSScanner 在这个简单的用例中使用起来很繁琐。比如你有一个看起来是这样的字符串:@"Hi my name is (Ben)!"
,而你只想获取括号之间的字符。以下是获取这些信息的方式:
NSScanner *scanner = [[NSScanner alloc] initWithString:@"Hi my name is (Ben)!"];
NSString *name = @"";
[scanner scanBetweenString:@"(" andString:@")" intoString:&name];
枚举两个字符串之间的子串
现在,假设你有一个格式如此奇怪的字符串:@"Somebody named (Jane) has {apples, bananas, oranges, pears, peaches} in her basket."
,并且你有一个拥有一个名为 Name (string) 属性以及 Fruits (NSMutableArray) 属性的 Person 对象。以下是此操作的方法,假设 Person 对象有一个名为 Name(字符串)的属性和一个名为 Fruits(NSMutableArray)的属性
// Make a person
Person *newPerson = [[Person alloc] init];
// Set up scanner
NSScanner *scanner = [[NSScanner alloc] initWithString:@"Somebody named (Jane) has {apples, bananas, oranges, pears, peaches} in her basket."];
NSString *name = @"";
// Scan name
[scanner scanBetweenString:@"(" andString:@")" intoString:&name];
newPerson.Name = name;
// Scan fruits
[scanner enumerateSubstringsBetweenString:@"{" andString:@"}" separator:@", " block:^(NSString *subString, NSInteger *index, BOOL *stop) {
[newPerson.Fruits addObject:subString];
}];
在急需快速观察这些 UIView 方法时,便利性是关键。我们首先要开始的是考虑 UI 方面的内容。
阴影
每个人都很喜欢阴影,每个开发者讨厌编写它们。通过 QuartzCore
制作阴影并不是特别糟糕,但如果要制作一个正确的阴影,通常需要大约 5 或 6 行代码。这就是为什么不要重复编写这个 UI 泡沫代码是重要的。让我来为你完成这个任务。
UIView *someView;
// Customize a shadow
[someView addShadowWithOffsetSize:CGSizeMake(1.0,1.0) color:[UIColor blackColor] opacity:0.5 radius:0.0];
这个方法调用几乎处理了你添加阴影到视图所需的所有自定义。然而,如果你想要更快且更简单的方法,我为此制作了一个快速简写的快捷方式。它与上面代码段中使用的参数完全相同。显然,你可以根据你认为自己默认阴影的样子来更改它。
[someView addShadow];
边框
添加边框与添加阴影一样简单。使用此方法创建的边框会嵌入到视图内部,这意味着如果视图的宽度为 300 像素,高度为 150 像素,则添加边框后,视图的尺寸仍然是 300x150。
[someView addBorderWithWidth:1.0 color:[UIColor blueColor]];
圆角半径
该方法并没有添加太多内容,因为设置视图的圆角半径只需一行代码。然而,初次通过层进行设置可能并不是最直观的,因此使用此方法可能会更清晰明了,并且可能缩短添加圆角时需要思考的问题。
[someView setCornerRadius:7];
动画
随着iOS的不断发展,高质量动画的实现变得越来越容易。然而,我觉得可能有部分内置动画可以直接实现但不需要做通常的 4-5 行代码来触发。第一个这样的动画是淡入淡出。以下是实现这一功能的一些方法:
UIView *someView;
// Fade In With Duration and a Completion Block
[someView fadeInWithDuration:0.25 completion:^(BOOL finished){
// Do something upon completion!
}];
// Fade In With Duration
[someView fadeInWithDuration:0.25];
// Stock Fade In - 0.25 seconds and no completion block
[someView fadeIn];
// Fade Out With Duration and a Completion Block
[someView fadeOutWithDuration:0.25 completion:^(BOOL finished){
// Do something upon completion!
}];
// Fade Out With Duration
[someView fadeOutWithDuration:0.25];
// Stock Fade Out - 0.25 seconds and no completion block
[someView fadeOut];
这些方法都很棒,但是如果你想要同时淡入/淡出一个 UIView 集合呢?那么,可以使用这个主方法来完成这个任务。
[UIView fadeViews:@[someView,someOtherView] withDuration:0.25 fadeIn:YES completion:^(BOOL finished){
// Do something upon completion!
}];
CGRect 方法
手动键入 someView.frame.size.height
可以非常快地变得令人厌烦。因此,这里有几个简写方法,可以在执行大量视图框架变换和查询时使生活更为容易。
float height = [someView height];
float width = [someView width];
CGPoint origin = [someView origin];
float x = [someView xOrigin];
float y = [someView yOrigin];
分隔栏
这可能是有用的方法中最无用的,或者实际上对你非常有用。我花太多时间添加了一个具有 1 像素高度的视图作为可视化分隔符。因此,这里有一个有用的函数,你可以将其添加到任何你想要的位置。
UIView *separator = [UIView separatorWithWidth:300 origin:CGPointMake(10,10) color:[UIColor darkGrayColor]];
我创建和整理的一些辅助方法不属于类别,但更适用于与系统相关的一般类方法 - 与 UIView 或 NSString 这类类没有关系。
屏幕宽度与高度
您可以通过以下方式获取设备当前方向的屏幕宽度和高度:
float width = [BGSystemUtilities screenWidth];
float height = [BGSystemUtilities screenHeight];
当前iOS版本
float versionNumber = [BGSystemUtilities iOSVersion];
主项目中包含了一套单元测试,目的是快速检查和验证这些方法是否确实如所述那样执行。我还将这些测试部署在Travis CI集成服务器上,在合并到主仓库之前,可以在此服务器上对拉取请求和其他修改进行测试和验证。
BGUtilities遵循标准的MIT许可证
版权所有 © Benjamin Gordon 2013
在此特此授予任何获得本软件及其相关文档副本(“软件”)的任何人免费使用软件的权利,不受任何限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、许可和/或出售软件副本,并允许向提供软件的人员使用,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按"原样"提供,不提供任何形式的保证,无论是明确的还是隐含的,包括但不限于对适销性、特定用途适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何要求、损害或其他责任承担责任,无论是基于合同、侵权或其他原因引起的,无论该要求、损害或其他责任是否与软件或软件的使用或其他交易有关。