iOS快速开发必备

IMX6ULL开发板实战:5步搞定Buildroot系统移植(附避坑指南) 本文详细介绍了在IMX6ULL开发板上通过Buildroot进行Linux系统移植的5个关键步骤,包括环境准备、源码配置、内核定制、文件系统管理及编译烧录。特别提供了针对常见问题的避坑指南,帮助开发者高效完成嵌入式Linux系统构建,适用于工业控制和物联网应用场景。 阅读详情

iOS快速开发必备

前言

github:https://github.com/koknine (终于改成以前的了)

当前移动互联网行业太火爆,移动端的需求日益增长,很多开发人员每天都应对着各种需求,作为一名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-c和swift里面的正则表达式给整合了。

这是一组对比

// Without this library

NSString* 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 library

BOOL 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,提供了对NSCoding和NSCopying的自动支持。这意味着你不要写initWithCoder:和encodeWithCoder:了,这个直接承包了。

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

支持很多版本

支持ARC和MRC

线程安全

使用

直接把AutoCoding.h和AutoCoding.m拖进工程。

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

个人评价

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

UILabel-ContentSize

简介

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

使用

通过传入的字符串来改变UILabel的Size。

直接把.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] -> UINavigationController

2013-09-09 18:58:42.361 Testing[25399:c07] ---> RPViewController

2013-09-09 18:59:55.072 Testing[25399:c07] -----> RPSecondViewController

2013-09-09 18:59:57.367 Testing[25399:c07] -------> RPThirdViewController

2013-09-09 18:59:58.801 Testing[25399:c07] -----> RPSecondViewController

2013-09-09 19:00:00.282 Testing[25399:c07] -------> RPThirdViewController

2013-09-09 19:00:01.906 Testing[25399:c07] ---------> RPViewController

2013-09-09 19:00:03.515 Testing[25399:c07] -------> RPThirdViewController

2013-09-09 19:00:04.267 Testing[25399:c07] -----> RPSecondViewController

2013-09-09 19:00:05.041 Testing[25399:c07] ---> RPViewController

2013-09-09 19:00:07.193 Testing[25399:c07] -----> RPSecondViewController

2013-09-09 19:00:08.312 Testing[25399:c07] -------> RPThirdViewController

2013-09-09 19:00:09.396 Testing[25399:c07] ---------> RPViewController

2013-09-09 19:00:10.183 Testing[25399:c07] -----------> RPSecondViewController

2013-09-09 19:00:10.905 Testing[25399:c07] -------------> RPThirdViewController

2013-09-09 19:00:12.141 Testing[25399:c07] ---------------> RPViewController

2013-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];

UIImage+Reflection

重构图片

UIImage* reflected = [myImage reflectedImageWithHeight:myImage.size.height fromAlpha:0.0f toAlpha:0.5f];

UIImage+Enhancing

提升

[myImage autoEnhance];

[myImage redEyeCorrection];

UIImage+Saving

保存类型

这个能把图片存到一个地址或者相册,支持五种类型

  1. BMP
  2. GIF
  3. JPG
  4. PNG
  5. TIFF

要用这个就必须导入ImageIO.framework,MobileCoreServices.framework还有AssertsLibrary.framework。

[myImage saveToURL:url type:NYXImageTypeJPEG backgroundFillColor:nil];

[myImage saveToPath:path type:NYXImageTypeTIFF backgroundFillColor:[UIColor yellowColor]];

[myImage saveToPhotosAlbum];

NYXProgressiveImageView

这个是继承UIImageView的一个类,能异步加载图片和缓存。

当然,我们可以使用SDWebImage。

个人评价

这个针对于图片处理,很好很强大。

MJPopupViewController

简介

来源:https://github.com/martinjuhasz/MJPopupViewController

这个是给UIViewController提供过渡效果的。

使用

把Source目录下的文件夹拖入工程,然后导入QuartzCore.framework。

引入文件

#import "UIViewController+MJPopupViewController.h"

