iOS 开发经验 - 转载
1、禁止手機睡眠?[UIApplication?sharedApplication].idleTimerDisabled = YES;2、隱藏某行cell?- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{// 如果是你需要隱藏的那一行,返回高度為0?if(indexPath.row == YouWantToHideRow)?return?0;?return?44;}// 然后再你需要隱藏cell的時候調用[self.tableView beginUpdates];[self.tableView endUpdates];?3、禁用button高亮button.adjustsImageWhenHighlighted =?NO;或者在創建的時候?UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];?4、tableview遇到這種報錯failed to obtain a cell from its dataSource
是因為你的cell被調用的早了。先循環使用了cell,后又創建cell。順序錯了
可能原因:1、xib的cell沒有注冊 2、內存中已經有這個cell的緩存了(也就是說通過你的cellId找到的cell并不是你想要的類型),這時候需要改下cell的標識
5、cocoa pods報這個錯誤:unable to access 'https://github.com/facebook/pop.git/': Operation timed out after 0 milliseconds with 0 out of 0 bytes received
解決辦法:原因可能是網絡問題,網絡請求超時了,只需要重試就行了
6、cocoa pods 出現ERROR: While executing gem ... (Errno::EPERM)
解決辦法:
https://segmentfault.com/q/1010000002926243
7、動畫切換window的根控制器?// options是動畫選項[UIView transitionWithView:[UIApplication sharedApplication].keyWindow duration:0.5f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{?BOOL oldState = [UIView areAnimationsEnabled]; [UIView setAnimationsEnabled:NO]; [UIApplication sharedApplication].keyWindow.rootViewController = [RootViewController new]; [UIView setAnimationsEnabled:oldState]; } completion:^(BOOL finished) { }];?8、去除數組中重復的對象?NSArray *newArr = [oldArr?valueForKeyPath:@“@distinctUnionOfObjects.self"];?9、編譯的時候遇到?no such file or directory: /users/apple/XXX
是因為編譯的時候,在此路徑下找不到這個文件,解決這個問題,首先是是要檢查缺少的文件是不是在工程中,如果不在工程中,需要從本地拖進去,如果發現已經存在工程中了,或者拖進去還是報錯,這時候需要去build phases中搜索這個文件,這時候很可能會搜出現兩個相同的文件,這時候,有一個路徑是正確的,刪除另外一個即可。如果刪除了還是不行,需要把兩個都刪掉,然后重新往工程里拖進這個文件即可
?
build phases?10、iOS8系統中,tableView最好實現下-tableView: heightForRowAtIndexPath:這個代理方法,要不然在iOS8中可能就會出現顯示不全或者無法響應事件的問題?11、iOS8中實現側滑功能的時候這個方法必須實現,要不然在iOS8中無法側滑?// 必須寫的方法,和editActionsForRowAtIndexPath配對使用,里面什么不寫也行- (void)tableView:(UITableView *)tableView?commitEditingStyle:(UITableViewCellEditingStyle)editingStyle?forRowAtIndexPath:(NSIndexPath *)indexPath {}?12、三個通知
NSSystemTimeZoneDidChangeNotification監聽修改時間界面的兩個按鈕狀態變化
UIApplicationSignificantTimeChangeNotification 監聽用戶改變時間 (只要點擊自動設置按鈕就會調用) NSSystemClockDidChangeNotification 監聽用戶修改時間(時間不同才會調用)
13、SDWebImage本地緩存有時候會害人。如果之前緩存過一張圖片,即使下次服務器換了這張圖片,但是圖片url沒換,用sdwebimage下載下來的還是以前那張,所以遇到這種問題,不要先去懟服務器,清空下緩存再試就好了。?14、上線前注意:
1)、刪掉代碼中所有的測試代碼
2)、如果后臺有審核模式,提醒后臺開啟此模式
3)、主流程再跑一跑
4)、全局搜索waring,檢查所有標記waring的地方
15、跳進app權限設置?// 跳進app設置?if (UIApplicationOpenSettingsURLString != NULL) { UIApplication *application = [UIApplication sharedApplication]; NSURL *URL = [NSURL?URLWithString:UIApplicationOpenSettingsURLString];if ([application?respondsToSelector:@selector(openURL:options:completionHandler:)]) { [application?openURL:URL?options:@{}?completionHandler:nil]; }?else { [application?openURL:URL]; } }?16、給一個view截圖UIGraphicsBeginImageContextWithOptions(view.bounds.size,?YES,?0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()];?UIImage *img =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?17、開發中如果要動態修改tableView的tableHeaderView或者tableFooterView的高度,需要給tableView重新設置,而不是直接更改高度。正確的做法是重新設置一下tableView.tableFooterView = 更改過高度的view。為什么?其實在iOS8以上直接改高度是沒有問題的,在iOS8中出現了contentSize不準確的問題,這是解決辦法。?18、注意對象為nil的時候,調用此對象分類的方法不會執行?19、collectionView的內容小于其寬高的時候是不能滾動的,設置可以滾動:?collectionView.alwaysBounceHorizontal?=?YES;collectionView.alwaysBounceVertical?=?YES;?20、設置navigationBar上的title顏色和大小?[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor youColor], NSFontAttributeName : [UIFont systemFontOfSize:15]}]?21、顏色轉圖片?+ (UIImage *)cl_imageWithColor:(UIColor *)color {?CGRect rect =?CGRectMake(0.0f,?0.0f,?1.0f,?1.0f);?UIGraphicsBeginImageContext(rect.size);CGContextRef context =?UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [color?CGColor]);CGContextFillRect(context, rect);?UIImage *image =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?return image;}?22、view設置圓角?#define ViewBorderRadius(View, Radius, Width, Color)//[View.layer setCornerRadius:(Radius)];/[View.layer setMasksToBounds:YES];/[View.layer setBorderWidth:(Width)];/[View.layer setBorderColor:[Color CGColor]] // view圓角?23、強/弱引用?#define WeakSelf(type)?__weak typeof(type)?weak##type =?type;?// weak#define StrongSelf(type)?__strong typeof(type)?type =?weak##type;?// strong?24、由角度轉換弧度?#define?DegreesToRadian(x) (M_PI * (x) /?180.0)25、由弧度轉換角度?#define RadianToDegrees(radian) (radian*180.0)/(M_PI)26、獲取圖片資源?#define GetImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@",imageName]]?27、獲取temp?#define PathTemp NSTemporaryDirectory()?28、獲取沙盒 Document?#define PathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]?29、獲取沙盒 Cache?#define PathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]?30、GCD代碼只執行一次?#define?kDISPATCH_ONCE_BLOCK(onceBlock)?static?dispatch_once_t?onceToken;?dispatch_once(&;onceToken, onceBlock);?31、自定義NSLog?#ifdef DEBUG#define NSLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__,?##__VA_ARGS__)#else#define NSLog(...)#endif?32、Font?#define?FontL(s)?[UIFont systemFontOfSize:s weight:UIFontWeightLight]#define?FontR(s)?[UIFont systemFontOfSize:s weight:UIFontWeightRegular]#define?FontB(s)?[UIFont systemFontOfSize:s weight:UIFontWeightBold]#define?FontT(s)?[UIFont systemFontOfSize:s weight:UIFontWeightThin]#define?Font(s)?FontL(s)?33、FORMAT?#define FORMAT(f, ...) [NSString stringWithFormat:f, ## __VA_ARGS__]?34、在主線程上運行?#define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);?35、開啟異步線程?#define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,?0), globalQueueBlocl);?36、通知?#define?NOTIF_ADD(n, f)[[NSNotificationCenter defaultCenter]?addObserver:self?selector:@selector(f)?name:n?object:nil]#define?NOTIF_POST(n, o)?[[NSNotificationCenter defaultCenter]?postNotificationName:n?object:o]#define?NOTIF_REMV()[[NSNotificationCenter defaultCenter]?removeObserver:self]?37、隨機顏色?+ (UIColor *)RandomColor {?NSInteger aRedValue = arc4random() %?255;NSInteger aGreenValue = arc4random() %?255;?NSInteger aBlueValue = arc4random() %?255;?UIColor *randColor = [UIColor colorWithRed:aRedValue /?255.0f green:aGreenValue /?255.0f blue:aBlueValue /?255.0f alpha:1.0f];return randColor;}?38、獲取window?+(UIWindow*)getWindow {?UIWindow* win =?nil;?//[UIApplication sharedApplication].keyWindow;?for (id item?in [UIApplication sharedApplication].windows) {?if ([item?class] == [UIWindow?class]) {?if (!((UIWindow*)item).hidden) { win = item;?break; } } }?return win;}39、修改textField的placeholder的字體顏色、大小?[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];[textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];40、統一收起鍵盤?[[[UIApplication sharedApplication] keyWindow] endEditing:YES];?41、控制屏幕旋轉,在控制器中寫?/** 是否支持自動轉屏 */- (BOOL)shouldAutorotate {?return?YES;}/** 支持哪些屏幕方向 */- (UIInterfaceOrientationMask)supportedInterfaceOrientations {?return?UIInterfaceOrientationMaskLandscapeLeft |?UIInterfaceOrientationMaskLandscapeRight;}/** 默認的屏幕方向(當前ViewController必須是通過模態出來的UIViewController(模態帶導航的無效)方式展現出來的,才會調用這個方法) */- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {?return?UIInterfaceOrientationLandscapeLeft |?UIInterfaceOrientationLandscapeRight;}42、獲取app緩存大小?- (CGFloat)getCachSize {?NSUInteger imageCacheSize = [[SDImageCache sharedImageCache] getSize];?//獲取自定義緩存大小?//用枚舉器遍歷 一個文件夾的內容?//1.獲取 文件夾枚舉器?NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:myCachePath]; __block?NSUInteger count =?0;?//2.遍歷?for (NSString *fileName?in enumerator) {?NSString *path = [myCachePath stringByAppendingPathComponent:fileName];?NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil]; count += fileDict.fileSize;//自定義所有緩存大小 }?// 得到是字節 轉化為MCGFloat totalSize = ((CGFloat)imageCacheSize+count)/1024/1024;?return totalSize;}?43、清理app緩存?- (void)handleClearView {?//刪除兩部分?//1.刪除 sd 圖片緩存?//先清除內存中的圖片緩存 [[SDImageCache sharedImageCache] clearMemory];?//清除磁盤的緩存 [[SDImageCache sharedImageCache] clearDisk];?//2.刪除自己緩存?NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"]; [[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];}?44、模型轉字典static?NSSet *classes;- (NSMutableDictionary *)getParameterDictionary {NSMutableDictionary *dict = [NSMutableDictionary dictionary]; Class c =?self.class;?while (c) {?unsigned count; objc_property_t *properties = class_copyPropertyList([c?class], &;count);?for (int i =?0; i < count; i++) {NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])]; dict[key] = [self valueForKey:key]; } free(properties);?// 獲得父類 c = class_getSuperclass(c);?if ([self isClassFromFoundation:c])?break; }?return dict;}- (BOOL)isClassFromFoundation:(Class)c{?if (c == [NSObject?class] || c == [NSManagedObject?class])?return?YES; __block?BOOL result =?NO; [[self foundationClasses] enumerateObjectsUsingBlock:^(Class foundationClass,?BOOL *stop) {?if ([c isSubclassOfClass:foundationClass]) { result =?YES; *stop =?YES; } }];?return result;}- (NSSet *)foundationClasses{?if (classes ==?nil) {?// 集合中沒有NSObject,因為幾乎所有的類都是繼承自NSObject,具體是不是NSObject需要特殊判斷 classes = [NSSet setWithObjects: [NSURL?class], [NSDate?class], [NSValue?class], [NSData?class], [NSError?class], [NSArray?class], [NSDictionary?class], [NSString?class], [NSAttributedString?class],?nil]; }return classes;}?45、交換兩個方法實現?Class aClass = [self?class]; SEL originalSelector = @selector(viewWillAppear:); SEL swizzledSelector = @selector(xxx_viewWillAppear:);?Method?originalMethod =?class_getInstanceMethod(aClass, originalSelector);?Method?swizzledMethod =?class_getInstanceMethod(aClass, swizzledSelector); BOOL didAddMethod = class_addMethod(aClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));?if (didAddMethod)?{ class_replaceMethod(aClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); }?else?{ method_exchangeImplementations(originalMethod, swizzledMethod); }?46、打印百分號和引號?NSLog(@"%%");?NSLog(@"/"");?47、幾個常用權限判斷?if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {?NSLog(@"沒有定位權限"); }?AVAuthorizationStatus statusVideo = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];?if (statusVideo ==?AVAuthorizationStatusDenied) {?NSLog(@"沒有攝像頭權限"); }//是否有麥克風權限?AVAuthorizationStatus statusAudio = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];?if (statusAudio ==?AVAuthorizationStatusDenied) {?NSLog(@"沒有錄音權限"); } [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {?if (status == PHAuthorizationStatusDenied) {?NSLog(@"沒有相冊權限"); } }];?48、獲取手機型號?+ (NSString *)getDeviceInfo { struct utsname systemInfo; uname(&;systemInfo); NSString *platform = [NSString?stringWithCString:systemInfo.machine?encoding:NSASCIIStringEncoding];?if ([platform?isEqualToString:@"iPhone1,1"])?return @"iPhone 2G";?if ([platform?isEqualToString:@"iPhone1,2"])?return @"iPhone 3G";?if ([platform?isEqualToString:@"iPhone2,1"])?return @"iPhone 3GS";?if ([platform?isEqualToString:@"iPhone3,1"])?return @"iPhone 4";?if ([platform?isEqualToString:@"iPhone3,2"])?return @"iPhone 4";?if ([platform?isEqualToString:@"iPhone3,3"])?return @"iPhone 4";?if ([platform?isEqualToString:@"iPhone4,1"])?return @"iPhone 4S";?if ([platform?isEqualToString:@"iPhone5,1"])?return @"iPhone 5";?if ([platform?isEqualToString:@"iPhone5,2"])?return @"iPhone 5";?if ([platform?isEqualToString:@"iPhone5,3"])?return @"iPhone 5c";?if ([platform?isEqualToString:@"iPhone5,4"])?return @"iPhone 5c";?if ([platform?isEqualToString:@"iPhone6,1"])?return @"iPhone 5s";?if ([platform?isEqualToString:@"iPhone6,2"])?return @"iPhone 5s";?if ([platform?isEqualToString:@"iPhone7,1"])?return @"iPhone 6 Plus";?if ([platform?isEqualToString:@"iPhone7,2"])?return @"iPhone 6";?if ([platform?isEqualToString:@"iPhone8,1"])?return @"iPhone 6s";?if ([platform?isEqualToString:@"iPhone8,2"])?return @"iPhone 6s Plus";?// 日行兩款手機型號均為日本獨占,可能使用索尼FeliCa支付方案而不是蘋果支付?if ([platform?isEqualToString:@"iPhone9,1"])?return @"國行、日版、港行iPhone 7";?if ([platform?isEqualToString:@"iPhone9,2"])?return @"港行、國行iPhone 7 Plus";if ([platform?isEqualToString:@"iPhone9,3"])?return @"美版、臺版iPhone 7";?if ([platform?isEqualToString:@"iPhone9,4"])?return @"美版、臺版iPhone 7 Plus";if ([platform?isEqualToString:@"iPhone8,4"])?return @"iPhone SE";?if ([platform?isEqualToString:@"iPod1,1"])?return @"iPod Touch 1G";?if ([platform?isEqualToString:@"iPod2,1"])?return @"iPod Touch 2G";?if ([platform?isEqualToString:@"iPod3,1"])?return @"iPod Touch 3G";?if ([platform?isEqualToString:@"iPod4,1"])?return @"iPod Touch 4G";?if ([platform?isEqualToString:@"iPod5,1"])?return @"iPod Touch 5G";?if ([platform?isEqualToString:@"iPad1,1"])?return @"iPad 1G";?if ([platform?isEqualToString:@"iPad2,1"])?return @"iPad 2";?if ([platform?isEqualToString:@"iPad2,2"])?return @"iPad 2";?if ([platform?isEqualToString:@"iPad2,3"])?return @"iPad 2";?if ([platform?isEqualToString:@"iPad2,4"])?return @"iPad 2";?if ([platform?isEqualToString:@"iPad2,5"])?return @"iPad Mini 1G";?if ([platform?isEqualToString:@"iPad2,6"])?return @"iPad Mini 1G";?if ([platform?isEqualToString:@"iPad2,7"])?return @"iPad Mini 1G";?if ([platform?isEqualToString:@"iPad3,1"])?return @"iPad 3";?if ([platform?isEqualToString:@"iPad3,2"])?return @"iPad 3";?if ([platform?isEqualToString:@"iPad3,3"])?return @"iPad 3";?if ([platform?isEqualToString:@"iPad3,4"])?return @"iPad 4";?if ([platform?isEqualToString:@"iPad3,5"])?return @"iPad 4";?if ([platform?isEqualToString:@"iPad3,6"])?return @"iPad 4";?if ([platform?isEqualToString:@"iPad4,1"])?return @"iPad Air";?if ([platform?isEqualToString:@"iPad4,2"])?return @"iPad Air";?if ([platform?isEqualToString:@"iPad4,3"])?return @"iPad Air";?if ([platform?isEqualToString:@"iPad4,4"])?return @"iPad Mini 2G";?if ([platform?isEqualToString:@"iPad4,5"])?return @"iPad Mini 2G";?if ([platform?isEqualToString:@"iPad4,6"])?return @"iPad Mini 2G";?if ([platform?isEqualToString:@"i386"])?return @"iPhone Simulator";?if ([platform?isEqualToString:@"x86_64"])?return @"iPhone Simulator";?return platform;}49、長按復制功能?- (void)viewDidLoad{ [self.view addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pasteBoard:)]];}- (void)pasteBoard:(UILongPressGestureRecognizer *)longPress {?if (longPress.state ==?UIGestureRecognizerStateBegan) {?UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string =?@"需要復制的文本"; }}50、cocoapods升級
在終端執行 sudo gem install -n / usr / local / bin cocoapods --pre
51、設置啟動頁后,依然顯示之前的
刪除app,手機重啟,重新安裝
52、判斷圖片類型?//通過圖片Data數據第一個字節 來獲取圖片擴展名- (NSString *)contentTypeForImageData:(NSData *)data{ uint8_t c; [data getBytes:&;c length:1];?switch (c) {?case?0xFF:?return?@"jpeg";?case?0x89:return?@"png";?case?0x47:?return?@"gif";?case?0x49:?case?0x4D:?return?@"tiff";?case?0x52:?if ([data length] <?12) {?return?nil; }?NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0,?12)] encoding:NSASCIIStringEncoding];?if ([testString hasPrefix:@"RIFF"] &;&; [testString hasSuffix:@"WEBP"]) {?return?@"webp"; }?return?nil; }?return?nil;}53、獲取手機和app信息?NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];?CFShow(infoDictionary);?// app名稱?NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];?// app版本?NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];?// app build版本?NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];?//手機序列號?NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];NSLog(@"手機序列號: %@",identifierNumber);?//手機別名: 用戶定義的名稱NSString* userPhoneName = [[UIDevice currentDevice] name];?NSLog(@"手機別名: %@", userPhoneName);?//設備名稱?NSString* deviceName = [[UIDevice currentDevice] systemName];?NSLog(@"設備名稱: %@",deviceName );?//手機系統版本?NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];NSLog(@"手機系統版本: %@", phoneVersion);?//手機型號?NSString* phoneModel = [[UIDevice currentDevice] model];?NSLog(@"手機型號: %@",phoneModel );?//地方型號 (國際化區域名稱)?NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];?NSLog(@"國際化區域名稱: %@",localPhoneModel );?NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];?// 當前應用名稱?NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"];?NSLog(@"當前應用名稱:%@",appCurName);?// 當前應用軟件版本 比如:1.0.1?NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];?NSLog(@"當前應用軟件版本:%@",appCurVersion);?// 當前應用版本號碼 int類型?NSString *appCurVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"];NSLog(@"當前應用版本號碼:%@",appCurVersionNum);?54、獲取一個類的所有屬性?id LenderClass = objc_getClass("Lender");unsigned?int outCount, i;objc_property_t *properties = class_copyPropertyList(LenderClass, &;outCount);for (i =?0; i < outCount; i++) { objc_property_t?property?= properties[i]; fprintf(stdout,?"%s %s/n", property_getName(property), property_getAttributes(property));}?55、image圓角?- (UIImage *)circleImage{// NO代表透明?UIGraphicsBeginImageContextWithOptions(self.size,?NO,?1);?// 獲得上下文?CGContextRef ctx =?UIGraphicsGetCurrentContext();?// 添加一個圓?CGRect rect =?CGRectMake(0,?0,?self.size.width,?self.size.height);?// 方形變圓形?CGContextAddEllipseInRect(ctx, rect);?// 裁剪?CGContextClip(ctx);?// 將圖片畫上去 [self drawInRect:rect];?UIImage *image =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?return image;}?56、image拉伸?+ (UIImage *)resizableImage:(NSString *)imageName{ UIImage *image = [UIImage imageNamed:imageName]; CGFloat imageW =?image.size.width; CGFloat imageH =?image.size.height;?return [image resizableImageWithCapInsets:UIEdgeInsetsMake(imageH *?0.5, imageW *?0.5, imageH *?0.5, imageW *?0.5) resizingMode:UIImageResizingModeStretch];}57、JSON字符串轉字典?+ (NSDictionary *)parseJSONStringToNSDictionary:(NSString *)JSONString {?NSData *JSONData = [JSONString dataUsingEncoding:NSUTF8StringEncoding];?NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableLeaves error:nil];?return responseJSON;}?58、身份證號驗證?- (BOOL)validateIdentityCard {?BOOL flag;?if (self.length <=?0) { flag =?NO;?return flag; }?NSString *regex2 =?@"^(//d{14}|//d{17})(//d|[xX])$";NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];?return [identityCardPredicate evaluateWithObject:self];}?59、獲取設備mac地址?+ (NSString *)macAddress {?int mib[6];?size_t len;?char *buf;?unsigned?char *ptr;struct?if_msghdr *ifm;?struct?sockaddr_dl *sdl; mib[0] = CTL_NET; mib[1] = AF_ROUTE; mib[2] =?0; mib[3] = AF_LINK; mib[4] = NET_RT_IFLIST;?if((mib[5] = if_nametoindex("en0")) ==?0) {?printf("Error: if_nametoindex error/n");?return?NULL; }?if(sysctl(mib,?6,?NULL, &;len,?NULL,?0) <?0) {?printf("Error: sysctl, take 1/n");?return?NULL; }?if((buf =?malloc(len)) ==?NULL) {?printf("Could not allocate memory. Rrror!/n");?return?NULL; }?if(sysctl(mib,?6, buf, &;len,?NULL,?0) <?0) {?printf("Error: sysctl, take 2");?return?NULL; } ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm +?1); ptr = (unsigned?char *)LLADDR(sdl); NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];?free(buf);?return outstring;}?60、導入自定義字體庫
1、找到你想用的字體的 ttf 格式,拖入工程
2、在工程的plist中增加一行數組,“Fonts provided by application”
3、為這個key添加一個item,value為你剛才導入的ttf文件名
4、直接使用即可:label.font = [UIFont fontWithName:@"你剛才導入的ttf文件名" size:20.0];
61、拿到當前正在顯示的控制器,不管是push進去的,還是present進去的都能拿到?- (UIViewController *)getVisibleViewControllerFrom:(UIViewController*)vc {?if ([vc isKindOfClass:[UINavigationController?class]]) {?return [self getVisibleViewControllerFrom:[((UINavigationController*) vc) visibleViewController]]; }else?if ([vc isKindOfClass:[UITabBarController?class]]){?return [self getVisibleViewControllerFrom:[((UITabBarController*) vc) selectedViewController]]; }?else {?if (vc.presentedViewController) {?return [self getVisibleViewControllerFrom:vc.presentedViewController]; }?else {?return vc; } }}?62、runtime為一個類動態添加屬性?// 動態添加屬性的本質是: 讓對象的某個屬性與值產生關聯 objc_setAssociatedObject(self, WZBPlaceholderViewKey, placeholderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);?63、獲取runtime為一個類動態添加的屬性?objc_getAssociatedObject(self, WZBPlaceholderViewKey);?64、KVO監聽某個對象的屬性?// 添加監聽者[self?addObserver:self?forKeyPath:property?options:NSKeyValueObservingOptionNew?context:nil];// 當監聽的屬性值變化的時候會來到這個方法- (void)observeValueForKeyPath:(NSString *)keyPath?ofObject:(id)object?change:(NSDictionary *)change?context:(void *)context {?if ([keyPath?isEqualToString:@"property"]) { [self textViewTextChange]; }?else { }}?65、Reachability判斷網絡狀態?NetworkStatus?status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];?if (status == NotReachable) { NSLog(@"當前設備無網絡"); }?if (status == ReachableViaWiFi) { NSLog(@"當前wifi網絡"); }?if (status == ReachableViaWWAN) { NSLog(@"當前蜂窩移動網絡"); }?66、AFNetworking監聽網絡狀態?// 監聽網絡狀況 AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager]; [mgr?setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {switch (status) {?case?AFNetworkReachabilityStatusUnknown:?break;?case?AFNetworkReachabilityStatusNotReachable: { [SVProgressHUD?showInfoWithStatus:@"當前設備無網絡"]; }?break;?case?AFNetworkReachabilityStatusReachableViaWiFi: [SVProgressHUD?showInfoWithStatus:@"當前Wi-Fi網絡"];?break;?case?AFNetworkReachabilityStatusReachableViaWWAN: [SVProgressHUD?showInfoWithStatus:@"當前蜂窩移動網絡"];?break;?default:?break; } }]; [mgr startMonitoring];?67、透明顏色不影響子視圖透明度?[UIColor colorWithRed:<#(CGFloat)#> green:<#(CGFloat)#> blue:<#(CGFloat)#> alpha:<#(CGFloat)#>];68、取圖片某一點的顏色?if (point.x <?0 || point.y <?0)?return?nil;?CGImageRef imageRef =?self.CGImage;?NSUInteger width =?CGImageGetWidth(imageRef);NSUInteger height =?CGImageGetHeight(imageRef);?if (point.x >= width || point.y >= height)?return?nil;?unsigned?char *rawData = malloc(height * width *?4);?if (!rawData)?return?nil;?CGColorSpaceRef colorSpace =?CGColorSpaceCreateDeviceRGB();?NSUInteger bytesPerPixel =?4;?NSUInteger bytesPerRow = bytesPerPixel * width;?NSUInteger bitsPerComponent =?8;CGContextRef context =?CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);?if (!context) { free(rawData);?return?nil; }?CGColorSpaceRelease(colorSpace);CGContextDrawImage(context,?CGRectMake(0,?0, width, height), imageRef);CGContextRelease(context);?int byteIndex = (bytesPerRow * point.y) + point.x * bytesPerPixel;?CGFloat red = (rawData[byteIndex] *?1.0) /?255.0;?CGFloat green = (rawData[byteIndex +?1] *?1.0) /?255.0;?CGFloat blue = (rawData[byteIndex +?2] *?1.0) /?255.0;?CGFloat alpha = (rawData[byteIndex +?3] *?1.0) /?255.0;?UIColor *result =?nil; result = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; free(rawData);?return result;?69、判斷該圖片是否有透明度通道?- (BOOL)hasAlphaChannel{ CGImageAlphaInfo?alpha = CGImageGetAlphaInfo(self.CGImage);?return (alpha == kCGImageAlphaFirst ||alpha == kCGImageAlphaLast ||?alpha == kCGImageAlphaPremultipliedFirst ||alpha == kCGImageAlphaPremultipliedLast);}?70、獲得灰度圖?+ (UIImage*)covertToGrayImageFromImage:(UIImage*)sourceImage{?int width = sourceImage.size.width;?int height = sourceImage.size.height;CGColorSpaceRef colorSpace =?CGColorSpaceCreateDeviceGray();CGContextRef context =?CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone);CGColorSpaceRelease(colorSpace);?if (context ==?NULL) {?return?nil; }CGContextDrawImage(context,CGRectMake(0,?0, width, height), sourceImage.CGImage);?CGImageRef contextRef =?CGBitmapContextCreateImage(context);?UIImage *grayImage = [UIImage imageWithCGImage:contextRef];?CGContextRelease(context);CGImageRelease(contextRef);?return grayImage;}?71、根據bundle中的文件名讀取圖片?+ (UIImage *)imageWithFileName:(NSString *)name { NSString *extension = @"png"; NSArray *components = [name componentsSeparatedByString:@"."];?if ([components count] >=?2) { NSUInteger lastIndex = components.count -?1; extension = [components objectAtIndex:lastIndex];?name = [name substringToIndex:(name.length-(extension.length+1))]; }?// 如果為Retina屏幕且存在對應圖片,則返回Retina圖片,否則查找普通圖片?if ([UIScreen mainScreen].scale ==?2.0) {?name = [name stringByAppendingString:@"@2x"]; NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:extension];?if (path !=?nil) { return [UIImage imageWithContentsOfFile:path]; } }?if ([UIScreen mainScreen].scale ==?3.0) {name = [name stringByAppendingString:@"@3x"]; NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:extension];?if (path !=?nil) { return [UIImage imageWithContentsOfFile:path]; } } NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:extension];?if (path) { return [UIImage imageWithContentsOfFile:path]; } return?nil;}?72、合并兩個圖片?+ (UIImage*)mergeImage:(UIImage*)firstImage withImage:(UIImage*)secondImage {?CGImageRef firstImageRef = firstImage.CGImage;CGFloat firstWidth =?CGImageGetWidth(firstImageRef);?CGFloat firstHeight =?CGImageGetHeight(firstImageRef);?CGImageRef secondImageRef = secondImage.CGImage;?CGFloat secondWidth =?CGImageGetWidth(secondImageRef);?CGFloat secondHeight =?CGImageGetHeight(secondImageRef);?CGSize mergedSize =?CGSizeMake(MAX(firstWidth, secondWidth), MAX(firstHeight, secondHeight));UIGraphicsBeginImageContext(mergedSize); [firstImage drawInRect:CGRectMake(0,?0, firstWidth, firstHeight)]; [secondImage drawInRect:CGRectMake(0,?0, secondWidth, secondHeight)];?UIImage *image =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?return image;}?73、根據bundle中的圖片名創建imageview?+ (id)imageViewWithImageNamed:(NSString*)imageName{?return?[[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];}74、為imageView添加倒影?CGRect frame =?self.frame; frame.origin.y += (frame.size.height +?1);?UIImageView *reflectionImageView = [[UIImageView alloc] initWithFrame:frame];?self.clipsToBounds =?TRUE; reflectionImageView.contentMode =?self.contentMode; [reflectionImageView setImage:self.image]; reflectionImageView.transform =?CGAffineTransformMakeScale(1.0,?-1.0);?CALayer *reflectionLayer = [reflectionImageView layer];?CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.bounds = reflectionLayer.bounds; gradientLayer.position =?CGPointMake(reflectionLayer.bounds.size.width /?2, reflectionLayer.bounds.size.height *?0.5); gradientLayer.colors = [NSArray arrayWithObjects: (id)[[UIColor clearColor]?CGColor], (id)[[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.3]?CGColor],?nil]; gradientLayer.startPoint =?CGPointMake(0.5,0.5); gradientLayer.endPoint =?CGPointMake(0.5,1.0); reflectionLayer.mask = gradientLayer; [self.superview addSubview:reflectionImageView];?75、畫水印?// 畫水印- (void) setImage:(UIImage *)image withWaterMark:(UIImage *)mark inRect:(CGRect)rect{?if ([[[UIDevice currentDevice] systemVersion] floatValue] >=?4.0) {UIGraphicsBeginImageContextWithOptions(self.frame.size,?NO,?0.0); }?//原圖 [image drawInRect:self.bounds];?//水印圖 [mark drawInRect:rect];?UIImage *newPic =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?self.image = newPic;}?76、讓label的文字內容顯示在左上/右上/左下/右下/中心頂/中心底部?自定義UILabel// 重寫label的textRectForBounds方法- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines { CGRect?rect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];?switch (self.textAlignmentType) {?case WZBTextAlignmentTypeLeftTop: {?rect.origin = bounds.origin; }?break;?case WZBTextAlignmentTypeRightTop: {?rect.origin = CGPointMake(CGRectGetMaxX(bounds) -?rect.size.width, bounds.origin.y); }?break;?case WZBTextAlignmentTypeLeftBottom: {?rect.origin = CGPointMake(bounds.origin.x, CGRectGetMaxY(bounds) -?rect.size.height); }break;?case WZBTextAlignmentTypeRightBottom: {?rect.origin = CGPointMake(CGRectGetMaxX(bounds) -?rect.size.width, CGRectGetMaxY(bounds) -?rect.size.height); }?break;?case WZBTextAlignmentTypeTopCenter: {?rect.origin = CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(rect)) /?2, CGRectGetMaxY(bounds) -?rect.origin.y); }?break;?case WZBTextAlignmentTypeBottomCenter: {?rect.origin = CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(rect)) /?2, CGRectGetMaxY(bounds) - CGRectGetMaxY(bounds) -?rect.size.height); }break;?case WZBTextAlignmentTypeLeft: {?rect.origin = CGPointMake(0,?rect.origin.y); }?break;?case WZBTextAlignmentTypeRight: {?rect.origin = CGPointMake(rect.origin.x,?0); }?break;?case WZBTextAlignmentTypeCenter: {rect.origin = CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(rect)) /?2, (CGRectGetHeight(bounds) - CGRectGetHeight(rect)) /?2); }?break;?default:?break; }?return?rect;}- (void)drawTextInRect:(CGRect)rect { CGRect textRect = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines]; [super drawTextInRect:textRect];}?77、scrollView上的輸入框,鍵盤擋住的問題?推薦用IQKeyboardManager這個框架!手動解決如下1、監聽鍵盤彈出/消失的通知2、在通知中加入代碼:NSDictionary* info = [aNotification userInfo];CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey]?CGRectValue] fromView:self.view];CGSize kbSize =keyPadFrame.size;CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview];CGRect aRect =?self.view.bounds;aRect.size.height -= (kbSize.height);CGPoint origin = activeRect.origin;origin.y -= backScrollView.contentOffset.y;if (!CGRectContainsPoint(aRect, origin)) {?CGPoint scrollPoint =?CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height)); [backScrollView setContentOffset:scrollPoint animated:YES];}?78、frame布局的cell動態高度
這種通常在你的模型中添加一個輔助屬性cellHeight,在模型中重寫這個屬性的get方法,根據你的布局和模型中的其他屬性值計算出總高度。最后在tableView:heightForRow方法中,根據indexPath找出對應的模型,返回這個高度即可。
79、AutoLayout布局的cell動態高度?// 1、設置tableView的屬性self.tableView.rowHeight =?UITableViewAutomaticDimension;self.tableView.estimatedRowHeight =?44.0;?// 這個屬性非0,估計cell高度?//?2、至上而下設置cell的約束,注意,上下左右最好都要頂到cell的四周??
cell?80、使用performSelector:調用函數,內存泄漏問題
當我們在開發中使用[obj performSelector:NSSelectorFromString(@"aMethod")];這類方法時可能會收到一個警告"performSelector may cause a leak because its selector is unknown".
是因為編譯器不清楚這個對象能不能相應這個方法,如果不能,則是不安全的,而且編譯器也不清楚該怎么處理這個方法的返回值!
使用以下代碼調用即可:if (! obj) {?return; }SEL selector = NSSelectorFromString(@"aMethod");IMP imp = [obj methodForSelector:selector];void (*func)(id, SEL) =?(void *)imp;func(obj, selector);或者:SEL selector = NSSelectorFromString(@"aMethod");((void (*)(id, SEL))[obj methodForSelector:selector])(obj, selector);?81、一個字符串是否包含另一個字符串?// 方法1if ([str1 containsString:str2]) {?NSLog(@"str1包含str2"); }?else {?NSLog(@"str1不包含str2"); }// 方法2if ([str1 rangeOfString: str2].location ==?NSNotFound) {?NSLog(@"str1不包含str2"); }?else {NSLog(@"str1包含str2"); }?82、cell去除選中效果?cell.selectionStyle = UITableViewCellSelectionStyleNone;?83、cell點按效果?- (void)tableView:(UITableView *)tableView?didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView?deselectRowAtIndexPath:indexPath?animated:YES];}?84、當刪除一個從xib拖出來的屬性時,一定記得把xib中對應的線也刪掉,不然會報類似[<ViewController 0x7fea6ed05980> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key的crash??
點擊這個叉號刪除?85、真機測試的時候報錯:Could not launch "你的 App",process launch failed: Security
因為你的app沒有上線,iOS9開始,需要手動信任Xcode生成的描述文件,打開手機設置->通用->描述文件->點擊你的app的描述文件->點擊信任
86、真機測試的時候報錯:Could not find Developer Disk Image
這是因為你的設備系統版本大于Xcode能兼容的系統版本,比如你的設備是iOS10.3,而Xcode版本是8.2(Xcode8.2最大兼容iOS10.2),就會報這個錯誤。解決辦法就是升級Xcode!
87、UITextView沒有placeholder的問題?
網上有很多此類自定義控件,也可以參考下我寫的一個UITextView分類?UITextView-WZB
88、移除字符串中的空格和換行?+ (NSString *)removeSpaceAndNewline:(NSString *)str { NSString *temp = [str?stringByReplacingOccurrencesOfString:@" "?withString:@""]; temp = [temp?stringByReplacingOccurrencesOfString:@"/r"?withString:@""]; temp = [temp?stringByReplacingOccurrencesOfString:@"/n"?withString:@""];?return temp;}89、判斷字符串中是否有空格?+ (BOOL)isBlank:(NSString *)str {?NSRange _range = [str rangeOfString:@" "];?if (_range.location !=?NSNotFound) {?//有空格?return?YES; }?else {?//沒有空格?return?NO; }}?90、獲取一個視頻的第一幀圖片NSURL *url = [NSURL URLWithString:filepath];?AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:url options:nil];?AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1]; generate1.appliesPreferredTrackTransform =?YES;?NSError *err =?NULL;CMTime time =?CMTimeMake(1,?2);?CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&;err];?UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];?return one;?91、獲取視頻的時長?+ (NSInteger)getVideoTimeByUrlString:(NSString *)urlString {?NSURL *videoUrl = [NSURL URLWithString:urlString];?AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoUrl];?CMTime time = [avUrl duration];?int seconds = ceil(time.value/time.timescale);?return seconds;}?92、字符串是否為空?+ (BOOL)isEqualToNil:(NSString *)str {?return?str.length <=?0 || [str isEqualToString:@""] || !str;}?93、將app上傳到App Store的時候通常會遇到這個問題??
try again
很多人說這事蘋果爸爸服務器問題,重復嘗試幾次,總會成功的!
但是經過嘗試發現如果使用Application Loader上傳成功率就非常高,所以還是推薦把ipa文件導出直接用Application Loader上傳。
如果Application Loader也不行,需要檢查下自己的網絡,有時候vpn也會提高速度。
94、當tableView占不滿一屏時,去除下邊多余的單元格self.tableView.tableHeaderView = [UIView new];self.tableView.tableFooterView = [UIView new];?95、isKindOfClass和isMemberOfClass的區別?isKindOfClass可以判斷某個對象是否屬于某個類,或者這個類的子類。isMemberOfClass更加精準,它只能判斷這個對象類型是否為這個類(不能判斷子類)?96、__block
當一個局部變量需要在block里改變時,需要在定義時加上__block修飾,具體請看官方文檔?http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW6
97、-[ViewController aMethod:]: unrecognized selector sent to instance 0x7fe91e607fb0
這是一個經典錯誤,ViewController不能響應aMethod這個方法,錯誤原因可能viewController文件中沒有實現aMethod這個方法
98、UITableView (<UITableView: 0x7ff19b027000; >) failed to obtain a cell from its dataSource (<ViewController: 0x7ff19a507520>)
這個錯誤原因是tableView的代理方法-tableView:cellForRowAtIndexPath:需要返回一個UITableViewCell,而你返回了一個nil。另外這個地方返回值不是UITableViewCell類型也會導致崩潰
99、約束如何做UIView動畫??1、把需要改的約束Constraint拖條線出來,成為屬性2、在需要動畫的地方加入代碼,改變此屬性的constant屬性3、開始做UIView動畫,動畫里邊調用layoutIfNeeded方法@property (weak,?nonatomic)?IBOutlet?NSLayoutConstraint *buttonTopConstraint;self.buttonTopConstraint.constant =?100; [UIView animateWithDuration:.5 animations:^{ [self.view layoutIfNeeded]; }];?100、從NSURL中拿到鏈接字符串?NSString *urlString = myURL.absoluteString;?101、將tableView滾動到頂部?[tableView?setContentOffset:CGPointZero?animated:YES];或者[tableView?scrollRectToVisible:CGRectMake(0,?0,?1,?1)?animated:YES];?102、如果用addTarget:action:forControlEvents:方法為一個button添加了很多點擊事件,在某個時刻想一次刪除怎么辦?只需要調用下邊這句代碼?[youButton?removeTarget:nil?action:nil?forControlEvents:UIControlEventAllEvents];?103、某個字體的高度font.lineHeight;?104、刪除某個view所有的子視圖?[[someView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];?105、刪除NSUserDefaults所有記錄?//方法一?NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];?//方法二 - (void)resetDefaults {?NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];NSDictionary * dict = [defs dictionaryRepresentation];?for (id key?in dict) { [defs removeObjectForKey:key]; } [defs synchronize]; }// 方法三[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];?106、禁用系統滑動返回功能?- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated];if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {self.navigationController.interactivePopGestureRecognizer.delegate =?self; }}- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated];?if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {self.navigationController.interactivePopGestureRecognizer.delegate =?nil; }}- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{?return?NO;}?107、模擬器報錯?
模擬器報錯
解決辦法:
打開模擬器->Simulator->Reset Content and Settings...
如果不行,就重啟試試!
108、自定義cell選中背景顏色?UIView *bgColorView =?[[UIView alloc] init];bgColorView.backgroundColor =?[UIColor redColor];[cell setSelectedBackgroundView:bgColorView];?109、UILabel設置內邊距?子類化UILabel,重寫drawTextInRect方法- (void)drawTextInRect:(CGRect)rect {?// 邊距,上左下右?UIEdgeInsets insets = {0,?5,?0,?5}; [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];}?110、UILabel設置文字描邊?子類化UILabel,重寫drawTextInRect方法- (void)drawTextInRect:(CGRect)rect{?CGContextRef c =?UIGraphicsGetCurrentContext();?// 設置描邊寬度?CGContextSetLineWidth(c,?1);?CGContextSetLineJoin(c, kCGLineJoinRound);?CGContextSetTextDrawingMode(c, kCGTextStroke);?// 描邊顏色?self.textColor = [UIColor redColor]; [super drawTextInRect:rect];?// 文本顏色?self.textColor = [UIColor yellowColor];CGContextSetTextDrawingMode(c, kCGTextFill); [super drawTextInRect:rect];}111、使用模擬器截圖
快捷鍵command + s
或者File->Save Screen Shot
112、scrollView滾動到最下邊?CGPoint?bottomOffset = CGPointMake(0,?scrollView.contentSize.height -?scrollView.bounds.size.height);[scrollView setContentOffset:bottomOffset animated:YES];?113、UIView背景顏色漸變UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,?0,?320,?100)]; [self.view addSubview:view];?CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = view.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor]?CGColor], (id)[[UIColor whiteColor]?CGColor],?nil]; [view.layer insertSublayer:gradient atIndex:0];?114、停止UIView動畫?[yourView.layer removeAllAnimations]?115、為UIView某個角添加圓角?// 左上角和右下角添加圓角UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:(UIRectCornerTopLeft |?UIRectCornerBottomRight) cornerRadii:CGSizeMake(20,?20)];?CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = view.bounds; maskLayer.path = maskPath.CGPath; view.layer.mask = maskLayer;?116、刪除Xcode Derived data緩存數據
依次點擊Xcode -> Preferences -> location,然后點擊 Derived data路徑后到小箭頭,刪除這個文件夾下的數據就可以了,如圖
?Xcode Derived data
117、將一個view放置在其兄弟視圖的最上面?[parentView bringSubviewToFront:yourView]?118、將一個view放置在其兄弟視圖的最下面[parentView sendSubviewToBack:yourView]?119、讓手機震動一下?倒入框架#import <AudioToolbox/AudioToolbox.h>AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);或者AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);120、layoutSubviews方法什么時候調用?
1、init方法不會調用
2、addSubview方法等時候會調用
3、bounds改變的時候調用
4、scrollView滾動的時候會調用scrollView的layoutSubviews方法(所以不建議在scrollView的layoutSubviews方法中做復雜邏輯)
5、旋轉設備的時候調用
6、子視圖被移除的時候調用
參考請看:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/
121、讓UILabel在指定的地方換行?// 換行符為/n,在需要換行的地方加上這個符號即可,如?label.numberOfLines = 0;label.text = @"此處/n換行";?122、搖一搖功能1、打開搖一搖功能 [UIApplication sharedApplication].applicationSupportsShakeToEdit =?YES;2、讓需要搖動的控制器成為第一響應者[self becomeFirstResponder];3、實現以下方法// 開始搖動- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event// 取消搖動- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event// 搖動結束- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event?123、獲取圖片大小?CGFloat imageWidth =?image.size.width; CGFloat imageHeight = imageWidth *?image.scale;?124、獲取view的坐標在整個window上的位置?// v上的(0, 0)點在toView上的位置CGPoint point = [v convertPoint:CGPointMake(0,?0) toView:[UIApplication sharedApplication].windows.lastObject];或者CGPoint point = [v.superview convertPoint:v.frame.origin toView:[UIApplication sharedApplication].windows.lastObject];?125、提交App Store審核程序限制
您的應用程序的未壓縮大小必須小于4GB。每個Mach-O可執行文件(例如app_name.app/app_name)不能超過這些限制:
對于MinimumOSVersion小于7.0的應用程序:TEXT二進制文件中所有部分的總數最多為80 MB 。
對于MinimumOSVersion7.x到8.x的應用程序:TEXT對于二進制文件中每個體系結構片段的每個片段,最大為60 MB 。
對于MinimumOSVersion9.0或更高版本的應用程序:__TEXT二進制文件中所有部分的總數最多為500 MB 。參閱:iTunes Connect開發者指南
126、修改UISegmentedControl的字體大小?[segment?setTitleTextAttributes:@{NSFontAttributeName : [UIFont?systemFontOfSize:15.0f]}?forState:UIControlStateNormal];?127、在非ViewController的地方彈出UIAlertController對話框?// 最好抽成一個分類UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];//...id rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;if([rootViewController isKindOfClass:[UINavigationController?class]]){ rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;}if([rootViewController isKindOfClass:[UITabBarController?class]]){ rootViewController = ((UITabBarController *)rootViewController).selectedViewController;}[rootViewController presentViewController:alertController animated:YES completion:nil];?128、獲取一個view所屬的控制器?// view分類方法- (UIViewController *)belongViewController {?for (UIView *next = [self superview]; next; next = next.superview) {?UIResponder* nextResponder = [next nextResponder];?if ([nextResponder isKindOfClass:[UIViewController?class]]) {?return (UIViewController *)nextResponder; } }?return?nil;}?129、UIImage和base64互轉?// view分類方法- (NSString *)encodeToBase64String:(UIImage *)image {?return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];}- (UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];?return [UIImage imageWithData:data];}?130、UIWebView設置背景透明?[webView setBackgroundColor:[UIColor clearColor]];[webView setOpaque:NO];?131、判斷NSDate是不是今天?NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra |?NSCalendarUnitYear |?NSCalendarUnitMonth |?NSCalendarUnitDay fromDate:aDate];NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra |?NSCalendarUnitYear |?NSCalendarUnitMonth |?NSCalendarUnitDay fromDate:[NSDate date]];if([today day] == [otherDay day] &;&; [today month] == [otherDay month] &;&; [today year] == [otherDay year] &;&; [today era] == [otherDay era]) {?// 是今天}132、設置tableView分割線顏色?[self.tableView setSeparatorColor:[UIColor myColor]];?133、設置屏幕方向?NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];[UIViewController attemptRotationToDeviceOrientation];?134、比較兩個顏色是否相等?- (BOOL)isEqualToColor:(UIColor *)otherColor {?CGColorSpaceRef colorSpaceRGB =?CGColorSpaceCreateDeviceRGB();?UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) {?if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {?const?CGFloat *oldComponents =?CGColorGetComponents(color.CGColor);?CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};?CGColorRef colorRef =?CGColorCreate( colorSpaceRGB, components );?UIColor *color = [UIColor colorWithCGColor:colorRef];CGColorRelease(colorRef);?return color; }?else?return color; };?UIColor *selfColor = convertColorToRGBSpace(self); otherColor = convertColorToRGBSpace(otherColor);CGColorSpaceRelease(colorSpaceRGB);?return [selfColor isEqual:otherColor];}?135、tableViewCell分割線頂到頭?- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [cell setSeparatorInset:UIEdgeInsetsZero]; [cell setLayoutMargins:UIEdgeInsetsZero]; cell.preservesSuperviewLayoutMargins =?NO;}- (void)viewDidLayoutSubviews { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; [self.tableView setLayoutMargins:UIEdgeInsetsZero];}?136、不讓控制器的view隨著控制器的xib拉伸或壓縮?self.view.autoresizingMask =?UIViewAutoresizingFlexibleWidth |?UIViewAutoresizingFlexibleHeight;?137、cocoaPods報錯 : [!] Unable to add a source with url?https://github.com/CocoaPods/Specs.git?named?master-1.
You can try adding it manually in?~/.cocoapods/repos?or via?pod repo add.
解決方法:這是因為電腦里安裝了另外一個Xcode導致cocoapods找不到路徑了
在終端執行 sudo xcode-select -switch /Applications/Xcode.app 即可
138、安裝cocoapods的時候出現 ERROR: While executing gem ... (Errno::EPERM)?Operation?not permitted -?/usr/bin/pod
解決辦法:直接在終端執行 sudo gem install -n /usr/local/bin cocoapods
139、在狀態欄增加網絡請求的菊花,類似safari加載網頁的時候狀態欄菊花[UIApplication?sharedApplication].networkActivityIndicatorVisible = YES;?140、檢查一個rect是否包含一個point?// point是否在rect內BOOL isContains = CGRectContainsPoint(rect,?point);?141、在指定的寬度下,讓UILabel自動設置最佳font?label.adjustsFontSizeToFitWidth = YES;?142、將一個image保存在相冊中?UIImageWriteToSavedPhotosAlbum(image,?nil,?nil,?nil);或者#import?<Photos/Photos.h>[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; changeRequest.creationDate = [NSDate date]; } completionHandler:^(BOOL success,?NSError *error) {?if (success) {?NSLog(@"successfully saved"); }?else {?NSLog(@"error saving to photos: %@", error); } }];?143、修改cell.imageView的大小?UIImage *icon = [UIImage imageNamed:@""];CGSize itemSize =?CGSizeMake(30,?30);UIGraphicsBeginImageContextWithOptions(itemSize,?NO ,0.0);CGRect imageRect =?CGRectMake(0.0,?0.0, itemSize.width, itemSize.height);[icon drawInRect:imageRect];cell.imageView.image =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?144、為一個view添加虛線邊框?CAShapeLayer *border = [CAShapeLayer layer];?border.strokeColor = [UIColor colorWithRed:67/255.0f green:37/255.0f?blue:83/255.0f alpha:1].CGColor;?border.fillColor = nil;?border.lineDashPattern =?@[@4, @2];?border.path = [UIBezierPath?bezierPathWithRect:view.bounds].CGPath;?border.frame = view.bounds; [view.layer?addSublayer:border];?145、UITextView中打開或禁用復制,剪切,選擇,全選等功能?// 繼承UITextView重寫這個方法- (BOOL)canPerformAction:(SEL)action?withSender:(id)sender{// 返回NO為禁用,YES為開啟?// 粘貼?if (action ==?@selector(paste:))?return?NO;?// 剪切?if (action ==?@selector(cut:))?return?NO;?// 復制?if (action ==?@selector(copy:))?return?NO;?// 選擇?if (action ==?@selector(select:))?return?NO;?// 選中全部?if (action ==?@selector(selectAll:))?return?NO;?// 刪除?if (action ==?@selector(delete:))?return?NO;?// 分享?if (action ==?@selector(share))?return?NO;?return?[super canPerformAction:action withSender:sender];}?1、設置UILabel行間距NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:label.text]; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; [style setLineSpacing:20]; [attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0,?label.text.length)];?label.attributedText = attrString;
// 或者使用xib,看下gif圖
?Untitled.gif
2、當使用-performSelector:withObject:withObject:afterDelay:方法時,需要傳入多參數問題?// 方法一、// 把參數放進一個數組/字典,直接把數組/字典當成一個參數傳過去,具體方法實現的地方再解析這個數組/字典NSArray * array = [NSArray?arrayWithObjects: @"first", @"second", nil];[self?performSelector:@selector(fooFirstInput:)?withObject: array?afterDelay:15.0];// 方法二、// 使用NSInvocationSEL aSelector = NSSelectorFromString(@"doSoming:argument2:"); NSInteger argument1 =?10; NSString *argument2 = @"argument2";?if([self?respondsToSelector:aSelector]) { NSInvocation *inv = [NSInvocation?invocationWithMethodSignature:[self?methodSignatureForSelector:aSelector]]; [inv?setSelector:aSelector]; [inv?setTarget:self]; [inv?setArgument:&;(argument1)?atIndex:2]; [inv?setArgument:&;(argument2)?atIndex:3]; [inv?performSelector:@selector(invoke)?withObject:nil?afterDelay:15.0]; }?3、UILabel顯示不同顏色字體?NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:label.text];[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];label.attributedText = string;?4、比較兩個CGRect/CGSize/CGPoint是否相等?if (CGRectEqualToRect(rect1, rect2)) {?// 兩個區域相等?//?do some }?if (CGPointEqualToPoint(point1, point2)) {?// 兩個點相等?//?do some }?if (CGSizeEqualToSize(size1, size2)) {?// 兩個size相等?//?do some }?5、比較兩個NSDate相差多少小時?NSDate* date1 = someDate;?NSDate* date2 = someOtherDate;?NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];?double secondsInAnHour =?3600;// 除以3600是把秒化成小時,除以60得到結果為相差的分鐘數?NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;?6、每個cell之間增加間距?// 方法一,每個分區只顯示一行cell,分區頭當作你想要的間距(注意,從數據源數組中取值的時候需要用indexPath.section而不是indexPath.row)- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{?return yourArry.count;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{?return?1;}-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{?return cellSpacingHeight;}// 方法二,在cell的contentView上加個稍微低一點的view,cell上原本的內容放在你的view上,而不是contentView上,這樣能偽造出一個間距來。// 方法三,自定義cell,重寫setFrame:方法- (void)setFrame:(CGRect)frame{ frame.size.height -=?20; [super setFrame:frame];}?7、播放一張張連續的圖片?// 加入現在有三張圖片分別為animate_1、animate_2、animate_3// 方法一 imageView.animationImages = @[[UIImage?imageNamed:@"animate_1"], [UIImage?imageNamed:@"animate_2"], [UIImage?imageNamed:@"animate_3"]];imageView.animationDuration =?1.0;// 方法二 imageView.image = [UIImage?animatedImageNamed:@"animate_"?duration:1.0];// 方法二解釋下,這個方法會加載animate_為前綴的,后邊0-1024,也就是animate_0、animate_1一直到animate_1024?8、加載gif圖片
推薦使用這個框架?FLAnimatedImage
9、防止離屏渲染為image添加圓角?// image分類- (UIImage *)circleImage{// NO代表透明UIGraphicsBeginImageContextWithOptions(self.size,?NO,?1);// 獲得上下文CGContextRef ctx =?UIGraphicsGetCurrentContext();// 添加一個圓CGRect rect =?CGRectMake(0,?0,?self.size.width,?self.size.height);// 方形變圓形CGContextAddEllipseInRect(ctx, rect);// 裁剪CGContextClip(ctx);// 將圖片畫上去[self drawInRect:rect];UIImage *image =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return image;}?10、查看系統所有字體?// 打印字體for (id familyName?in [UIFont familyNames]) {?NSLog(@"%@", familyName);?for (id fontName?in [UIFont fontNamesForFamilyName:familyName])?NSLog(@" %@", fontName);}// 也可以進入這個網址查看 http://iosfonts.com/?11、獲取隨機數NSInteger i = arc4random();?12、獲取隨機數小數(0-1之間)?#define ARC4RANDOM_MAX 0x100000000double val = ((double)arc4random() / ARC4RANDOM_MAX);?13、AVPlayer視頻播放完成的通知監聽[[NSNotificationCenter defaultCenter]?addObserver:selfselector:@selector(videoPlayEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];?14、判斷兩個rect是否有交叉?if?(CGRectIntersectsRect(rect1, rect2)) {}?15、判斷一個字符串是否為數字?NSCharacterSet *notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];?if ([str rangeOfCharacterFromSet:notDigits].location ==?NSNotFound) {?// 是數字 }?else {?// 不是數字 }?16、將一個view保存為pdf格式?- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename{?NSMutableData *pdfData = [NSMutableData data];UIGraphicsBeginPDFContextToData(pdfData, aView.bounds,?nil);UIGraphicsBeginPDFPage();?CGContextRef pdfContext =?UIGraphicsGetCurrentContext(); [aView.layer renderInContext:pdfContext];UIGraphicsEndPDFContext();?NSArray* documentDirectories =?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,YES);?NSString* documentDirectory = [documentDirectories objectAtIndex:0];?NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; [pdfData writeToFile:documentDirectoryFilename atomically:YES];NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);}17、讓一個view在父視圖中心?child.center =?[parent convertPoint:parent.center fromView:parent.superview];?18、獲取當前導航控制器下前一個控制器?- (UIViewController *)backViewController{?NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self];?if ( myIndex !=?0 &;&; myIndex !=?NSNotFound ) {?return [self.navigationController.viewControllers objectAtIndex:myIndex-1]; }?else {return?nil; }}?19、保存UIImage到本地?NSArray *paths =?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];?20、鍵盤上方增加工具欄?UIToolbar *keyboardDoneButtonView = [[UIToolbar alloc] init];[keyboardDoneButtonView sizeToFit];UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneClicked:)];[keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton,?nil]];txtField.inputAccessoryView = keyboardDoneButtonView;?21、copy一個view
因為UIView沒有實現copy協議,因此找不到copyWithZone方法,使用copy的時候導致崩潰
但是我們可以通過歸檔再解檔實現copy,這相當于對視圖進行了一次深拷貝,代碼如下
id copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];?22、在image上繪制文字并生成新的image?UIFont *font = [UIFont boldSystemFontOfSize:12]; UIGraphicsBeginImageContext(image.size); [image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)]; CGRect?rect = CGRectMake(point.x,?point.y,?image.size.width,?image.size.height); [[UIColor whiteColor]?set]; [text drawInRect:CGRectIntegral(rect) withFont:font]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();?23、判斷一個view是否為另一個view的子視圖?// 如果myView是self.view本身,也會返回yesBOOL isSubView = [myView isDescendantOfView:self.view];?24、判斷一個字符串是否包含另一個字符串?// 方法一、這種方法只適用于iOS8之后,如果是配iOS8之前用方法二if ([str containsString:otherStr])?NSLog(@"包含");// 方法二NSRange range = [str rangeOfString:otherStr];if (range.location !=?NSNotFound)?NSLog(@"包含");25、UICollectionView自動滾動到某行?// 重寫viewDidLayoutSubviews方法-(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.collectionView?scrollToItemAtIndexPath:indexPath?atScrollPosition:UICollectionViewScrollPositionCenteredVertically?animated:NO];}?26、修改系統UIAlertController?// 但是據說這種方法會被App Store拒絕(慎用!)UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];?NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"我是一個大文本"]; [hogan addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30] range:NSMakeRange(4,?1)]; [hogan addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(4,?1)]; [alertVC setValue:hogan forKey:@"attributedTitle"];?UIAlertAction *button = [UIAlertAction actionWithTitle:@"Label text" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ }];?UIImage *accessoryImage = [UIImage imageNamed:@"1"]; [button setValue:accessoryImage forKey:@"image"]; [alertVC addAction:button]; [self presentViewController:alertVC animated:YES completion:nil];?27、判斷某一行的cell是否已經顯示?CGRect cellRect = [tableView rectForRowAtIndexPath:indexPath];BOOL completelyVisible = CGRectContainsRect(tableView.bounds, cellRect);?28、讓導航控制器pop回指定的控制器?NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];for (UIViewController *aViewController?in allViewControllers) {?if ([aViewController isKindOfClass:[RequiredViewController?class]]) { [self.navigationController popToViewController:aViewController animated:NO]; }}?29、動畫修改label上的文字?// 方法一CATransition *animation = [CATransition animation]; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; animation.type = kCATransitionFade; animation.duration =?0.75; [self.label.layer addAnimation:animation forKey:@"kCATransitionFade"];?self.label.text =?@"New";// 方法二[UIView transitionWithView:self.label duration:0.25f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{self.label.text =?@"Well done!"; } completion:nil];// 方法三[UIView animateWithDuration:1.0 animations:^{?self.label.alpha =?0.0f;?self.label.text =?@"newText";?self.label.alpha =?1.0f; }];?30、判斷字典中是否包含某個key值?if ([dic?objectForKey:@"yourKey"]) {?NSLog(@"有這個值");}?else {?NSLog(@"沒有這個值");}?31、獲取屏幕方向?UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;if(orientation ==?0)?//Default orientation?//默認else?if(orientation ==?UIInterfaceOrientationPortrait)?//豎屏else?if(orientation ==?UIInterfaceOrientationLandscapeLeft)?// 左橫屏else?if(orientation ==?UIInterfaceOrientationLandscapeRight)?//右橫屏?32、設置UIImage的透明度?// 方法一、添加UIImage分類- (UIImage *)imageByApplyingAlpha:(CGFloat) alpha {UIGraphicsBeginImageContextWithOptions(self.size,?NO,?0.0f);?CGContextRef ctx =?UIGraphicsGetCurrentContext();?CGRect area =?CGRectMake(0,?0,?self.size.width,?self.size.height);?CGContextScaleCTM(ctx,?1,?-1);CGContextTranslateCTM(ctx,?0, -area.size.height);CGContextSetBlendMode(ctx, kCGBlendModeMultiply);CGContextSetAlpha(ctx, alpha);?CGContextDrawImage(ctx, area,?self.CGImage);?UIImage *newImage =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?return newImage;}// 方法二、如果沒有奇葩需求,干脆用UIImageView設置透明度UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"yourImage"]];imageView.alpha =?0.5;?33、Attempt to mutate immutable object with insertString:atIndex:
這個錯是因為你拿字符串調用insertString:atIndex:方法的時候,調用對象不是NSMutableString,應該先轉成這個類型再調用
34、UIWebView添加單擊手勢不響應?UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(webViewClick)]; tap.delegate =?self; [_webView addGestureRecognizer:tap];// 因為webView本身有一個單擊手勢,所以再添加會造成手勢沖突,從而不響應。需要綁定手勢代理,并實現下邊的代理方法- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{?return?YES;}?35、獲取手機RAM容量?// 需要導入#import <mach/mach.h>mach_port_t host_port;?mach_msg_type_number_t host_size;?vm_size_t pagesize; host_port = mach_host_self(); host_size =?sizeof(vm_statistics_data_t) /?sizeof(integer_t); host_page_size(host_port, &;pagesize);?vm_statistics_data_t vm_stat;?if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&;vm_stat, &;host_size) != KERN_SUCCESS) { NSLog(@"Failed to fetch vm statistics"); }?/* Stats in bytes */?natural_t mem_used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pagesize;?natural_t mem_free = vm_stat.free_count * pagesize;?natural_t mem_total = mem_used + mem_free; NSLog(@"已用: %u 可用: %u 總共: %u", mem_used, mem_free, mem_total);?36、地圖上兩個點之間的實際距離?// 需要導入#import <CoreLocation/CoreLocation.h>CLLocation *locA = [[CLLocation alloc]?initWithLatitude:34?longitude:113]; CLLocation *locB = [[CLLocation alloc]?initWithLatitude:31.05?longitude:121.76];// CLLocationDistance求出的單位為米 CLLocationDistance distance = [locA?distanceFromLocation:locB];?37、在應用中打開設置的某個界面?// 打開設置->通用[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General"]];// 以下是設置其他界面prefs:root=General&;path=Aboutprefs:root=General&;path=ACCESSIBILITYprefs:root=AIRPLANE_MODEprefs:root=General&;path=AUTOLOCKprefs:root=General&;path=USAGE/CELLULAR_USAGEprefs:root=Brightnessprefs:root=Bluetoothprefs:root=General&;path=DATE_AND_TIMEprefs:root=FACETIMEprefs:root=Generalprefs:root=General&;path=Keyboardprefs:root=CASTLEprefs:root=CASTLE&;path=STORAGE_AND_BACKUPprefs:root=General&;path=INTERNATIONALprefs:root=LOCATION_SERVICESprefs:root=ACCOUNT_SETTINGSprefs:root=MUSICprefs:root=MUSIC&;path=EQprefs:root=MUSIC&;path=VolumeLimitprefs:root=General&;path=Networkprefs:root=NIKE_PLUS_IPODprefs:root=NOTESprefs:root=NOTIFICATIONS_IDprefs:root=Phoneprefs:root=Photosprefs:root=General&;path=ManagedConfigurationListprefs:root=General&;path=Resetprefs:root=Sounds&;path=Ringtoneprefs:root=Safariprefs:root=General&;path=Assistantprefs:root=Soundsprefs:root=General&;path=SOFTWARE_UPDATE_LINKprefs:root=STOREprefs:root=TWITTERprefs:root=FACEBOOKprefs:root=General&;path=USAGE prefs:root=VIDEOprefs:root=General&;path=Network/VPNprefs:root=Wallpaperprefs:root=WIFIprefs:root=INTERNET_TETHERINGprefs:root=Phone&;path=Blockedprefs:root=DO_NOT_DISTURB?38、在UITextView中顯示html文本UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(20,?30,?100,?199)]; textView.backgroundColor = [UIColor redColor]; [self.view addSubview:textView];?NSString *htmlString =?@"<h1>Header</h1><h2>Subheader</h2>Some <em>text</em>";?NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding] options: @{?NSDocumentTypeDocumentAttribute:?NSHTMLTextDocumentType } documentAttributes:?nil error:?nil]; textView.attributedText = attributedString;?39、監聽scrollView是否滾動到了頂部/底部?-(void)scrollViewDidScroll: (UIScrollView*)scrollView{?float scrollViewHeight = scrollView.frame.size.height;?float scrollContentSizeHeight = scrollView.contentSize.height;?float scrollOffset = scrollView.contentOffset.y;?if (scrollOffset ==?0) {?// 滾動到了頂部 }?else?if (scrollOffset + scrollViewHeight == scrollContentSizeHeight) {?// 滾動到了底部 }}?40、UISlider增量/減量為固定值(假如為5)?- (void)setupSlider{ UISlider *slider = [[UISlider alloc] init]; [self.view?addSubview:slider]; [slider?addTarget:self?action:@selector(sliderAction:)?forControlEvents:UIControlEventValueChanged]; slider.maximumValue =?100; slider.minimumValue =?0; slider.frame = CGRectMake(200,?20,?100,?30);}- (void)sliderAction:(UISlider *)slider{ [slider?setValue:((int)((slider.value +?2.5) /?5) *?5)?animated:NO];}?41、選中textField或者textView所有文本(我這里以textView為例)?[self.textView setSelectedTextRange:[self.textView textRangeFromPosition:self.textView.beginningOfDocument toPosition:self.textView.endOfDocument]]?42、從導航控制器中刪除某個控制器// 方法一、知道這個控制器所處的導航控制器下標NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray:?self.navigationController.viewControllers];[navigationArray removeObjectAtIndex:?2];?self.navigationController.viewControllers = navigationArray;// 方法二、知道具體是哪個控制器NSArray* tempVCA = [self.navigationController viewControllers];for(UIViewController *tempVC?in tempVCA){?if([tempVC isKindOfClass:[urViewControllerClass?class]]) { [tempVC removeFromParentViewController]; }}?43、隱藏UITextView/UITextField光標?textField.tintColor = [UIColor clearColor];?44、當UITextView/UITextField中沒有文字時,禁用回車鍵textField.enablesReturnKeyAutomatically?=?YES;?45、字符串encode編碼(編碼url字符串不成功的問題)?// 我們一般用這個方法處理stringByAddingPercentEscapesUsingEncoding但是這個方法好想不會處理/和&;這種特殊符號,這種情況就需要用下邊這個方法處理@implementation?NSString (NSString_Extended)- (NSString *)urlencode {?NSMutableString *output = [NSMutableString string];?const?unsigned?char *source = (const?unsigned?char *)[self UTF8String];?int sourceLen = strlen((const?char *)source);?for (int i =?0; i < sourceLen; ++i) {?const?unsigned?char thisChar = source[i];?if (thisChar ==?' '){ [output appendString:@"+"]; }?else?if (thisChar ==?'.' || thisChar ==?'-' || thisChar ==?'_' || thisChar ==?'~' || (thisChar >=?'a' &;&; thisChar <=?'z') || (thisChar >=?'A' &;&; thisChar <=?'Z') || (thisChar >=?'0' &;&; thisChar <=?'9')) { [output appendFormat:@"%c", thisChar]; }?else { [output appendFormat:@"%%%02X", thisChar]; } }?return output;}?46、計算UILabel上某段文字的frame?@implementation?UILabel (TextRect)- (CGRect)boundingRectForCharacterRange:(NSRange)range{?NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];?NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; [textStorage addLayoutManager:layoutManager];?NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size]; textContainer.lineFragmentPadding =?0; [layoutManager addTextContainer:textContainer];?NSRange glyphRange; [layoutManager characterRangeForGlyphRange:range actualGlyphRange:&;glyphRange];return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];}?47、獲取隨機UUID?NSString *result;if([[[UIDevice currentDevice] systemVersion] floatValue] >?6.0) { result = [[NSUUID UUID] UUIDString]; }?else {?CFUUIDRef uuidRef =?CFUUIDCreate(NULL);?CFStringRef uuid =?CFUUIDCreateString(NULL, uuidRef);?CFRelease(uuidRef); result = (__bridge_transfer?NSString *)uuid; }48、仿蘋果抖動動畫?#define RADIANS(degrees) (((degrees) * M_PI) / 180.0)- (void)startAnimate { view.transform =?CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-5)); [UIView animateWithDuration:0.25 delay:0.0 options:(UIViewAnimationOptionAllowUserInteraction |?UIViewAnimationOptionRepeat |?UIViewAnimationOptionAutoreverse) animations:^ { view.transform =?CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(5)); } completion:nil];}- (void)stopAnimate { [UIView animateWithDuration:0.25 delay:0.0 options:(UIViewAnimationOptionAllowUserInteraction |?UIViewAnimationOptionBeginFromCurrentState |?UIViewAnimationOptionCurveLinear) animations:^ { view.transform =?CGAffineTransformIdentity; } completion:nil];}?49、修改UISearBar內部背景顏色UITextField *textField = [_searchBar valueForKey:@"_searchField"];textField.backgroundColor = [UIColor redColor];50、UITextView滾動到頂部?// 方法一 [self.textView scrollRangeToVisible:NSMakeRange(0,?0)];?// 方法二 [self.textView setContentOffset:CGPointZero animated:YES];?51、通知監聽APP生命周期
UIApplicationDidEnterBackgroundNotification 應用程序進入后臺
UIApplicationWillEnterForegroundNotification 應用程序將要進入前臺
UIApplicationDidFinishLaunchingNotification 應用程序完成啟動
UIApplicationDidFinishLaunchingNotification 應用程序由掛起變的活躍
UIApplicationWillResignActiveNotification 應用程序掛起(有電話進來或者鎖屏)
UIApplicationDidReceiveMemoryWarningNotification 應用程序收到內存警告
UIApplicationDidReceiveMemoryWarningNotification 應用程序終止(后臺殺死、手機關機等)
UIApplicationSignificantTimeChangeNotification 當有重大時間改變(凌晨0點,設備時間被修改,時區改變等)
UIApplicationWillChangeStatusBarOrientationNotification 設備方向將要改變
UIApplicationDidChangeStatusBarOrientationNotification 設備方向改變
UIApplicationWillChangeStatusBarFrameNotification 設備狀態欄frame將要改變
UIApplicationDidChangeStatusBarFrameNotification 設備狀態欄frame改變
UIApplicationBackgroundRefreshStatusDidChangeNotification 應用程序在后臺下載內容的狀態發生變化
UIApplicationProtectedDataWillBecomeUnavailable 本地受保護的文件被鎖定,無法訪問
UIApplicationProtectedDataWillBecomeUnavailable 本地受保護的文件可用了
52、觸摸事件類型
UIControlEventTouchCancel 取消控件當前觸發的事件
UIControlEventTouchDown 點按下去的事件
UIControlEventTouchDownRepeat 重復的觸動事件
UIControlEventTouchDragEnter 手指被拖動到控件的邊界的事件
UIControlEventTouchDragExit 一個手指從控件內拖到外界的事件
UIControlEventTouchDragInside 手指在控件的邊界內拖動的事件
UIControlEventTouchDragOutside 手指在控件邊界之外被拖動的事件
UIControlEventTouchUpInside 手指處于控制范圍內的觸摸事件
UIControlEventTouchUpOutside 手指超出控制范圍的控制中的觸摸事件
53、UITextField文字周圍增加邊距?// 子類化UITextField,增加insert屬性@interface?WZBTextField :?UITextField@property (nonatomic,?assign)?UIEdgeInsets insets;@end// 在.m文件重寫下列方法- (CGRect)textRectForBounds:(CGRect)bounds {?CGRect paddedRect =?UIEdgeInsetsInsetRect(bounds,?self.insets);?if (self.rightViewMode ==?UITextFieldViewModeAlways ||?self.rightViewMode ==?UITextFieldViewModeUnlessEditing) {?return [self adjustRectWithWidthRightView:paddedRect]; }?return paddedRect;}- (CGRect)placeholderRectForBounds:(CGRect)bounds {?CGRect paddedRect =?UIEdgeInsetsInsetRect(bounds,?self.insets);?if (self.rightViewMode ==?UITextFieldViewModeAlways ||?self.rightViewMode ==?UITextFieldViewModeUnlessEditing) {?return [self adjustRectWithWidthRightView:paddedRect]; }?return paddedRect;}- (CGRect)editingRectForBounds:(CGRect)bounds {?CGRect paddedRect =?UIEdgeInsetsInsetRect(bounds,?self.insets);?if (self.rightViewMode ==?UITextFieldViewModeAlways ||?self.rightViewMode ==?UITextFieldViewModeWhileEditing) {?return [self adjustRectWithWidthRightView:paddedRect]; }?return paddedRect;}- (CGRect)adjustRectWithWidthRightView:(CGRect)bounds {?CGRect paddedRect = bounds; paddedRect.size.width -=?CGRectGetWidth(self.rightView.frame);?return paddedRect;}?54、監聽UISlider拖動狀態?// 添加事件[slider addTarget:self action:@selector(sliderValurChanged:forEvent:) forControlEvents:UIControlEventValueChanged];// 實現方法- (void)sliderValurChanged:(UISlider*)slider forEvent:(UIEvent*)event {?UITouch *touchEvent = [[event allTouches] anyObject];?switch (touchEvent.phase) {case?UITouchPhaseBegan:?NSLog(@"開始拖動");?break;?case?UITouchPhaseMoved:?NSLog(@"正在拖動");?break;?case?UITouchPhaseEnded:NSLog(@"結束拖動");?break;?default:?break; }}?55、設置UITextField光標位置?// textField需要設置的textField,index要設置的光標位置- (void)cursorLocation:(UITextField *)textField?index:(NSInteger)index{ NSRange range = NSMakeRange(index,?0); UITextPosition *start = [textField?positionFromPosition:[textField beginningOfDocument]?offset:range.location]; UITextPosition *end = [textField?positionFromPosition:start?offset:range.length]; [textField?setSelectedTextRange:[textField?textRangeFromPosition:start?toPosition:end]];}?56、去除webView底部黑色[webView setBackgroundColor:[UIColor clearColor]]; [webView setOpaque:NO];?for (UIView *v1?in [webView subviews]) {?if ([v1 isKindOfClass:[UIScrollView?class]]) {?for (UIView *v2?in v1.subviews) {?if ([v2 isKindOfClass:[UIImageView?class]]) { v2.hidden =?YES; } } } }?57、獲取collectionViewCell在屏幕中的frame?UICollectionViewLayoutAttributes?*attributes?=?[collectionView?layoutAttributesForItemAtIndexPath:indexPath];CGRect?cellRect?=?attributes.frame;CGRect?cellFrameInSuperview?=?[collectionView?convertRect:cellRect?toView:[cv?superview]];?58、比較兩個UIImage是否相等?- (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2{?NSData *data1 =?UIImagePNGRepresentation(image1);?NSData *data2 =?UIImagePNGRepresentation(image2);?return [data1 isEqual:data2];}?59、解決當UIScrollView上有UIButton的時候,觸摸到button滑動不了的問題?// 子類化UIScrollView,并重寫以下方法- (instancetype)initWithFrame:(CGRect)frame {?if (self = [super initWithFrame:frame]) {?self.delaysContentTouches =?NO; }return?self;}- (BOOL)touchesShouldCancelInContentView:(UIView *)view {?if ([view isKindOfClass:UIButton.class]) {?return?YES; }?return [super touchesShouldCancelInContentView:view];}?60、UITextView中的文字添加陰影效果?- (void)setTextLayer:(UITextView *)textView color:(UIColor *)color{ CALayer *textLayer = ((CALayer *)[textView.layer.sublayers objectAtIndex:0]); textLayer.shadowColor = color.CGColor; textLayer.shadowOffset = CGSizeMake(0.0f,?1.0f); textLayer.shadowOpacity =?1.0f; textLayer.shadowRadius =?1.0f;}?61、MD5加密?+ (NSString *)md5:(NSString *)str{?const?char *concat_str = [str UTF8String];?unsigned?char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(concat_str, (unsigned?int)strlen(concat_str), result);?NSMutableString *hash = [NSMutableString string];?for (int i =0; i <16; i++){ [hash appendFormat:@"%02X", result[i]]; }return [hash uppercaseString];}?62、base64加密?@interface NSData (Base64)/** * @brief 字符串base64后轉data */+ (NSData *)dataWithBase64EncodedString:(NSString *)string{?if (![string length])?return nil; NSData *decoded = nil;#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0?if (![NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) {#pragma clang diagnostic push#pragma clang diagnostic ignored?"-Wdeprecated-declarations" decoded = [[self alloc] initWithBase64Encoding:[string stringByReplacingOccurrencesOfString:@"[^A-Za-z0-9+/=]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])]];#pragma clang diagnostic pop }?else#endif { decoded = [[self alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters]; }?return [decoded length]? decoded: nil;}/** * @brief NSData轉string * @param wrapWidth 換行長度 76 64 */- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth{?if (![self length])?return nil; NSString *encoded = nil;#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0?if (![NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)]) {#pragma clang diagnostic push#pragma clang diagnostic ignored?"-Wdeprecated-declarations" encoded = [self base64Encoding];#pragma clang diagnostic pop }?else#endif {?switch (wrapWidth) {?case?64: {?return [self base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; }?case?76: {?return [self base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; }?default: { encoded = [self base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0]; } } }?if (!wrapWidth || wrapWidth >= [encoded length]) {?return encoded; } wrapWidth = (wrapWidth /?4) *?4; NSMutableString *result = [NSMutableString?string];?for (NSUInteger i =?0; i < [encoded length]; i+= wrapWidth) {?if (i + wrapWidth >= [encoded length]) { [result appendString:[encoded substringFromIndex:i]];?break; } [result appendString:[encoded substringWithRange:NSMakeRange(i, wrapWidth)]]; [result appendString:@"/r/n"]; }?return result;}/** * @brief NSData轉string 換行長度默認64 */- (NSString *)base64EncodedString{?return [self base64EncodedStringWithWrapWidth:0];}?63、AES加密?#import?<CommonCrypto/CommonCryptor.h>@interface?NSData (AES)/** * 利用AES加密數據 */- (NSData*)encryptedWithAESUsingKey:(NSString*)key andIV:(NSData*)iv {?NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; size_t dataMoved;NSMutableData *encryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSizeAES128]; CCCryptorStatus status = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,encryptedData.mutableBytes, encryptedData.length,&;dataMoved);?if (status == kCCSuccess) { encryptedData.length = dataMoved;?return encryptedData; }?return?nil;}/** * @brief 利用AES解密據 */- (NSData*)decryptedWithAESUsingKey:(NSString*)key andIV:(NSData*)iv {?NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; size_t dataMoved;NSMutableData *decryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSizeAES128]; CCCryptorStatus result = CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,decryptedData.mutableBytes, decryptedData.length,&;dataMoved);?if (result == kCCSuccess) { decryptedData.length = dataMoved;?return decryptedData; }?return?nil;}?64、3DES加密?#import?<CommonCrypto/CommonCryptor.h>@interface?NSData (3DES)/** * 利用3DES加密數據 */- (NSData*)encryptedWith3DESUsingKey:(NSString*)key andIV:(NSData*)iv {?NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; size_t dataMoved;NSMutableData *encryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSize3DES]; CCCryptorStatus result = CCCrypt(kCCEncrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,encryptedData.mutableBytes,encryptedData.length,&;dataMoved);?if (result == kCCSuccess) { encryptedData.length = dataMoved;?return encryptedData; }?return?nil;}/** * @brief 利用3DES解密數據 */- (NSData*)decryptedWith3DESUsingKey:(NSString*)key andIV:(NSData*)iv {?NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; size_t dataMoved;NSMutableData *decryptedData = [NSMutableData dataWithLength:self.length + kCCBlockSize3DES]; CCCryptorStatus result = CCCrypt(kCCDecrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,decryptedData.mutableBytes,decryptedData.length,&;dataMoved);?if (result == kCCSuccess) { decryptedData.length = dataMoved;?return decryptedData; }?return?nil;}?65、單個頁面多個網絡請求的情況,需要監聽所有網絡請求結束后刷新UIdispatch_group_t group = dispatch_group_create(); dispatch_queue_t serialQueue = dispatch_queue_create("com.wzb.test.www", DISPATCH_QUEUE_SERIAL); dispatch_group_enter(group); dispatch_group_async(group, serialQueue, ^{ // 網絡請求一 [WebClick getDataSuccess:^(ResponseModel *model) { dispatch_group_leave(group); } failure:^(NSString *err) { dispatch_group_leave(group); }]; }); dispatch_group_enter(group); dispatch_group_async(group, serialQueue, ^{ // 網絡請求二 [WebClick getDataSuccess:getBigTypeRM onSuccess:^(ResponseModel *model) { dispatch_group_leave(group); } failure:^(NSString *errorString) { dispatch_group_leave(group); }]; }); dispatch_group_enter(group); dispatch_group_async(group, serialQueue, ^{ // 網絡請求三 [WebClick getDataSuccess:^{ dispatch_group_leave(group); } failure:^(NSString *errorString) { dispatch_group_leave(group); }]; }); // 所有網絡請求結束后會來到這個方法 dispatch_group_notify(group, serialQueue, ^{ dispatch_async(dispatch_get_global_queue(0, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ // 刷新UI }); }); });?66、解決openUrl延時問題?// 方法一dispatch_async(dispatch_get_main_queue(), ^{ UIApplication *application = [UIApplication sharedApplication];?if ([application?respondsToSelector:@selector(openURL:options:completionHandler:)]) { [application?openURL:URL?options:@{}?completionHandler:nil]; }?else { [application?openURL:URL]; } });// 方法二[self?performSelector:@selector(redirectToURL:)?withObject:url?afterDelay:0.1];- (void) redirectToURL{UIApplication *application = [UIApplication sharedApplication];?if ([application?respondsToSelector:@selector(openURL:options:completionHandler:)]) { [application?openURL:URL?options:@{}?completionHandler:nil]; }?else { [application?openURL:URL]; }}?67、頁面跳轉實現翻轉動畫?// modal方式 TestViewController *vc = [[TestViewController alloc] init]; vc.view.backgroundColor = [UIColor redColor]; vc.modalTransitionStyle =?UIModalTransitionStyleCoverVertical; [self presentViewController:vc animated:YES completion:nil];// push方式 TestViewController *vc = [[TestViewController alloc] init]; vc.view.backgroundColor = [UIColor redColor]; [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.80]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO]; [self.navigationController pushViewController:vc animated:YES]; [UIView commitAnimations];?68、tableView實現無限滾動?- (void)scrollViewDidScroll:(UIScrollView *)scrollView{CGFloat actualPosition = scrollView.contentOffset.y;?CGFloat contentHeight = scrollView.contentSize.height - scrollView.frame.size.height;?if (actualPosition >= contentHeight) { [self.dataArr addObjectsFromArray:self.dataArr]; [self.tableView reloadData]; }}?69、代碼方式調整屏幕亮度?// brightness屬性值在0-1之間,0代表最小亮度,1代表最大亮度[[UIScreen mainScreen]?setBrightness:0.5];?70、獲取當前應用CUP用量?float?cpu_usage(){kern_return_t kr;?task_info_data_t tinfo;?mach_msg_type_number_t task_info_count; task_info_count = TASK_INFO_MAX; kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &;task_info_count);?if (kr != KERN_SUCCESS) {?return?-1; }?task_basic_info_t basic_info;?thread_array_t thread_list;?mach_msg_type_number_t thread_count;?thread_info_data_t thinfo;?mach_msg_type_number_t thread_info_count;?thread_basic_info_t basic_info_th;?uint32_t stat_thread =?0;?// Mach threads basic_info = (task_basic_info_t)tinfo;?// get threads in the task kr = task_threads(mach_task_self(), &;thread_list, &;thread_count);?if (kr != KERN_SUCCESS) {?return?-1; }?if (thread_count >?0) stat_thread += thread_count;?long tot_sec =?0;?long tot_usec =?0;?float tot_cpu =?0;?int j;?for (j =?0; j < (int)thread_count; j++) { thread_info_count = THREAD_INFO_MAX; kr = thread_info(thread_list[j], THREAD_BASIC_INFO, (thread_info_t)thinfo, &;thread_info_count);?if (kr != KERN_SUCCESS) {?return?-1; } basic_info_th = (thread_basic_info_t)thinfo;?if (!(basic_info_th->flags &; TH_FLAGS_IDLE)) { tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds; tot_usec = tot_usec + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds; tot_cpu = tot_cpu + basic_info_th->cpu_usage / (float)TH_USAGE_SCALE *?100.0; } }?// for each thread kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count *?sizeof(thread_t)); assert(kr == KERN_SUCCESS);?return tot_cpu;}?71、float數據取整四舍五入?CGFloat f =?4.65; NSLog(@"%d", (int)f); // 打印結果4 CGFloat f =?4.65; NSLog(@"%d", (int)round(f)); // 打印結果5?72、刪除UISearchBar系統默認邊框?// 方法一 searchBar.searchBarStyle =?UISearchBarStyleMinimal;?// 方法二 [searchBar setBackgroundImage:[[UIImage alloc]init]];?// 方法三 searchBar.barTintColor = [UIColor whiteColor];?73、為UICollectionViewCell設置圓角和陰影cell.contentView.layer.cornerRadius =?2.0f;cell.contentView.layer.borderWidth =?1.0f;cell.contentView.layer.borderColor = [UIColor clearColor].CGColor;cell.contentView.layer.masksToBounds = YES;cell.layer.shadowColor = [UIColor lightGrayColor].CGColor;cell.layer.shadowOffset = CGSizeMake(0,?2.0f);cell.layer.shadowRadius =?2.0f;cell.layer.shadowOpacity =?1.0f;cell.layer.masksToBounds = NO;cell.layer.shadowPath = [UIBezierPath?bezierPathWithRoundedRect:cell.bounds cornerRadius:cell.contentView.layer.cornerRadius].CGPath;?74、讓正在滑動的scrollView停止滾動(不是禁止,而是暫時停止滾動)?[scrollView setContentOffset:scrollView.contentOffset animated:NO];?75、使用xib設置UIView的邊框、圓角
圓角和邊框看下圖即可設置
xib設置圓角邊框.png
但是增加layer.borderColor的keyPath設置邊框顏色并不能起作用,后來查了資料,這里應該用layer.borderUIColor,但是這里設置的顏色不起作用,無論設置什么顏色顯示出來的都是黑色的。后來又去查了下,有種解決方案是給CALayer添加一個分類,提供一個?- (void)setBorderUIColor:(UIColor *)color;方法就可以解決了,實現如下:
?
xib設置邊框顏色.png?#import?"CALayer+BorderColor.h"@implementation?CALayer (BorderColor)- (void)setBorderUIColor:(UIColor *)color{self.borderColor = color.CGColor;}?76、根據經緯度獲取城市等信息?// 創建經緯度?CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];?//創建一個譯碼器?CLGeocoder *cLGeocoder = [[CLGeocoder alloc] init]; [cLGeocoder reverseGeocodeLocation:userLocation completionHandler:^(NSArray *placemarks,?NSError *error) {?CLPlacemark *place = [placemarks objectAtIndex:0];?// 位置名NSLog(@"name,%@",place.name);?// 街道NSLog(@"thoroughfare,%@",place.thoroughfare);?// 子街道NSLog(@"subThoroughfare,%@",place.subThoroughfare);?// 市NSLog(@"locality,%@",place.locality);?// 區NSLog(@"subLocality,%@",place.subLocality);?// 國家NSLog(@"country,%@",place.country); } }];/* CLPlacemark中屬性含義name 地名thoroughfare 街道subThoroughfare 街道相關信息,例如門牌等locality 城市subLocality 城市相關信息,例如標志性建筑administrativeArea 直轄市subAdministrativeArea 其他行政區域信息(自治區等)postalCode 郵編ISOcountryCode 國家編碼country 國家inlandWater 水源,湖泊ocean 海洋areasOfInterest 關聯的或利益相關的地標*/?77、如何防止添加多個NSNotification觀察者??// 解決方案就是添加觀察者之前先移除下這個觀察者[[NSNotificationCenter defaultCenter]?removeObserver:observer?name:name?object:object];?[[NSNotificationCenter defaultCenter]?addObserver:observer?selector:selector?name:name?object:object];?78、將一個xib添加到另外一個xib上?// 假設你的自定義view名字為CustomView,你需要在CustomView.m中重寫 `- (instancetype)initWithCoder:(NSCoder *)aDecoder` 方法,代碼如下:- (instancetype)initWithCoder:(NSCoder *)aDecoder {?if ((self = [super initWithCoder:aDecoder])) { [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0]]; }return?self;}
將一個xib添加到另外一個xib上.png?79、處理字符串,使其首字母大寫?NSString *str =?@"abcdefghijklmn"; NSString *resultStr;?if (str &;&;?str.length >?0) { resultStr = [str?stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[str?substringToIndex:1] capitalizedString]]; } NSLog(@"%@", resultStr);?80、判斷一個UIAlertView/UIAlertController是否顯示?// UIAlertView自帶屬性if (alert.visible){?NSLog(@"顯示了");}?else {?NSLog(@"未顯示");}// UIAlertController沒有visible屬性,需要自己判斷,添加一個全局變量 BOOL visibleUIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];?UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"ActionTitle" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {?self.visible =?NO; }];?UIAlertAction *calcelAction = [UIAlertAction actionWithTitle:@"calcelTitle" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {self.visible =?NO; }]; [alertController addAction:alertAction]; [alertController addAction:calcelAction]; [self presentViewController:alertController animated:YES completion:^{?self.visible =?YES; }];?81、獲取字符串中的數字?- (NSString *)getNumberFromStr:(NSString *)str{?NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];?return [[str componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];}?NSLog(@"%@", [self getNumberFromStr:@"a0b0c1d2e3f4fda8fa8fad9fsad23"]);?// 0012348892382、為UIView的某個方向添加邊框?// 添加UIView分類// UIView+WZB.h#import <UIKit/UIKit.h>/** 邊框方向 - WZBBorderDirectionTop: 頂部 - WZBBorderDirectionLeft: 左邊 - WZBBorderDirectionBottom: 底部 - WZBBorderDirectionRight: 右邊 */typedef NS_ENUM(NSInteger, WZBBorderDirectionType) { WZBBorderDirectionTop =?0, WZBBorderDirectionLeft, WZBBorderDirectionBottom, WZBBorderDirectionRight};@interface UIView (WZB)/** 為UIView的某個方向添加邊框 @param direction 邊框方向 @param color 邊框顏色 @param width 邊框寬度 */- (void)wzb_addBorder:(WZBBorderDirectionType)direction?color:(UIColor *)color?width:(CGFloat)width;@end// UIView+WZB.m#import?"UIView+WZB.h"@implementation UIView (WZB)- (void)wzb_addBorder:(WZBBorderDirectionType)direction?color:(UIColor *)color?width:(CGFloat)width{ CALayer *border = [CALayer layer]; border.backgroundColor =?color.CGColor;?switch (direction) {?case WZBBorderDirectionTop: { border.frame = CGRectMake(0.0f,?0.0f, self.bounds.size.width,?width); }?break;case WZBBorderDirectionLeft: { border.frame = CGRectMake(0.0f,?0.0f,?width, self.bounds.size.height); }?break;?case WZBBorderDirectionBottom: { border.frame = CGRectMake(0.0f, self.bounds.size.height -?width, self.bounds.size.width,?width); }?break;?case WZBBorderDirectionRight: { border.frame = CGRectMake(self.bounds.size.width -?width,?0,?width, self.bounds.size.height); }?break;?default:?break; } [self.layer addSublayer:border];}?83、通過屬性設置UISwitch、UIProgressView等控件的寬高?mySwitch.transform = CGAffineTransformMakeScale(5.0f, 5.0f);progressView.transform = CGAffineTransformMakeScale(5.0f, 5.0f);84、自動搜索功能,用戶連續輸入的時候不搜索,用戶停止輸入的時候自動搜索(我這里設置的是0.5s,可根據需求更改)?// 輸入框文字改變的時候調用-(void)searchBar:(UISearchBar *)searchBar?textDidChange:(NSString *)searchText{?// 先取消調用搜索方法 [NSObject?cancelPreviousPerformRequestsWithTarget:self?selector:@selector(searchNewResult)?object:nil];?// 0.5秒后調用搜索方法 [self?performSelector:@selector(searchNewResult)?withObject:nil?afterDelay:0.5];}85、修改UISearchBar的占位文字顏色?// 方法一(推薦使用)?UITextField *searchField = [searchBar valueForKey:@"_searchField"]; [searchField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"];?// 方法二(已過期) [[UILabel appearanceWhenContainedIn:[UISearchBar?class],?nil] setTextColor:[UIColor redColor]];?// 方法三(已過期)?NSDictionary *placeholderAttributes = @{NSForegroundColorAttributeName : [UIColor redColor],?NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue" size:15],};?NSAttributedString *attributedPlaceholder = [[NSAttributedString alloc] initWithString:searchBar.placeholder attributes:placeholderAttributes]; [[UITextField appearanceWhenContainedIn:[UISearchBar?class],?nil] setAttributedPlaceholder:attributedPlaceholder];?86、某個界面多個事件同時響應引起的問題(比如,兩個button同時按push到新界面,兩個都會響應,可能導致push重疊)?// UIView有個屬性叫做exclusiveTouch,設置為YES后,其響應事件會和其他view互斥(有其他view事件響應的時候點擊它不起作用)view.exclusiveTouch =?YES;// 一個一個設置太麻煩了,可以全局設置[[UIView appearance] setExclusiveTouch:YES];// 或者只設置button[[UIButton appearance] setExclusiveTouch:YES];?87、修改tabBar的frame?// 子類化UITabBarViewController,我這里以修改tabBar高度為例,重寫viewWillLayoutSubviews方法#import?"WZBTabBarViewController.h"@interface?WZBTabBarViewController ()@end@implementation?WZBTabBarViewController- (void)viewWillLayoutSubviews {?CGRect tabFrame =?self.tabBar.frame; tabFrame.size.height =?100; tabFrame.origin.y =?self.view.frame.size.height -?100;?self.tabBar.frame = tabFrame;}@end?88、修改鍵盤背景顏色?// 設置某個鍵盤顏色 textField.keyboardAppearance =?UIKeyboardAppearanceAlert;// 設置工程中所有鍵盤顏色[[UITextField appearance] setKeyboardAppearance:UIKeyboardAppearanceAlert];?89、修改image顏色?UIImage *image = [UIImage imageNamed:@"test"]; imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];?CGRect rect =?CGRectMake(0,?0, image.size.width, image.size.height);UIGraphicsBeginImageContext(rect.size);?CGContextRef context =?UIGraphicsGetCurrentContext();?CGContextClipToMask(context, rect, image.CGImage);?CGContextSetFillColorWithColor(context, [[UIColor redColor]?CGColor]);?CGContextFillRect(context, rect);?UIImage *img =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?UIImage *flippedImage = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation:?UIImageOrientationDownMirrored]; imageView.image = flippedImage;?90、動畫執行removeFromSuperview?[UIView animateWithDuration:0.2 animations:^{ view.alpha = 0.0f; } completion:^(BOOL finished){ [view removeFromSuperview]; }];?91、啟動頁顯示延時?- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{// 延時10s sleep(10);?return?YES;}?92、設置UIButton高亮時的背景顏色?// 方法一、子類化UIButton,重寫setHighlighted:方法,代碼如下#import?"WZBButton.h"@implementation?WZBButton- (void)setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted];?UIColor *normalColor = [UIColor greenColor];?UIColor *highlightedColor = [UIColor redColor];self.backgroundColor = highlighted ? highlightedColor : normalColor;}// 方法二、利用setBackgroundImage:forState:方法[button setBackgroundImage:[self imageWithColor:[UIColor blueColor]] forState:UIControlStateHighlighted];- (UIImage *)imageWithColor:(UIColor *)color {?CGRect rect =?CGRectMake(0.0f,?0.0f,?1.0f,?1.0f);?UIGraphicsBeginImageContext(rect.size);CGContextRef context =?UIGraphicsGetCurrentContext();CGContextSetFillColorWithColor(context, [color?CGColor]);CGContextFillRect(context, rect);?UIImage *image =?UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();?return image;}?93、關于圖片拉伸
推薦看這個博客,講的很詳細http://blog.csdn.net/q199109106q/article/details/8615661
94、利用runtime獲取一個類所有屬性?- (NSArray *)allPropertyNames:(Class)aClass{ unsigned count; objc_property_t *properties = class_copyPropertyList(aClass,?&;count); NSMutableArray *rv = [NSMutableArray array]; unsigned i; for (i = 0; i < count; i++) { objc_property_t property = properties[i]; NSString *name = [NSString stringWithUTF8String:property_getName(property)]; [rv addObject:name]; } free(properties); return rv;}?95、設置textView的某段文字變成其他顏色?- (void)setupTextView:(UITextView *)textView?text:(NSString *)text?color:(UIColor *)color { NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:textView.text]; [string addAttribute:NSForegroundColorAttributeName value:color range:[textView.text rangeOfString:text]]; [textView setAttributedText:string];}?96、讓push跳轉動畫像modal跳轉動畫那樣效果(從下往上推上來)?- (void)push{TestViewController *vc = [[TestViewController alloc] init]; vc.view.backgroundColor = [UIColor redColor]; CATransition* transition = [CATransition animation]; transition.duration =?0.4f; transition.type = kCATransitionMoveIn; transition.subtype = kCATransitionFromTop; [self.navigationController.view.layer?addAnimation:transition forKey:kCATransition]; [self.navigationController pushViewController:vc animated:NO];}- (void)pop{CATransition* transition = [CATransition animation]; transition.duration =?0.4f; transition.type = kCATransitionReveal; transition.subtype = kCATransitionFromBottom; [self.navigationController.view.layer?addAnimation:transition forKey:kCATransition]; [self.navigationController popViewControllerAnimated:NO];}?97、上傳圖片太大,壓縮圖片?-(UIImage *)resizeImage:(UIImage *)image{?float actualHeight =?image.size.height;?float actualWidth =?image.size.width;?float maxHeight =?300.0;?float maxWidth =?400.0;?float imgRatio = actualWidth/actualHeight;?float maxRatio = maxWidth/maxHeight;?float compressionQuality =?0.5;//50 percent compression?if (actualHeight > maxHeight || actualWidth > maxWidth) {if(imgRatio < maxRatio) {?//adjust width according to maxHeight imgRatio = maxHeight / actualHeight; actualWidth = imgRatio * actualWidth; actualHeight = maxHeight; }?else?if(imgRatio > maxRatio) {?//adjust height according to maxWidth imgRatio = maxWidth / actualWidth; actualHeight = imgRatio * actualHeight; actualWidth = maxWidth; }?else { actualHeight = maxHeight; actualWidth = maxWidth; } } CGRect?rect = CGRectMake(0.0,?0.0, actualWidth, actualHeight); UIGraphicsBeginImageContext(rect.size); [image drawInRect:rect]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality); UIGraphicsEndImageContext();?return [UIImage imageWithData:imageData];}轉載自 -?http://www.jianshu.com/u/6d5126f52682?以上是iOS 開發經驗 - 轉載的內容,更多?轉載?經驗?開發?iOS?的內容,請您使用搜索功能獲取相關信息。
總結
以上是生活随笔為你收集整理的iOS 开发经验 - 转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络原理(04741)课后习题答案
- 下一篇: 中兴笔试c语言,中兴面试C语言题1