iOS开发中的一些常用方法

1.磁盘总空间大小

+ (CGFloat)diskOfAllSizeMBytes

{

CGFloat size = 0.0;

NSError *error;

NSDictionary *dic = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];

if(error) {

#ifdef DEBUG

NSLog(@"error: %@", error.localizedDescription);

#endif

}else{

NSNumber *number = [dic objectForKey:NSFileSystemSize];

size = [number floatValue]/1024/1024;

}

returnsize;

}

2.磁盘可用空间大小

+ (CGFloat)diskOfFreeSizeMBytes

{

CGFloat size = 0.0;

NSError *error;

NSDictionary *dic = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];

if(error) {

#ifdef DEBUG

NSLog(@"error: %@", error.localizedDescription);

#endif

}else{

NSNumber *number = [dic objectForKey:NSFileSystemFreeSize];

size = [number floatValue]/1024/1024;

}

returnsize;

}

3.将字符串数组按照元素首字母顺序进行排序分组

+ (NSDictionary *)dictionaryOrderByCharacterWithOriginalArray:(NSArray *)array

{

if(array.count == 0) {

returnnil;

}

for(id obj in array) {

if(![obj isKindOfClass:[NSStringclass]]) {

returnnil;

}

}

UILocalizedIndexedCollation *indexedCollation = [UILocalizedIndexedCollation currentCollation];

NSMutableArray *objects = [NSMutableArray arrayWithCapacity:indexedCollation.sectionTitles.count];

//创建27个分组数组

for(inti = 0; i < indexedCollation.sectionTitles.count; i++) {

NSMutableArray *obj = [NSMutableArray array];

[objects addObject:obj];

}

NSMutableArray *keys = [NSMutableArray arrayWithCapacity:objects.count];

//按字母顺序进行分组

NSInteger lastIndex = -1;

for(inti = 0; i < array.count; i++) {

NSInteger index = [indexedCollation sectionForObject:array[i] collationStringSelector:@selector(uppercaseString)];

[[objects objectAtIndex:index] addObject:array[i]];

lastIndex = index;

}

//去掉空数组

for(inti = 0; i < objects.count; i++) {

NSMutableArray *obj = objects[i];

if(obj.count == 0) {

[objects removeObject:obj];

}

}

//获取索引字母

for(NSMutableArray *obj in objects) {

NSString *str = obj[0];

NSString *key = [self firstCharacterWithString:str];

[keys addObject:key];

}

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

[dic setObject:objects forKey:keys];

returndic;

}

4.将字符串数组按照元素首字母顺序进行排序分组

+ (NSDictionary *)dictionaryOrderByCharacterWithOriginalArray:(NSArray *)array

{

if(array.count == 0) {

returnnil;

}

for(id obj in array) {

if(![obj isKindOfClass:[NSStringclass]]) {

returnnil;

}

}

UILocalizedIndexedCollation *indexedCollation = [UILocalizedIndexedCollation currentCollation];

NSMutableArray *objects = [NSMutableArray arrayWithCapacity:indexedCollation.sectionTitles.count];

//创建27个分组数组

for(inti = 0; i < indexedCollation.sectionTitles.count; i++) {

NSMutableArray *obj = [NSMutableArray array];

[objects addObject:obj];

}

NSMutableArray *keys = [NSMutableArray arrayWithCapacity:objects.count];

//按字母顺序进行分组

NSInteger lastIndex = -1;

for(inti = 0; i < array.count; i++) {

NSInteger index = [indexedCollation sectionForObject:array[i] collationStringSelector:@selector(uppercaseString)];

[[objects objectAtIndex:index] addObject:array[i]];

lastIndex = index;

}

//去掉空数组

for(inti = 0; i < objects.count; i++) {

NSMutableArray *obj = objects[i];

if(obj.count == 0) {

[objects removeObject:obj];

}

}

//获取索引字母

for(NSMutableArray *obj in objects) {

NSString *str = obj[0];

NSString *key = [self firstCharacterWithString:str];

[keys addObject:key];

}

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

[dic setObject:objects forKey:keys];

returndic;

}