简单添加

[self presentPopupViewController:detailViewController animationType:MJPopupViewAnimationFade];

如果要消失

[self dismissPopupViewControllerWithanimationType:MJPopupViewAnimationFade];

在实例工程中可以看到更多的使用方法。

个人评价

一个非常简单容易使用的过渡效果,有需求的时候可以使用。

UIColor+Colours

简介

来源:https://github.com/bennyguitar/Colours

为UIColor提供更多颜色支持

使用

cocoapods安装,或者拖入文件

颜色过多,就不一一列举了。

RGBA

通过数组可以取出UIColor的四个参数,都是NSNumber类型,记得他们都是0-1的数,不是0-255

NSArray *colorArray = [[UIColor seafoamColor] rgbaArray];

UIColor *newColor = [UIColor colorFromRGBAArray:colorArray];

字典也能取到值

  • kColoursRGBA_R
  • kColoursRGBA_G
  • kColoursRGBA_B
  • kColoursRGBA_A

NSDictionary *colorDict = [[UIColor seafoamColor] rgbaDictionary];

UIColor *newColor = [UIColor colorFromRGBADictionary:colorDict];


// You can also get a single component like so:

NSNumber *r = colorDict[kColoursRGBA_R];

后面还有很多方法,不一一列举了。

个人评价

实际开发中,一般 UI 设计出来各种颜色,位置都确定了,所以不好说这个用的多不多。

NSDate+Helper

简介

来源:https://github.com/billymeltdown/nsdate-helper

这也是一个扩展NSDate的 category

使用

使用方便,stringForDisplayFromDate能非常便捷的显示出很多信息。

NSString *displayString = [NSDate stringForDisplayFromDate:date];

这能显示出很多信息

  • ‘3:42 AM’ – 如果时间是在今天半夜
  • ‘Tuesday’ – 如果时间是在这个星期
  • ‘Mar 1’ – 如果日期是在今年
  • ‘Mar 1, 2008’ – else ;-)

另外的方法能显示几天之前这样的信息

NSDate *date = [NSDate date];

  [date daysAgo]; // provides an NSComponent-based NSUInteger describing days ago.

  [date daysAgoAgainstMidnight]; // better version of daysAgo, works off midnight (hat-tip: "sburlot":http://github.com/sburlot)

  [date stringDaysAgo]; // 'Today', 'Yesterday', or 'N days ago'.

构造date formatters很纠结?缺少to_s(:db)?我也是,NSDate (Helper)有些静态方法能够在两者之间转换,而且能支持数据库的时间戳。

NSDate *date = [NSDate dateFromString:@"2009-03-01 12:15:23"];

NSString *dbDateString = [NSDate stringFromDate:date]; // returns '2009-03-01 12:15:23'

还有

NSString *otherDateString = [NSDate stringFromDate:date withFormat:@"EEEE"]; // use any format you like

个人评价

这个也不错,更多功能可以在.h文件里面找,命名很规范。

ObjectiveSugar

简介

来源:https://github.com/supermarin/ObjectiveSugar

语法糖功能

使用

使用cocoapods,然后导入头文件#import <ObjectiveSugar/ObjectiveSugar.h>

NSNumber

[@3 times:^{

    NSLog(@"Hello!");

}];

// Hello!

// Hello!

// Hello!


[@3 timesWithIndex:^(NSUInteger index) {

    NSLog(@"Another version with number: %d", index);

}];

// Another version with number: 0

// Another version with number: 1

// Another version with number: 2



[@1 upto:4 do:^(NSInteger numbah) {

    NSLog(@"Current number.. %d", numbah);

}];

// Current number.. 1

// Current number.. 2

// Current number.. 3

// Current number.. 4


[@7 downto:4 do:^(NSInteger numbah) {

    NSLog(@"Current number.. %d", numbah);

}];

// Current number.. 7

// Current number.. 6

// Current number.. 5

// Current number.. 4


NSDate *firstOfDecember = [NSDate date]; // let's pretend it's 1st of December


