当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

iOS快速开发必备

作者:小梦 来源: 网络 时间: 2024-06-07 阅读:

前言

个人github:https://github.com/xfxfxf

当前移动互联网行业太火爆,移动端的需求日益增长,很多开发人员每天都应对着各种需求,作为一名iOS开发人员,对于需求来说,我们要做到的是实现,而对于自己来说,我们需要做到的是写出高质量的代码。

于是,全球的大神们开源了很多高质量、可复用的代码,给予了芸芸众生(心中一万个感谢)。例如我们常用的 AFNetworking,SDWebImage,Masonry 等等,这些第三方库内容强大,性能很高,为大家带来了很多福利。

在开发过程当中,适当合理的使用这些第三方库能帮我们节省很多的时间。这些优秀的第三方库就如同教科书一样,当我们深入挖掘的时候,才能获得更高的提升。

好了,吹了半天牛,我们现在到底要做什么呢?其实我想说的是,合理的使用第三方库能大大的提升开发效率,也许我们自己研究做动画弄半天,还不如开源动画好用,这样的情况很多时候我们是不得不承认的。与其与之较劲,不如我们先使用它们的框架,然后再做深入探究,这样方能更好的掌握。

网上很多好的整理,我这里引用一下:刚刚在线博客,里面有很多整理好的内容,非常好的干货。感谢原作者的内容,其中有一个整理的是iOS开发好用的 category,能帮我们节省很多精力,接下来我就先一一分析github上面这些category,翻译其中重要的内容。

声明:本人翻译并不能做到百分之百准确,内容如果有误,欢迎下方评论指导,谢谢!

UIImageView_FaceAwareFill

简介

地址:https://github.com/Julioacarrettoni/UIImageView_FaceAwareFill

This category applies Aspect Fill content mode to an image and if faces are detected it centers them instead of centering the image just by its geometrical center.
这个 category 使用了 Aspect Fill 的模式来显示图片并且当人脸被检测到时,它会就以脸部中心替代图片的集合中心。

使用

pch 文件中直接导入

#import "UIImageView+UIImageView_FaceAwareFill.h"

设置完一个UIImageView的属性以后直接

[self.imageView faceAwareFill];

然后就完了。。。。。

个人评价

看到没有,大神的提供的方法就是如此狂拽炫酷叼霸天,就是如此的简单。

NSRegularEx+ObjCRegex

简介
地址:https://github.com/bendytree/Objective-C-RegEx-Categories

This project simplifies regular expressions in Objective-C and Swift.
这个猛,直接把objective-cswift里面的正则表达式给整合了。

这是一组对比

// Without this libraryNSString* string = @"I have 2 dogs.";NSRegularExpression *regex = [NSRegularExpression regular ExpressionWithPattern:@"\\d+" options:NSRegularExpressionCaseInsensitive error:&error];NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];BOOL isMatch = match != nil;// With this libraryBOOL isMatch = [@"I have 2 dogs." isMatch:RX(@"\\d+")];

使用

安装过程就不赘述了,要么是cocoapods,要么直接拖进去。

老规矩,在 pch 文件中添加:

#ifdef __OBJC__    /* ...other references... */    #import "RegExCategories.h"#endif

当然,你的工程需要开启ARC

Swift支持
这个就需要一个桥接文件,百度即可,Swift引用 OC 的三方都是需要一个桥接文件。

后面的教程就不翻译了,直接去看代码吧,少年。

个人评价
还在为正则表达式而纠结吗?还在调试正则表达式问题吗?没错,走过路过不要错误,这里有你想要的一切。

NSObject+AutoCoding

简介

地址:https://github.com/nicklockwood/AutoCoding

这个是一个NSObject的 category,提供了对NSCodingNSCopying的自动支持。这意味着你不要写initWithCoder:encodeWithCoder:了,这个直接承包了。

当然,怎么用还是要看自己的,它并不能读懂你的思维。还有举个例子,你应该避免使用结构体因为它并不遵循NSCoding协议,而是通过NSValue

支持很多版本

支持ARCMRC

线程安全

使用

直接把AutoCoding.hAutoCoding.m拖进工程。

其实自己写归档和反归档也没有那么复杂,这里就不做详细介绍了。

个人评价

这个其实还好,不过其中的机制很不错,值得一看,后面有时间我再翻译。

UILabel-ContentSize

简介

来源:https://github.com/mergesort/UILabel-ContentSize

使用

通过传入的字符串来改变UILabelSize

直接把.h.m文件导入工程吧。

个人评价

正如同作者所说的,总是会忘记操作细节,不如直接写成 category。

UIViewController-Swizzled

简介

来源:https://github.com/RuiAAPeres/UIViewController-Swizzled