5.对图片进行滤镜处理

// 怀旧 --> CIPhotoEffectInstant                         单色 --> CIPhotoEffectMono

// 黑白 --> CIPhotoEffectNoir                            褪色 --> CIPhotoEffectFade

// 色调 --> CIPhotoEffectTonal                           冲印 --> CIPhotoEffectProcess

// 岁月 --> CIPhotoEffectTransfer                        铬黄 --> CIPhotoEffectChrome

// CILinearToSRGBToneCurve, CISRGBToneCurveToLinear, CIGaussianBlur, CIBoxBlur, CIDiscBlur, CISepiaTone, CIDepthOfField

+ (UIImage *)filterWithOriginalImage:(UIImage *)image filterName:(NSString *)name

{

CIContext *context = [CIContext contextWithOptions:nil];

CIImage *inputImage = [[CIImage alloc] initWithImage:image];

CIFilter *filter = [CIFilter filterWithName:name];

[filter setValue:inputImage forKey:kCIInputImageKey];

CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:result fromRect:[result extent]];

UIImage *resultImage = [UIImage imageWithCGImage:cgImage];

CGImageRelease(cgImage);

returnresultImage;

}

6.对图片进行模糊处理

// CIGaussianBlur ---> 高斯模糊

// CIBoxBlur      ---> 均值模糊(Available in iOS 9.0 and later)

// CIDiscBlur     ---> 环形卷积模糊(Available in iOS 9.0 and later)

// CIMedianFilter ---> 中值模糊, 用于消除图像噪点, 无需设置radius(Available in iOS 9.0 and later)

// CIMotionBlur   ---> 运动模糊, 用于模拟相机移动拍摄时的扫尾效果(Available in iOS 9.0 and later)

+ (UIImage *)blurWithOriginalImage:(UIImage *)image

blurName:(NSString *)name

radius:(NSInteger)radius

{

CIContext *context = [CIContext contextWithOptions:nil];

CIImage *inputImage = [[CIImage alloc] initWithImage:image];

CIFilter *filter;

if(name.length != 0) {

filter = [CIFilter filterWithName:name];

[filter setValue:inputImage forKey:kCIInputImageKey];

if(![name isEqualToString:@"CIMedianFilter"]) {

[filter setValue:@(radius) forKey:@"inputRadius"];

}

CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:result fromRect:[result extent]];

UIImage *resultImage = [UIImage imageWithCGImage:cgImage];

CGImageRelease(cgImage);

returnresultImage;

}else{

returnnil;

}

}

7.跳转到系统的相关界面:

/*

*  需要添加一个字段

*  蓝色的项目工程文件 -> Info -> URL Types -> 添加一个 -> 设置URL  Sch**** 为 prefs的url

NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];

[[UIApplication sharedApplication] openURL:url];

跳转到其他的界面的字段(不全,详细看链接)

About — prefs:root=General&path=About

Accessibility — prefs:root=General&path=ACCESSIBILITY

AirplaneModeOn— prefs:root=AIRPLANE_MODE

Auto-Lock — prefs:root=General&path=AUTOLOCK

Brightness — prefs:root=Brightness

Bluetooth — prefs:root=General&path=Bluetooth

Date& Time — prefs:root=General&path=DATE_AND_TIME

FaceTime — prefs:root=FACETIME

General— prefs:root=General

原文链接:http://www.jianshu.com/p/19602f48309b

*/

8.创建一张实时模糊效果 View (毛玻璃效果)

//Avilable in iOS 8.0 and later

+ (UIVisualEffectView *)effectViewWithFrame:(CGRect)frame

{

UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];

effectView.frame = frame;

returneffectView;

}

9.设置Label的行间距

+ (void)setLineSpaceWithString:(UILabel *)label