NSDate *firstOfNovember = [@30.days since:firstOfDecember];

// 2012-11-01 00:00:00 +0000


NSDate *christmas = [@7.days until:newYearsDay];

// 2012-12-25 00:00:00 +0000


NSDate *future = @24.days.fromNow;

// 2012-12-25 20:49:05 +0000


NSDate *past = @1.month.ago;

// 2012-11-01 20:50:28 +00:00

NSArray / NSSet

// All of these methods return a modified copy of the array.

// They're not modifying the source array.


NSArray *cars = @[@"Testarossa", @"F50", @"F458 Italia"]; // or NSSet


[cars each:^(id object) {

    NSLog(@"Car: %@", object);

}];

// Car: Testarossa

// Car: F50

// Car: F458 Italia


[cars eachWithIndex:^(id object, NSUInteger index) {

    NSLog(@"Car: %@ index: %i", object, index);

}];

// Car: Testarossa index: 0

// Car: F50 index: 1

// Car: F458 Italia index: 2


[cars each:^(id object) {

    NSLog(@"Car: %@", object);

} options:NSEnumerationReverse];

// Car: F458 Italia

// Car: F50

// Car: Testarossa


[cars eachWithIndex:^(id object, NSUInteger index) {

    NSLog(@"Car: %@ index: %i", object, index);

} options:NSEnumerationReverse];

// Car: F458 Italia index: 2

// Car: F50 index: 1

// Car: Testarossa index: 0


[cars map:^(NSString* car) {

    return car.lowercaseString;

}];

// testarossa, f50, f458 italia


// Or, a more common example:

[cars map:^(NSString* carName) {

    return [[Car alloc] initWithName:carName];

}];

// array of Car objects


NSArray *mixedData = @[ @1, @"Objective Sugar!", @"Github", @4, @"5"];


[mixedData select:^BOOL(id object) {

  return ([object class] == [NSString class]);

}];

// Objective Sugar, Github, 5


[mixedData reject:^BOOL(id object) {

    return ([object class] == [NSString class]);

}];

// 1, 4


NSArray *numbers = @[ @5, @2, @7, @1 ];

[numbers sort];

// 1, 2, 5, 7


cars.sample

// 458 Italia

cars.sample

// F50

NSArrayonly

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];


// index from 2 to 4

numbers[@"2..4"];

// [@3, @4, @5]


// index from 2 to 4 (excluded)

numbers[@"2...4"];

// [@3, @4]


// With NSRange location: 2, length: 4

numbers[@"2,4"];

// [@3, @4, @5, @6]


NSValue *range = [NSValue valueWithRange:NSMakeRange(2, 4)];

numbers[range];

// [@3, @4, @5, @6]


[numbers reverse];

// [@6, @5, @4, @3, @2, @1]



NSArray *fruits = @[ @"banana", @"mango", @"apple", @"pear" ];


[fruits includes:@"apple"];

// YES


[fruits take:3];

// banana, mango, apple


[fruits takeWhile:^BOOL(id fruit) {

    return ![fruit isEqualToString:@"apple"];

}];

// banana, mango


NSArray *nestedArray = @[ @[ @1, @2, @3 ], @[ @4, @5, @6, @[ @7, @8 ] ], @9, @10 ];

[nestedArray flatten];

// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10


NSArray *abc = @[ @"a", @"b", @"c" ];

[abc join];

// abc


[abc join:@"-"];

// a-b-c


NSArray *mixedData = @[ @1, @"Objective Sugar!", @"Github", @4, @"5"];


[mixedData detect:^BOOL(id object) {

    return ([object class] == [NSString class]);

}];

// Objective Sugar




// TODO: Make a better / simpler example of this

NSArray *landlockedCountries = @[ @"Bolivia", @"Paraguay", @"Austria", @"Switzerland", @"Hungary" ];

NSArray *europeanCountries = @[ @"France", @"Germany", @"Austria", @"Spain", @"Hungary", @"Poland", @"Switzerland" ];