这个能帮你管理你的应用。当你正在做复杂的行为以及刚接手工程的时候这个会变得特别好用。使用这个 category 能看到你现在所在的UIViewController,还有展示你进入的层次。

使用

老规矩,要么直接拖入,要么用cocoapods

需要导入链接库:

libobjc.dylib

然后导入头文件:

#import "UIViewController+Swizzled.h"

AppDelegate中,你需要在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法里面加入SWIZZ_IT 开启。如果因为什么原因你想要停止,只需要添加UN_SWIZZ_IT

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    SWIZZ_IT;    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    [self.window makeKeyAndVisible];    // Your code...    return YES;}

然后就能看到输出:

2013-09-09 18:58:42.360 Testing[25399:c07] -> UINavigationController2013-09-09 18:58:42.361 Testing[25399:c07] ---> RPViewController2013-09-09 18:59:55.072 Testing[25399:c07] -----> RPSecondViewController2013-09-09 18:59:57.367 Testing[25399:c07] -------> RPThirdViewController2013-09-09 18:59:58.801 Testing[25399:c07] -----> RPSecondViewController2013-09-09 19:00:00.282 Testing[25399:c07] -------> RPThirdViewController2013-09-09 19:00:01.906 Testing[25399:c07] ---------> RPViewController2013-09-09 19:00:03.515 Testing[25399:c07] -------> RPThirdViewController2013-09-09 19:00:04.267 Testing[25399:c07] -----> RPSecondViewController2013-09-09 19:00:05.041 Testing[25399:c07] ---> RPViewController2013-09-09 19:00:07.193 Testing[25399:c07] -----> RPSecondViewController2013-09-09 19:00:08.312 Testing[25399:c07] -------> RPThirdViewController2013-09-09 19:00:09.396 Testing[25399:c07] ---------> RPViewController2013-09-09 19:00:10.183 Testing[25399:c07] -----------> RPSecondViewController2013-09-09 19:00:10.905 Testing[25399:c07] -------------> RPThirdViewController2013-09-09 19:00:12.141 Testing[25399:c07] ---------------> RPViewController2013-09-09 19:00:13.156 Testing[25399:c07] -----------------> RPSecondViewController

个人评价

当你刚接手一个新的项目的时候,无数个文件。

这是什么鬼?程序怎么运行的?那个类是干嘛用的?为什么运行到了这里,还有,文件怎么找?要疯掉了。。。

有了此神器,天黑都不怕,一步一步是爪牙,是魔鬼的步伐,程序的运行一清二楚,简直出门旅行,居家必备之良药。

你值得拥有!

NSDate-Escort

简介

来源:https://github.com/azu/NSDate-Escort

加强NSDate

使用