{

NSMutableAttributedString *attributedString =

[[NSMutableAttributedString alloc] initWithString:label.text];

NSMutableParagraphStyle *paragraphStyle =  [[NSMutableParagraphStyle alloc] init];

[paragraphStyle setLineSpacing:3];

//调整行间距

[attributedString addAttribute:NSParagraphStyleAttributeName

value:paragraphStyle

range:NSMakeRange(0, [label.text length])];

label.attributedText = attributedString;

}

10.让Plain风格的TableView的区头可以”不悬停”(可以直接百度搜到):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

if(scrollView == self.myTab) {

CGFloat sectionHeaderHeight = 40;

if(scrollView.contentOffset.y=0) {

scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);

}elseif(scrollView.contentOffset.y>=sectionHeaderHeight) {

scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);

}

}

}

11. 判断手机号码格式是否正确,利用正则表达式验证

+ (BOOL)isMobileNumber:(NSString *)mobileNum

{

if (mobileNum.length != 11)

{

return NO;

}

/**

* 手机号码:

* 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9]

* 移动号段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705

* 联通号段: 130,131,132,155,156,185,186,145,176,1709

* 电信号段: 133,153,180,181,189,177,1700

*/

NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|70)\d{8}$";

/**

* 中国移动:China Mobile

* 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705

*/

NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\d{8}$)|(^1705\d{7}$)";

/**

* 中国联通:China Unicom

* 130,131,132,155,156,185,186,145,176,1709

*/

NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\d{8}$)|(^1709\d{7}$)";

/**

* 中国电信:China Telecom

* 133,153,180,181,189,177,1700

*/

NSString *CT = @"(^1(33|53|77|8[019])\d{8}$)|(^1700\d{7}$)";

NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];

NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];

NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];

NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];

if (([regextestmobile evaluateWithObject:mobileNum] == YES)

|| ([regextestcm evaluateWithObject:mobileNum] == YES)

|| ([regextestct evaluateWithObject:mobileNum] == YES)

|| ([regextestcu evaluateWithObject:mobileNum] == YES))

{

return YES;

}

else

{

return NO;

}

}

12. 判断邮箱格式是否正确,利用正则表达式验证

+ (BOOL)isAvailableEmail:(NSString *)email

{

NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}";

NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];

return [emailTest evaluateWithObject:email];

}

13. 判断字符串中是否含有空格

+ (BOOL)isHaveSpaceInString:(NSString *)string{

NSRange _range = [string rangeOfString:@" "];

if (_range.location != NSNotFound) {

return YES;

}else {

return NO;

}

}

14. 判断字符串中是否含有中文

+ (BOOL)isHaveChineseInString:(NSString *)string

{

for(NSInteger i = 0; i < [string length]; i++){

int a = [string characterAtIndex:i];

if (a > 0x4e00 && a < 0x9fff) {

return YES;

}

}

return NO;

}

15. 判断字符串是否全部为数字

+ (BOOL)isAllNum:(NSString *)string{    unichar c;    for (int i=0; i<="" pre="">

判断是否是纯数字

+ (BOOL)isPureInteger:(NSString *)str {

NSScanner *scanner = [NSScanner scannerWithString:str];

NSInteger val;

return [scanner scanInteger:&val] && [scanner isAtEnd];

}

16. 过滤一些特殊字符 似乎只能去除头尾的特殊字符(不准)

+ (NSString *)filterSpecialWithString:(NSString *)string

{

// 定义一个特殊字符的集合

NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:

@"@/:;: ;()?「」"、[]{}#%-*+=_|~<>$?^?'@#$%^&*()_+'"];

// 过滤字符串的特殊字符

NSString *newString = [string stringByTrimmingCharactersInSet:set];

return newString;

}

17. 让iOS应用直接退出

+ (void)backOutApp {

UIWindow *window = [[UIApplication sharedApplication].delegate window];

[UIView animateWithDuration:1.0f animations:^{

window.alpha = 0;

} completion:^(BOOL finished) {

exit(0);

}];

}

18. NSArray 快速求总和、最大值、最小值、平均值

+ (NSString *)caculateArray:(NSArray *)array

{

CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];

CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];

CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];

CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];

NSLog(@"%fn%fn%fn%f",sum,avg,max,min);

return [NSString stringWithFormat:@"%f",sum];

}

19. 验证身份证(本人试过,还挺准的)

+ (BOOL)checkIdentityCardNo:(NSString*)value {

value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSInteger length =0;

if (!value) {

return NO;

}else {

length = value.length;

if (length !=15 && length !=18) {

return NO;

}

}

// 省份代码

NSArray *areasArray =@[@"11",@"12", @"13",@"14", @"15",@"21", @"22",@"23", @"31",@"32", @"33",@"34", @"35",@"36", @"37",@"41", @"42",@"43", @"44",@"45", @"46",@"50", @"51",@"52", @"53",@"54", @"61",@"62", @"63",@"64", @"65",@"71", @"81",@"82", @"91"];

NSString *valueStart2 = [value substringToIndex:2];

BOOL areaFlag =NO;

for (NSString *areaCode in areasArray) {

if ([areaCode isEqualToString:valueStart2]) {

areaFlag =YES;

break;

}

}

if (!areaFlag) {

return false;

}

NSRegularExpression *regularExpression;

NSUInteger numberofMatch;

NSInteger year =0;

switch (length) {

case 15:

year = [[value substringWithRange:NSMakeRange(6,2)] integerValue] +1900;

if (year %4 ==0 || (year 0 ==0 && year %4 ==0)) {

regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"

options:NSRegularExpressionCaseInsensitive

error:nil];//测试出生日期的合法性

}else {

regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"

options:NSRegularExpressionCaseInsensitive

error:nil];//测试出生日期的合法性

}

numberofMatch = [regularExpression numberOfMatchesInString:value                                                options:NSMatchingReportProgress

range:NSMakeRange(0, value.length)];

if(numberofMatch >0) {

return YES;

}else {

return NO;

}

case 18:

year = [value substringWithRange:NSMakeRange(6,4)].intValue;

if (year %4 ==0 || (year 0 ==0 && year %4 ==0)) {

regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"

options:NSRegularExpressionCaseInsensitive                                                                    error:nil];//测试出生日期的合法性

}else {

regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"                                                                      options:NSRegularExpressionCaseInsensitive                                                                    error:nil];//测试出生日期的合法性

}

numberofMatch = [regularExpression numberOfMatchesInString:value                                                options:NSMatchingReportProgress                                                    range:NSMakeRange(0, value.length)];

if(numberofMatch >0) {

int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;

int Y = S ;

NSString *M =@"F";

NSString *JYM =@"10X98765432";

M = [JYM substringWithRange:NSMakeRange(Y,1)];// 判断校验位

if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {

return YES;// 检测ID的校验位

}else {

return NO;

}

}else {

return NO;

}

default:

return false;

}

}

20. 设置Label里的字符有不同的颜色

//可根据自己的需求进行增删改

- (void)stringColorSet {

NSString*string = @"如何使得Label里的字符有不同的颜色?";

NSRange range = [string rangeOfString: @"Label"];

NSMutableAttributedString*attribute = [[NSMutableAttributedString alloc] initWithString: string];

[attribute addAttributes: @{NSForegroundColorAttributeName: [UIColor redColor]}range: range];

[attribute addAttributes: @{NSForegroundColorAttributeName: [UIColor greenColor]}range: NSMakeRange(0, range.location)];

[attribute addAttributes: @{NSForegroundColorAttributeName: [UIColor cyanColor]}range: NSMakeRange(range.location+ range.length, 5)];

UILabel *label = [[UILabel alloc] initWithFrame: CGRectMake(0.0f, 100.0f, 320.0f, 100.0f)];

[label setText: string];

[label setAttributedText: attribute];

}

如果上面的文章对您在开发中能派上用场,请关注或点个赞吧,我会不定期的给您分享或推荐一些好的文章哦^_^

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容