[landlockedCountries intersectionWithArray:europeanCountries];

// landlockedEuropeanCountries = Austria, Switzerland, Hungary


[landlockedCountries unionWithArray:europeanCountries];

// landlockedOrEuropean = Bolivia, Paraguay, Austria, Switzerland, Hungary, France, Germany, Spain, Poland


[landlockedCountries relativeComplement:europeanCountries];

// nonEuropeanLandlockedCountries = Bolivia, Paraguay


[europeanCountries relativeComplement:landlockedCountries];

// notLandlockedEuropeanCountries = France, Germany, Spain, Poland


[landlockedCountries symmetricDifference:europeanCountries];

// uniqueCountries = Bolivia, Paraguay, France, Germany, Spain, Poland

NSMutableArray

NSMutableArray *people = @[ @"Alice", @"Benjamin", @"Christopher" ];


[people push:@"Daniel"]; // Alice, Benjamin, Christopher, Daniel


[people pop]; // Daniel

// people = Alice, Benjamin, Christopher


[people pop:2]; // Benjamin, Christopher

// people = Alice


[people concat:@[ @"Evan", @"Frank", @"Gavin" ]];

// people = Alice, Evan, Frank, Gavin


[people keepIf:^BOOL(id object) {

    return [object characterAtIndex:0] == 'E';

}];

// people = Evan

NSDictionary

NSDictionary *dict = @{ @"one" : @1, @"two" : @2, @"three" : @3 };


[dict each:^(id key, id value){

    NSLog(@"Key: %@, Value: %@", key, value);

}];

// Key: one, Value: 1

// Key: two, Value: 2

// Key: three, Value: 3


[dict eachKey:^(id key) {

    NSLog(@"Key: %@", key);

}];

// Key: one

// Key: two

// Key: three


[dict eachValue:^(id value) {

    NSLog(@"Value: %@", value);

}];

// Value: 1

// Value: 2

// Value: 3


NSDictionary *errors = @{

    @"username" : @[ @"already taken" ],

    @"password" : @[ @"is too short (minimum is 8 characters)", @"not complex enough" ],

    @"email" : @[ @"can't be blank" ];

};


[errors map:^(id attribute, id reasons) {

    return NSStringWithFormat(@"%@ %@", attribute, [reasons join:@", "]);

}];

// username already taken

// password is too short (minimum is 8 characters), not complex enough

// email can't be blank


[errors hasKey:@"email"]

// true

[errors hasKey:@"Alcatraz"]

// false

NSString

NSString *sentence = NSStringWithFormat(@"This is a text-with-argument %@", @1234);

// This is a text-with-argument 1234


[sentence split];

// array = this, is, a, text-with-argument, 1234


[sentence split:@"-"]

// array = this is a text, with, argument 1234


[sentence containsString:@"this is a"];

// YES

C

unless(_messages) {

    // The body is only executed if the condition is false

    _messages = [self initializeMessages];

}


int iterations = 10;

until(iterations == 0) {

    // The body is executed until the condition is false

    // 10 9 8 7 6 5 4 3 2 1

    printf("%d ", iterations);

    iterations--;

}

printf("\n");


iterations = 10;

do {

    // The body is executed at least once until the condition is false

    // Will print: Executed!

    printf("Executed!\n");

} until(true);

个人评价

这是什么黑科技,简直改变 OC 语法,简化更多语法,简直停不下来。

Kiwi

简介

来源:https://github.com/kiwi-bdd/Kiwi

Kiwi的作用是用来过来更方便的测试程序,可读性更高。

使用

pod "Kiwi"

详细需要看文档。

个人评价

又是一个黑科技,用的时候再查看文档吧。

ViewUtils

简介

来源:https://github.com/nicklockwood/ViewUtils

目的