/** Returns the calendarIdentifier of calendars that is used by this library for date calculation. @see AZ_setDefaultCalendarIdentifier: for more details. */+ (NSString *)AZ_defaultCalendarIdentifier;/** Sets the calendarIdentifier of calendars that is used by this library for date calculation. You can specify any calendarIdentifiers predefined by NSLocale. If you provide nil, the library uses [NSCalendar currentCalendar]. Default value is nil. You can't provide individual calendars for individual date objects. If you need to perform such complicated date calculations, you should rather create calendars on your own. */+ (void)AZ_setDefaultCalendarIdentifier:(NSString *)calendarIdentifier;#pragma mark - Relative dates from the current date- (BOOL)isYesterday;- (BOOL)isSameWeekAsDate:(NSDate *) aDate;- (BOOL)isThisWeek;- (BOOL)isNextWeek;- (BOOL)isLastWeek;- (BOOL)isSameMonthAsDate:(NSDate *) aDate;- (BOOL)isThisMonth;- (BOOL)isSameYearAsDate:(NSDate *) aDate;- (BOOL)isThisYear;- (BOOL)isNextYear;- (BOOL)isLastYear;- (BOOL)isEarlierThanDate:(NSDate *) aDate;- (BOOL)isLaterThanDate:(NSDate *) aDate;- (BOOL)isEarlierThanOrEqualDate:(NSDate *) aDate;- (BOOL)isLaterThanOrEqualDate:(NSDate *) aDate;- (BOOL)isInFuture;- (BOOL)isInPast;#pragma mark - Date roles- (BOOL)isTypicallyWorkday;- (BOOL)isTypicallyWeekend;#pragma mark - Adjusting dates- (NSDate *)dateByAddingYears:(NSInteger) dYears;- (NSDate *)dateBySubtractingYears:(NSInteger) dYears;- (NSDate *)dateByAddingMonths:(NSInteger) dMonths;- (NSDate *)dateBySubtractingMonths:(NSInteger) dMonths;- (NSDate *)dateByAddingDays:(NSInteger) dDays;- (NSDate *)dateBySubtractingDays:(NSInteger) dDays;- (NSDate *)dateByAddingHours:(NSInteger) dHours;- (NSDate *)dateBySubtractingHours:(NSInteger) dHours;- (NSDate *)dateByAddingMinutes:(NSInteger) dMinutes;- (NSDate *)dateBySubtractingMinutes:(NSInteger) dMinutes;- (NSDate *)dateAtStartOfDay;- (NSDate *)dateAtEndOfDay;- (NSDate *)dateAtStartOfWeek;- (NSDate *)dateAtEndOfWeek;- (NSDate *)dateAtStartOfMonth;- (NSDate *)dateAtEndOfMonth;- (NSDate *)dateAtStartOfYear;- (NSDate *)dateAtEndOfYear;#pragma mark - Retrieving intervals- (NSInteger)minutesAfterDate:(NSDate *) aDate;- (NSInteger)minutesBeforeDate:(NSDate *) aDate;- (NSInteger)hoursAfterDate:(NSDate *) aDate;- (NSInteger)hoursBeforeDate:(NSDate *) aDate;- (NSInteger)daysAfterDate:(NSDate *) aDate;- (NSInteger)daysBeforeDate:(NSDate *) aDate;- (NSInteger)monthsAfterDate:(NSDate *) aDate;- (NSInteger)monthsBeforeDate:(NSDate *) aDate;/*** return distance days*/- (NSInteger)distanceInDaysToDate:(NSDate *) aDate;#pragma mark - Decomposing dates/*** return nearest hour*/@property(readonly) NSInteger nearestHour;@property(readonly) NSInteger hour;@property(readonly) NSInteger minute;@property(readonly) NSInteger seconds;@property(readonly) NSInteger day;@property(readonly) NSInteger month;@property(readonly) NSInteger week;//  in the Gregorian calendar, n is 7 and Sunday is represented by 1.@property(readonly) NSInteger weekday;@property(readonly) NSInteger firstDayOfWeekday;@property(readonly) NSInteger lastDayOfWeekday;// e.g. 2nd Tuesday of the month == 2@property(readonly) NSInteger nthWeekday;

个人评价

无需多说,看方法名字就知道有什么作用了,回想起之前处理时间的日子。。。多么痛的领悟,果然那句话很对:磨刀不误砍柴工。

UIView+Toast

简介

来源:https://github.com/scalessec/Toast

使用

注意导入QuartzCore

图片已经实例代码源地址都有,就几个参数

  • makeToast 要显示的内容

  • duration 持续时间

  • position 放置的位置

  • title 标题

  • image 放置的图片

  • makeToastActivity 显示 toast

个人评价

简单好用,清晰明了。

NYXImagesKit

简介

来源:https://github.com/Nyx0uf/NYXImagesKit

NYXImagesKit是一个重组了多个有用的UIImage categories的iOS项目,可对图像/图片进行多个处理,比如筛选、模糊、优化、蒙版、调整大小、旋转以及保存等等。同时还提供了一个UIImageView子类从URL异步加载图片,并在下载完毕时展示图片。

使用

首先打开NYXImagesKit.xcodeproj然后运行库,之后把库和头文件导入到你的工程里面,最后要链接以下的框架:

  • Accelerate

  • AssetsLibrary

  • ImageIO

  • MobileCoreServices

  • QuartzCore

  • CoreImage

UIImage+Blurring
模糊效果

[myImage gaussianBlurWithBias:0];

UIImage+Masking
蒙板效果

UIImage* masked = [myImage maskWithImage:[UIImage imageNamed:@"mask.png"]];

UIImage+Resizing
重置尺寸

  1. 上左

  2. 上中

  3. 上右

  4. 下左

  5. 下中

  6. 下右

  7. 左中

  8. 右中

  9. 中间

UIImage* cropped = [myImage cropToSize:(CGSize){width, height} usingMode:NYXCropModeCenter];

NYXCropMode是一个枚举类型,能在头文件里面找到,表示不同的类型

Scaling
缩放

你有两种方法来缩放图片,这两种方法都能保持原图片比例

UIImage* scaled1 = [myImage scaleByFactor:0.5f];UIImage* scaled2 = [myImage scaleToFitSize:(CGSize){width, height}];

UIImage+Rotating
旋转

UIImage* rotated1 = [myImage rotateInDegrees:217.0f];UIImage* rotated2 = [myImage rotateInRadians:M_PI_2];UIImage* flipped1 = [myImage verticalFlip];UIImage* flipped2 = [myImage horizontalFlip];

(未完待续)

总结

先从学习使用开始,到研究分析如何实现,才是大智慧。

热点阅读

网友最爱