自己整理了一個(gè)常用的工具類,歡迎大家吐槽~
↓↓↓↓↓↓
#pragma mark - NSString字符串
// 判斷字符串為空
+ (BOOL)isEmptyOrNull:(NSString *)string
{
if (string == nil)
{
return YES;
}
if (string == NULL)
{
return YES;
}
if ([string isKindOfClass:[NSNull class]])
{
return YES;
}
if ([string isEqualToString:@""])
{
return YES;
}
if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0)
{
return YES;
}
return NO;
}
// 檢查字符串是否是純數(shù)字
+ (BOOL)checkStringIsOnlyDigital:(NSString *)str
{
NSString *string = [str stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
if(string.length >0)
{
return NO;
}else return YES;
}
//檢查字符串是否為nil 轉(zhuǎn)為@""
+ (NSString *)checkStringValue:(id)str
{
if ([str isKindOfClass:[NSNull class]]) {
return @"";
}
return str;
}
//判斷字符串中包含漢字
+ (BOOL)checkStringIsContainerChineseCharacter:(NSString *)string
{
for (int i = 0; i < string.length; i++)
{
int a = [string characterAtIndex:i];
if (a >= 0x4e00 && a <= 0x9fff) {
return YES;
}
}
return NO;
}
//過濾特殊字符串
+ (NSString *)filterSpecialString:(NSString *)string
{
NSCharacterSet *dontWant = [NSCharacterSet characterSetWithCharactersInString:@"[]{}(#%-*+=_)\\|~(<>$%^&*)_+,.;':|/@!? "];
//stringByTrimmingCharactersInSet只能去掉首尾的特殊字符串
return [[[string componentsSeparatedByCharactersInSet:dontWant] componentsJoinedByString:@""] stringByReplacingOccurrencesOfString:@"\n" withString:@""];
}
#pragma mark - 字符串size
/**
* 計(jì)算字符串尺寸
*
* @param string
* @param font 字體
* @param size
*
* @return
*/
+ (CGSize)sizeWithString:(NSString *)string font:(UIFont *)font size:(CGSize)size
{
NSDictionary *dic = @{NSFontAttributeName:font};
return [string boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin) attributes:dic context:nil].size;
}
#pragma mark - UIColor
+ (UIColor *)colorFromHexCode:(NSString *)hexString
{
if (!hexString) {
return [UIColor clearColor];
}
NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
if([cleanString length] == 3) {
cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@",
[cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)],
[cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)],
[cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]];
}
if([cleanString length] == 6) {
cleanString = [cleanString stringByAppendingString:@"ff"];
}
unsigned int baseValue;
[[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue];
float red = ((baseValue >> 24) & 0xFF)/255.0f;
float green = ((baseValue >> 16) & 0xFF)/255.0f;
float blue = ((baseValue >> 8) & 0xFF)/255.0f;
float alpha = ((baseValue >> 0) & 0xFF)/255.0f;
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
//從圖片轉(zhuǎn)到顏色
+ (UIColor *)colorFromImage:(UIImage *)image
{
if (image == nil)
{
return [UIColor clearColor];
} else {
return [UIColor colorWithPatternImage:image];
}
}
#pragma mark - UIImage
//從顏色生成圖片
+ (UIImage *)imageFromUIColor:(UIColor *)color {
if (!color) {
color = [UIColor clearColor];
}
CGRect rect = CGRectMake(0, 0, 1, 1);
// create a 1 by 1 pixel context
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
[color setFill];
UIRectFill(rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
#pragma mark - 壓縮圖片
// 壓縮圖片按照大小
+ (UIImage *)image:(UIImage *)image scaleToSize:(CGSize)size
{
CGImageRef imgRef = image.CGImage;
CGSize originSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); // 原始大小
if (CGSizeEqualToSize(originSize, size)) {
return image;
}
UIGraphicsBeginImageContextWithOptions(size, NO, 0); //[UIScreen mainScreen].scale
CGContextRef context = UIGraphicsGetCurrentContext();
/**
* 設(shè)置CGContext集插值質(zhì)量
* kCGInterpolationHigh 插值質(zhì)量高
*/
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
// 壓縮圖片按照比例
+ (UIImage *)image:(UIImage *)image scaleWithRatio:(CGFloat)ratio
{
CGImageRef imgRef = image.CGImage;
if (ratio > 1 || ratio <= 0) {
return image;
}
CGSize size = CGSizeMake(CGImageGetWidth(imgRef) * ratio, CGImageGetHeight(imgRef) * ratio); // 縮放后大小
return [self image:image scaleToSize:size];
}
#pragma mark - 添加水印
+ (UIImage *)image:(UIImage *)img addLogo:(UIImage *)logo
{
if (logo == nil ) {
return img;
}
if (img == nil) {
return nil;
}
//get image width and height
int w = img.size.width;
int h = img.size.height;
int logoWidth = logo.size.width;
int logoHeight = logo.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//create a graphic context with CGBitmapContextCreate
CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 44 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
CGContextDrawImage(context, CGRectMake(w-logoWidth-15, 10, logoWidth, logoHeight), [logo CGImage]);
CGImageRef imageMasked = CGBitmapContextCreateImage(context);
UIImage *returnImage = [UIImage imageWithCGImage:imageMasked];
CGContextRelease(context);
CGImageRelease(imageMasked);
CGColorSpaceRelease(colorSpace);
return returnImage;
}
#pragma mark - NSUserDefault
// 取值
id UserDefaultGetObj(NSString *key)
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
return [ud objectForKey:key];
}
// 存入
void UserDefaultSetObjForKey(id object,NSString *key)
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setValue:object forKey:key];
[ud synchronize];
}
// 移除
void UserDefaultRemoveObjForKey(NSString *key)
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud removeObjectForKey:key];
[ud synchronize];
}
// 清空
void UserDefaultClean()
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[ud synchronize];
}
#pragma mark - SandBox 沙盒相關(guān)
NSString *pathDocuments()
{
return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
}
NSString *pathCaches()
{
return NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
}
/**
* Documents/name path
*
* @param name
*
* @return
*/
NSString *pathDocumentsWithFileName(NSString *name)
{
return [pathDocuments() stringByAppendingString:name];
}
/**
* Caches/name path
*
* @param name
*
* @return
*/
NSString *pathCachesWithFileName(NSString *name)
{
return [pathCaches() stringByAppendingString:name];
}
#pragma mark - 檢查手機(jī)號(hào)碼是否規(guī)范
/**
* 檢查是否為正確手機(jī)號(hào)碼
*
* @param phoneNumber 手機(jī)號(hào)
*
* @return
*/
+ (BOOL)checkPhoneNumber:(NSString *)phoneNumber
{
if (phoneNumber.length != 11)
{
return NO;
}
/**
* 手機(jī)號(hào)碼:
* 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[0, 1, 6, 7, 8], 18[0-9]
* 移動(dòng)號(hào)段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
* 聯(lián)通號(hào)段: 130,131,132,145,155,156,170,171,175,176,185,186
* 電信號(hào)段: 133,149,153,170,173,177,180,181,189
*/
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$";
/**
* 中國(guó)移動(dòng):China Mobile
* 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
*/
NSString *CM = @"^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$";
/**
* 中國(guó)聯(lián)通:China Unicom
* 130,131,132,145,155,156,170,171,175,176,185,186
*/
NSString *CU = @"^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\\d{8}$";
/**
* 中國(guó)電信:China Telecom
* 133,149,153,170,173,177,180,181,189
*/
NSString *CT = @"^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$";
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:phoneNumber] == YES)
|| ([regextestcm evaluateWithObject:phoneNumber] == YES)
|| ([regextestct evaluateWithObject:phoneNumber] == YES)
|| ([regextestcu evaluateWithObject:phoneNumber] == YES))
{
return YES;
}
else
{
return NO;
}
}
#pragma mark - 檢查郵箱地址格式
/**
* 檢查郵箱地址格式
*
* @param EmailAddress 郵箱地址
*
* @return
*/
+ (BOOL)checkEmailAddress:(NSString *)EmailAddress
{
NSString *emailRegEx =
@"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
@"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
@"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
@"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
@"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
@"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
@"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
NSPredicate *regExPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegEx];
//先把NSString轉(zhuǎn)換為小寫
NSString *lowerString = EmailAddress.lowercaseString;
return [regExPredicate evaluateWithObject:lowerString] ;
}
#pragma mark - 身份證相關(guān)
/**
* 判斷身份證是否合法
*
* @param number 身份證號(hào)碼
*
* @return
*/
+ (BOOL)checkIdentityNumber:(NSString *)number
{
{
//必須滿足以下規(guī)則
//1. 長(zhǎng)度必須是18位或者15位,前17位必須是數(shù)字,第十八位可以是數(shù)字或X
//2. 前兩位必須是以下情形中的一種: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
//3. 第7到第14位出生年月日。第7到第10位為出生年份;11到12位表示月份,范圍為01-12;13到14位為合法的日期
//4. 第17位表示性別,雙數(shù)表示女,單數(shù)表示男
//5. 第18位為前17位的校驗(yàn)位
//算法如下:
//(1)校驗(yàn)和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n數(shù)值,表示第幾位的數(shù)字
//(2)余數(shù) = 校驗(yàn)和 % 11
//(3)如果余數(shù)為0,校驗(yàn)位應(yīng)為1,余數(shù)為1到10校驗(yàn)位應(yīng)為字符串“0X98765432”(不包括分號(hào))的第余數(shù)位的值(比如余數(shù)等于3,校驗(yàn)位應(yīng)為9)
//6. 出生年份的前兩位必須是19或20
number = [number stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
number = [self filterSpecialString:number];
//1??判斷位數(shù)
if (number.length != 15 && number.length != 18) {
return NO;
}
//2??將15位身份證轉(zhuǎn)為18位
NSMutableString *mString = [NSMutableString stringWithString:number];
if (number.length == 15) {
//出生日期加上年的開頭
[mString insertString:@"19" atIndex:6];
//最后一位加上校驗(yàn)碼
[mString insertString:[self getLastIdentifyNumberForIdentifyNumber:mString] atIndex:[mString length]];
number = mString;
}
//3??開始判斷
NSString *mmdd = @"(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))";
NSString *leapMmdd = @"0229";
NSString *year = @"(19|20)[0-9]{2}";
NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";
NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];
NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];
NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];
//區(qū)域
NSString *area = @"(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}";
NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];
NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if (![regexTest evaluateWithObject:number]) {
return NO;
}
//4??驗(yàn)證校驗(yàn)碼
return [[self getLastIdentifyNumberForIdentifyNumber:number] isEqualToString:[number substringWithRange:NSMakeRange(17, 1)]];
}
}
/**
* 從身份證里面獲取性別man 或者 woman 不正確的身份證返回nil
*
* @param number 身份證
*
* @return
*/
+ (NSString *)getGenderFromIdentityNumber:(NSString *)number
{
if ([self checkIdentityNumber:number]) {
number = [self filterSpecialString:number];
NSInteger i = [[number substringWithRange:NSMakeRange(number.length - 2, 1)] integerValue];
if (i % 2 == 1) {
return @"man";
} else {
return @"woman";
}
} else {
return nil;
}
}
/**
* 從身份證獲取生日,身份證格式不正確返回nil,正確返回:1990年01月01日
*
* @param number 身份證
*
* @return
*/
+ (NSString *)getBirthdayFromIdentityNumber:(NSString *)number
{
if ([self checkIdentityNumber:number]) {
number = [self filterSpecialString:number];
if (number.length == 18) {
return [NSString stringWithFormat:@"%@年%@月%@日",[number substringWithRange:NSMakeRange(6,4)], [number substringWithRange:NSMakeRange(10,2)], [number substringWithRange:NSMakeRange(12,2)]];
}
if (number.length == 15) {
return [NSString stringWithFormat:@"19%@年%@月%@日",[number substringWithRange:NSMakeRange(6,2)], [number substringWithRange:NSMakeRange(8,2)], [number substringWithRange:NSMakeRange(10,2)]];
};
return nil;
} else {
return nil;
}
}
+ (NSString *)getLastIdentifyNumberForIdentifyNumber:(NSString *)number {
//位數(shù)不小于17
if (number.length < 17) {
return nil;
}
//加權(quán)因子
int R[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//校驗(yàn)碼
unsigned char sChecker[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
long p =0;
for (int i =0; i<=16; i++){
NSString * s = [number substringWithRange:NSMakeRange(i, 1)];
p += [s intValue]*R[i];
}
//校驗(yàn)位
int o = p%11;
NSString *string_content = [NSString stringWithFormat:@"%c",sChecker[o]];
return string_content;
}
#pragma mark - JSON和字典、數(shù)組
/**
* JSON字符串轉(zhuǎn)字典或者數(shù)組
*
* @param string JSON字符串
*
* @return 返回字典或者數(shù)組
*/
id JSONTransformToDictionaryOrArray(NSString *string)
{
NSError *error;
id object = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding] options:(NSJSONReadingMutableContainers) error:&error];
if (error != nil) {
#ifdef DEBUG
NSLog(@"fail to get dictioanry or array from JSON: %@, error: %@", string, error);
#endif
}
return object;
}
/**
* 字典或者數(shù)組轉(zhuǎn)為JSON字符串
*
* @param object 字典或者數(shù)組
*
* @return 返回字符串
*/
NSString *dictionaryOrArrayTransformToString(id object)
{
if (![object isKindOfClass:[NSArray class]] && ![object isKindOfClass:[NSDictionary class]])
{
return nil;
}
NSError *error;
//options為0 則不會(huì)有換行符和空格 NSJSONWritingPrettyPrinted有空格和換行符方便閱讀
NSData *data = [NSJSONSerialization dataWithJSONObject:object options:(0) error:&error];
if (error != nil) {
#ifdef DEBUG
NSLog(@"fail to get JSON from object: %@, error: %@", object, error);
#endif
}
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
#pragma mark - 屏幕截圖的幾種方式
/**
* 屏幕截圖有狀態(tài)欄
*
* @param type 圖片保存位置
*
* @return
*/
+ (UIImage *)imageWithScreenshotWithCaptureType:(CaptureType)type
{
CGSize imageSize = [UIScreen mainScreen].bounds.size;
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);
for (UIWindow *window in [UIApplication sharedApplication].windows) {
if (window.screen == [UIScreen mainScreen]) {
[window drawViewHierarchyInRect:[UIScreen mainScreen].bounds afterScreenUpdates:NO];
}
}
UIView *statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
[statusBar drawViewHierarchyInRect:statusBar.bounds afterScreenUpdates:NO];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self saveImage:image WithCaptureType:type];
return image;
}
/**
* 屏幕截圖沒有狀態(tài)欄
*
* @param type 圖片保存位置
*
* @return
*/
+ (UIImage *)imageWithScreenshotNoStatusBarWithCaptureType:(CaptureType)type
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
for (UIWindow *window in [UIApplication sharedApplication].windows)
{
if (window.screen == [UIScreen mainScreen]) {
CGContextSaveGState(context);
CGContextTranslateCTM(context, window.center.x, window.center.y);
CGContextConcatCTM(context, window.transform);
CGContextTranslateCTM(context, -window.bounds.size.width *window.layer.anchorPoint.x, -window.bounds.size.height *window.layer.anchorPoint.y);
[window.layer renderInContext:context];
CGContextRestoreGState(context);
}
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self saveImage:image WithCaptureType:type];
return image;
}
/**
* 給一個(gè)view截圖
*
* @param type 圖片保存位置
*
* @return
*/
+ (UIImage *)imageForView:( UIView * _Nonnull )view withCaptureType:(CaptureType)type
{
CGSize size = view.bounds.size;
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self saveImage:image WithCaptureType:type];
return image;
}
/**
* 保存image到指定的位置
*
* @param image image
* @param type 類型
*/
+ (void)saveImage:(UIImage *)image WithCaptureType:(CaptureType)type
{
NSData *data = UIImagePNGRepresentation(image);
/**
* 時(shí)間戳
*/
NSString *time =[NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
switch (type) {
case CaptureTypeSandbox:
{
[data writeToFile:pathCachesWithFileName([NSString stringWithFormat:@"%@_mainScrren_status.png",time]) atomically:YES];
}
break;
case CaptureTypePhotes:
{
[data writeToFile:pathCachesWithFileName([NSString stringWithFormat:@"%@_mainScrren_status.png",time]) atomically:YES];
}
break;
case CaptureTypeBoth:
{
[data writeToFile:pathCachesWithFileName([NSString stringWithFormat:@"%@_mainScrren_status.png",time]) atomically:YES];
[data writeToFile:pathCachesWithFileName([NSString stringWithFormat:@"%@_mainScrren_status.png",time]) atomically:YES];
}
break;
default:
break;
}
}
// 指定回調(diào)方法
+ (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
NSString *msg = nil ;
#ifdef DEBUG
if(error != NULL)
{
msg = @"保存圖片失敗" ;
} else {
msg = @"保存圖片成功" ;
}
#endif
}
#pragma mark - 獲取當(dāng)前Controller
//獲取當(dāng)前屏幕顯示的viewcontroller
+ (UIViewController *)getCurrentVC
{
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
{
if (tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}
UIView *frontView = [[window subviews] objectAtIndex:0];
id nextResponder = [frontView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
else
result = window.rootViewController;
return result;
}
+ (UIViewController *)findViewController:(UIView *)sourceView
{
id target = sourceView;
while (target) {
target = ((UIResponder *)target).nextResponder;
if ([target isKindOfClass:[UIViewController class]]) {
break;
}
}
return target;
}