扩展UIView的 category,有几个方面:

  • 载入Nib- 不需要UIViewController就能载入视图
  • 布局 - 能独立设置位置或者宽/高
  • 搜索 - 检索子视图,通过类,tag 或者正则表达式
  • 响应者 - 找到一个 view 的第一响应者

线程安全

这个只能在主线程使用

使用

把两个文件拖入工程

方法封装了系统的UIView,很多都是非常实用且增加了安全性能。

还能单独修改frame的值。

个人评价

封装UIView的通用功能,安全性得到提高,还能单独修改frame,增加了很多便利。

NSDate-TimeAgo

简介

来源:https://github.com/kevinlawler/NSDate-TimeAgo

可以显示当前时间是多久以前,不过这个已经并入了另一个库里面

使用

导入#import "NSDate+TimeAgo.h"

NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:0];

NSString *ago = [date timeAgo];

NSLog(@"Output is: \"%@\"", ago);

2011-11-12 17:19:25.608 Proj[0:0] Output is: "41 years ago"

还有两种方法

  • dateTimeAgo - 返回{value} {unit} ago 这种格式
  • dateTimeUntilNow - 返回昨天/今早/上个星期/这个月,没有上面的精确但是更自然。

个人评价

如果只需要很简单的功能,这个就能满足,如果需要对时间更强大处理

访问:https://github.com/MatthewYork/DateTools

iOS-FontAwesome

简介

来源:https://github.com/alexdrone/ios-fontawesome

添加字体,还有图片

使用

首先,在工程里面必须有FontAwesome.ttf,而且在plist文件中的UIAppFonts必须包换一个String item名字叫FontAwesome.ttf

然后再导入NSString+FontAwesome

UILabel *label = [...]

label.font = [UIFont fontWithName:kFontAwesomeFamilyName size:20];

还能使用枚举

label.text = [NSString fontAwesomeIconStringForEnum:FAGithub];

当然,最重要还是查看文档,里面提供各种字体。

个人评价

确实很不错,很多种类型的字体,还有图片的,总之很给力。

NSObject-AutoDescription

简介

来源:https://github.com/djmadcat/NSObject-AutoDescription

增加对NSArray,NSDictionary还有NSSet的描述支持

使用

#import "NAUser.h"

#import "NSObject+AutoDescription.h"


@implementation NAUser


- (NSString *)description

{

    return [self autoDescription];

}


@end

个人评价

小而美,有需求的话可以用下。

CGRectPositioning

简介

来源:https://github.com/mvx24/CGRectPositioning

这个是个宏文件

可以对CGRect很方便的处理

使用

看名字就能知道了,把CGRectPositioning.h导入工程,里面全是宏

个人评价

代码布局的时候,使用这个就能很方便

MZTimerLabel

来源:https://github.com/mineschan/MZTimerLabel

倒计时专用label,处理登录获取短信倒计时可用

个人评价

刚刚发现的好货,先存起来,配合时间相关方法,可以根据接口请求的时间戳做一些操作

总结

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

MJPopupViewController:一个UIViewController类别,用于将ViewController显示为具有不同过渡效果的弹出窗口 MJPopupViewController(不建议使用) 一个UIViewController类别,用于将ViewController显示为具有不同过渡效果的弹出窗口。 撰写,2012年6月。 注意:您不应再使用此类别,因为它已经过时,并且有更多现代方法可以解决此问题。 安装 只需将Source下的文件拖放到Xcode项目中即可。 另外,您需要将QuartzCore-Framework添加到您的项目中。 用法 首先,您必须导入类别 #import "UIViewController+MJPopupViewController.h" 然后只需使用presentPopupViewController:animationType ,例如: [self presentPopupViewController:detailViewController animationType:MJPopup 立即下载

相关推荐

【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据

电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性

GBupupup的博客 2111

[ 物联网篇 ] 09 - Buildroot中构建NXP IMX8MM

遇到的两个问题 : 下载buildroot-2019.05-rc2版本,构建freescale_imx8mmevk_defconfig(由于imx8mmevk 和imx8mqevk差别不大,因此在imx8mqevk的基础上得到imx8mmevk) , 构建出的固件烧录到开发板,发现无法启动 make freescale_imx8mmevk_defconfig make // buildro...

程序手艺人 - 嵌入式音频技术之旅 4998

Pyrosim进阶指南:从隧道火灾模拟到复杂通风策略分析

本文深入探讨Pyrosim在隧道火灾模拟与通风策略分析中的高级应用。从精确几何建模到火源参数设置,再到通风系统的量化分析,详细介绍了如何利用Pyrosim优化隧道安全设计。特别强调了临界风速验证、横向通风配置及结果可视化技巧,为工程师提供实用的进阶指南。

weixin_30644369的博客 138

Ubuntu环境下Buildroot开发详细介绍

Buildroot是嵌入式Linux开发中一款高效、简洁的自动化构建工具,而Ubuntu凭借完善的生态和便捷的操作,成为Buildroot开发的理想宿主环境。本文从Buildroot核心概述、Ubuntu环境准备、源码获取、配置编译、进阶技巧到常见问题,详细介绍了Ubuntu环境下Buildroot的开发全流程,旨在帮助开发者快速上手,降低嵌入式系统构建的门槛。

大雨淅淅的博客 1367

【Web实战】微信小程序逆向

2E 70 6E 67”为带存放路径的文件名称,“00 00 11 7C”对应文件在小程序包中的具体偏移位置,“00 01 01 F7“对应文件在小程序包中的数据长度。但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“js”文件压入“app-service.js”文件中,将所有的“json”文件压入“app-config.json”中,将所有的“wxml”文件压入“page-frame.html”文件中,“wxss”则在处理之后以“html”文件的形式存留在对应页面目录之下。

若有战,召必回 1944

Microsoft Speech SDK 使用过程中女声改为男声遇到的问题

问题将女生改为系统自带男声(Kangkang)根据上面的步骤我的播放声音是改变了,但是还是女生,是yaoyao的女生。是因为下面注册表路径中VoicePath这个配置的路径指向了yaoyao的文件。 如何使用Microsoft Speech SDK,请参考https://blog.youkuaiyun.com/daoming1112/article/details/77542562 使用系统自带男声语音,不需...

u012161365的博客 7538

【Linux驱动开发IMX6ULL】使用NXP MfgTool 烧写系统到eMMC

2、因为不会移植uboot、内核、正点原子的内核版本又比较低。1、完全基于亿佰特iMX6ULLBTB核心板。3、内核版本为5.10。

Liaiblog 572

Echarts之风力风速玫瑰图

风力风速玫瑰图前言改进之路代码如下总结导出与导入 前言 今天上班收到任务,我们老大让我研究一下这个“风速风向玫瑰图”,还说这个是百度的雷达图的变异体,于是乎我直接找的雷达图,但是雷达图没有这种柱形的,都是点线,然后我又找了好久,最后突然在echarts官网上面看到了图1-2,才终于有了思路,原来这个图不是雷达图的变异体,而是极坐标系下的堆叠柱状图,于是就开始我的“改进”之路了。 图1-1 改进之路...

qq_38776605的博客 1万+

推荐项目:ProvisionQL — 快速预览iOS与macOS开发者必备工具

在忙碌的iOS和macOS开发中,快速查看.ipa、.xcarchive或.mobileprovision文件的信息至关重要。这就引出了我们今天的主角——[ProvisionQL](https://github.com/ealeksandrov/ProvisionQL),一个强大且免费的Quick Look插件,为开发者提供了一种高效的方式,以一目了然的形式查看和理解这些文件的内容。 ## 项目...

gitblog_00039的博客 657

电流镜设计实战:从基础到高级技巧(附常见问题解决方案)

本文从工程实战角度,系统讲解了电流镜设计从基础原理到高级技巧的全过程。深入剖析了匹配精度、输出阻抗等核心矛盾,并详细介绍了共源共栅(Cascode)结构如何平衡电压裕度与输出阻抗。文章还重点探讨了工艺偏差、版图应力效应等实战中的“隐形杀手”,并提供了常见问题的解决方案与调试技巧,旨在帮助工程师设计出鲁棒性更强的模拟电路。

blockchain9miner的博客 730

华为OD机试 - 报文响应时间 - 贪心算法、位运算(Python/JS/C/C++ 2024 E卷 200分)

贪心算法是在每一步选择中都做出当前最优的选择,期望通过局部最优解推导出全局最优解的算法。

学Java,找哪吒 1757

如何快速集成CNPPopupController?iOS开发者必备弹窗库教程

CNPPopupController是一款简单而多功能的iOS弹窗库,能够以多种方式展示自定义弹窗,包含丰富的弹窗外观和行为控制选项。对于iOS开发者来说,这是实现各类弹窗效果的实用工具。 ## 📌 什么是CNPPopupController? CNPPopupController是一个轻量级的iOS弹窗控制器类,它允许开发者轻松创建和定制各种样式的弹窗。无论是需要底部滑出的操作表、居中显示

gitblog_00090的博客 911

SAP 中租赁资产的实现需区分经营租赁与融资租赁,核心围绕资产主数据配置、折旧与利息设置、科目分配及业务操作展开

摘要:SAP系统租赁资产管理需区分经营租赁与融资租赁,通过SPRO配置资产主数据、折旧范围、利息计算及科目分配。关键步骤包括:激活折旧范围利息计算(OABZ)、设置租赁资产类别(OAYZ)、维护总账科目(AO90)及创建租赁资产主数据(AS01)。业务操作涵盖资产资本化(ABZON)、折旧利息过账(AFAB)、租金支付(F-53)及终止处理(ABUMN)。核心配置要点在于准确设置租赁类型、利率参数和科目联动,确保系统自动计算折旧与利息并生成正确凭证。

金牌架构师 1072

iOS快速开发必备的几种类库总结

本文主要讲述了开发iOS应用时经常用到的一些第三方类库,这些类库可加快开发进度,现在整理出来分享给iOS程序员兄弟们,希望给他们的开发工作带来帮助。 当前移动互联网行业太火爆,移动端的需求日益增长,很多开发人员每天都应对着各种需求,作为一名iOS开发人员,对于需求来说,我们要做到的是实现,而对于自己来说,我们需要做到的是写出高质量的代码。 于是,全球的大神们开源了很多高质量、可复用的代

dongtinghong的专栏 1234

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

doccano数据标注实战:从部署到团队交付

如果你团队里有人为手工整理标注标签熬过夜,doccano 值得试一下。它是一款免费的开源AI数据标注工具,覆盖从导入数据到导出标注数据集的完整流程,适合算法工程师和数据团队做中小规模标注任务。我用标注工具3年,下面按我一般怎么搞的 doccano标注流程 展开:部署 → 建项目 → 灌数据 → 标注 → 交付。 ## 🚀 doccano部署教程:三种方式任选,团队上Compose 部署有三种

gitblog_00492的博客 736

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

iOS开发必备:QRCode库5分钟快速上手教程

QRCode是一款适用于macOS、iOS、tvOS和watchOS的SwiftUI、Swift及Objective-C二维码生成与识别库,能帮助开发者快速实现高质量二维码功能。本文将带你5分钟内掌握其核心用法,轻松集成到iOS项目中。 ## 一、QRCode库简介 QRCode库提供了全面的二维码解决方案,支持多种平台和开发语言。无论是简单的黑白二维码,还是带有自定义样式和logo的复杂二维

gitblog_00030的博客 642

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ProvisionQL终极指南:10分钟掌握iOS开发必备的快速预览神器

ProvisionQL是一款专为iOS和macOS开发者打造的Quick Look插件,能够快速预览ipa文件和移动设备配置文件,显著提升开发效率。通过这款免费工具,开发者可以即时查看应用信息、配置文件详情和设备列表,无需打开Xcode即可获取关键开发信息。 ## 为什么选择ProvisionQL?快速解决iOS开发痛点 作为iOS开发者,你是否经常遇到这些问题:需要频繁打开Xcode查看配置

gitblog_01148的博客 1073

如何快速集成 MarkdownView:iOS 开发者必备的终极 Markdown 渲染库

MarkdownView 是一款专为 iOS 平台打造的高效 Markdown 渲染库,基于 WKWebView 构建,能帮助开发者轻松在应用中实现精美的 Markdown 文本展示。无论是传统 UIKit 还是现代 SwiftUI 项目,它都能提供稳定、灵活的渲染解决方案,让你的应用文本展示更具专业性和可读性。 ## ???? 核心功能一览:为什么选择 MarkdownView? Markdow...

gitblog_00298的博客 490

5分钟快速集成TabPageViewController:iOS开发者必备技能

想在iOS应用中快速实现优雅的分页标签导航吗?TabPageViewController是你的完美选择!这个强大的Swift库让分页视图控制器和滚动标签栏的实现变得异常简单,只需5分钟就能集成到你的项目中。无论你是开发新闻应用、电商平台还是社交软件,TabPageViewController都能为你提供流畅的用户体验和高度可定制的界面。 ## 为什么选择TabPageViewController

gitblog_01032的博客 428

如何快速集成Lightbox:iOS开发者必备的图片查看神器

Lightbox是一款专为iOS应用打造的便捷图片查看库,它能帮助开发者轻松实现专业级的图片浏览功能,让用户在应用中获得流畅优雅的图片查看体验。无论是社交应用、摄影App还是电商平台,Lightbox都能成为提升用户体验的得力助手。 ## 为什么选择Lightbox? 作为iOS开发者,我们常常需要为应用添加图片查看功能。而Lightbox正是为解决这一需求而生的优秀库,它具有以下核心优势:

gitblog_00077的博客 514

iOS开发必备:Prepo图标生成器快速上手指南

苹果对应用图标的尺寸规范要求非常严格,从App Store展示的1024x1024大图标,到不同设备需要的@2x、@3x等多种规格,手动处理既繁琐又容易出错。开发者只需提供一张1024x1024的高清原图,工具就能自动生成包括iPad Pro、iPhone各机型所需的所有标准尺寸图标,省去了反复裁切调整的麻烦。的在线原型生成功能。无需安装任何软件,输入简单需求就能获得可预览的图标处理方案,特别适合在方案确认阶段快速验证设计效果。实际使用中发现,这种所见即所得的方式能大幅减少开发前的沟通成本。

MoonbeamFalcon67的博客 425

如何快速集成Toaster:iOS开发必备的Toast提示库完整指南

Toaster是一款专为Swift开发者打造的轻量级Toast提示库,它能帮助iOS应用快速实现简洁美观的消息提示功能。无论是显示操作结果、加载状态还是错误信息,Toaster都能提供流畅的用户体验,是移动开发中不可或缺的工具库。 ## 📱 Toaster核心功能展示 Toaster提供了多种灵活的Toast提示样式,满足不同场景需求。以下是实际运行效果展示,展示了基础提示、自定义时长和延迟

gitblog_00048的博客 507

如何快速集成MTHawkeye?iOS开发者必备调试工具安装教程

MTHawkeye是一款专为iOS开发者打造的调试优化辅助工具集,集成了内存泄漏检测、ANR卡顿追踪、网络监控等实用功能,能帮助开发者在开发阶段快速发现并解决性能问题。本文将详细介绍如何在项目中快速集成MTHawkeye,让你的调试效率提升300%! ## 📚 MTHawkeye核心功能简介 MTHawkeye采用模块化架构设计,主要包含以下核心功能模块: [![MTHawkeye架构图]

gitblog_00211的博客 713
上一篇: iOS动态更新
下一篇: 在Xcode 7上直接使用Address Sanitizer
潘柏信
博客等级 码龄11年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值