IOS技巧匯總

1,打印View所有子視圖**

po [[self view]recursiveDescription]

2,layoutSubviews調用的調用時機

   * 當視圖第一次顯示的時候會被調用。
   * 添加子視圖也會調用這個方法。
   * 當本視圖的大小發生改變的時候是會調用的。
   * 當子視圖的frame發生改變的時候是會調用的。
   * 當刪除子視圖的時候是會調用的.

3,NSString過濾特殊字符

// 定義一個特殊字符的集合
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%-*+=_\\|~<>$€^?'@#$%^&*()_+'\""];
// 過濾字符串的特殊字符
NSString *newString = [trimString stringByTrimmingCharactersInSet:set];

4,TransForm屬性

//平移按鈕
CGAffineTransform transForm = self.buttonView.transform;
self.buttonView.transform = CGAffineTransformTranslate(transForm, 10, 0);
//旋轉按鈕
CGAffineTransform transForm = self.buttonView.transform;
self.buttonView.transform = CGAffineTransformRotate(transForm, M_PI_4);
//縮放按鈕
self.buttonView.transform = CGAffineTransformScale(transForm, 1.2, 1.2);
//初始化復位
self.buttonView.transform = CGAffineTransformIdentity;

5,去掉分割線多余15像素

首先在viewDidLoad方法加入以下代碼: 
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { 
[self.tableView setSeparatorInset:UIEdgeInsetsZero]; 
} 
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) { 
[self.tableView setLayoutMargins:UIEdgeInsetsZero];}
然后在重寫willDisplayCell方法
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { 
[cell setSeparatorInset:UIEdgeInsetsZero];
 } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
 [cell setLayoutMargins:UIEdgeInsetsZero]; 
}}

6,計算方法耗時時間間隔

// 獲取時間間隔
#define TICK CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
#define TOCK NSLog(@"Time: %f", CFAbsoluteTimeGetCurrent() - start)

7,Color顏色宏定義

// 隨機顏色
#define RANDOM_COLOR [UIColor colorWithRed:arc4random_uniform(256) / 255.0 green:arc4random_uniform(256) / 255.0 blue:arc4random_uniform(256) / 255.0 alpha:1]
// 顏色(RGB)
#define RGBCOLOR(r, g, b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
// 利用這種方法設置顏色和透明值,可不影響子視圖背景色
#define RGBACOLOR(r, g, b, a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]

8,Alert提示宏定義

#define Alert(_S_, ...) [[[UIAlertView alloc] initWithTitle:@"提示" message:[NSString stringWithFormat:(_S_), ##__VA_ARGS__] delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil] show]

8,讓 iOS 應用直接退出

- (void)exitApplication { 
AppDelegate *app = [UIApplication sharedApplication].delegate; 
UIWindow *window = app.window; 
[UIView animateWithDuration:1.0f animations:^{ 
window.alpha = 0;
 } completion:^(BOOL finished) {
 exit(0);
 }];}

**8,NSArray 快速求總和 最大值 最小值 和 平均值 **

NSArray *array = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", @"10", nil];
CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
NSLog(@"%f\n%f\n%f\n%f",sum,avg,max,min);

9,修改Label中不同文字顏色

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
[self editStringColor:self.label.text editStr:@"好" color:[UIColor blueColor]];
}
- (void)editStringColor:(NSString *)string editStr:(NSString *)editStr color:(UIColor *)color { 
// string為整體字符串, editStr為需要修改的字符串 
NSRange range = [string rangeOfString:editStr]; 
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:string]; 
// 設置屬性修改字體顏色UIColor與大小UIFont
 [attribute addAttributes:@{NSForegroundColorAttributeName:color} range:range];
 self.label.attributedText = attribute;
}

10,播放聲音

#import<AVFoundation/AVFoundation.h> 
// 1.獲取音效資源的路徑 
NSString *path = [[NSBundle mainBundle]pathForResource:@"pour_milk" ofType:@"wav"]; 
// 2.將路勁轉化為
url NSURL *tempUrl = [NSURL fileURLWithPath:path]; 
// 3.用轉化成的url創建一個播放器 
NSError *error = nil; AVAudioPlayer *play = [[AVAudioPlayer alloc]initWithContentsOfURL:tempUrl error:&error]; self.player = play; 
// 4.播放
 [play play];

11,檢測是否IPad Pro和其它設備型號

- (BOOL)isIpadPro{ UIScreen *Screen = [UIScreen mainScreen]; 
CGFloat width = Screen.nativeBounds.size.width/Screen.nativeScale; 
CGFloat height = Screen.nativeBounds.size.height/Screen.nativeScale; 
BOOL isIpad =[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
 BOOL hasIPadProWidth = fabs(width - 1024.f) < DBL_EPSILON;
 BOOL hasIPadProHeight = fabs(height - 1366.f) < DBL_EPSILON; 
return isIpad && hasIPadProHeight && hasIPadProWidth;}
#define UI_IS_LANDSCAPE ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft || [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight)
#define UI_IS_IPAD ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
#define UI_IS_IPHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define UI_IS_IPHONE4 (UI_IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0)
#define UI_IS_IPHONE5 (UI_IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define UI_IS_IPHONE6 (UI_IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define UI_IS_IPHONE6PLUS (UI_IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0 || [[UIScreen mainScreen] bounds].size.width == 736.0) 
// Both orientations
#define UI_IS_IOS8_AND_HIGHER ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
文/Originalee(簡書作者)原文鏈接:http://www.lxweimin.com/p/9d36aa12429f著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

11,修改Tabbar Item的屬性

// 修改標題位置
 self.tabBarItem.titlePositionAdjustment = UIOffsetMake(0, -10);
 // 修改圖片位置
 self.tabBarItem.imageInsets = UIEdgeInsetsMake(-3, 0, 3, 0);
 // 批量修改屬性 
for (UIBarItem *item in self.tabBarController.tabBar.items) {
 [item setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"Helvetica" size:19.0], NSFontAttributeName, nil] forState:UIControlStateNormal]; 
} 
// 設置選中和未選中字體顏色
 [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
 //未選中字體顏色
 [[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} forState:UIControlStateNormal];
 //選中字體顏色 
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor cyanColor]} forState:UIControlStateSelected];

12,NULL - nil - Nil - NSNULL的區別

* nil是OC的,空對象,地址指向空(0)的對象。對象的字面零值
* Nil是Objective-C類的字面零值
* NULL是C的,空地址,地址的數值是0,是個長整數
* NSNull用于解決向NSArray和NSDictionary等集合中添加空值的問題

11,去掉BackBarButtonItem的文字

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

12,控件不能交互的一些原因

1,控件的userInteractionEnabled = NO
2,透明度小于等于0.01,aplpha
3,控件被隱藏的時候,hidden = YES
4,子視圖的位置超出了父視圖的有效范圍,子視圖無法交互,設置了。
5,需要交互的視圖,被其他視圖蓋住(其他視圖開啟了用戶交互)。

12,修改UITextField中Placeholder的文字顏色

[text setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];}

13,視圖的生命周期

1、 alloc 創建對象,分配空間
2、 init (initWithNibName) 初始化對象,初始化數據
3、 loadView 從nib載入視圖 ,除非你沒有使用xib文件創建視圖
4、 viewDidLoad 載入完成,可以進行自定義數據以及動態創建其他控件
5、 viewWillAppear視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了
6、 viewDidAppear 視圖已在屏幕上渲染完成
1、viewWillDisappear 視圖將被從屏幕上移除之前執行
2、viewDidDisappear 視圖已經被從屏幕上移除,用戶看不到這個視圖了
3、dealloc 視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放.
viewVillUnload- 當內存過低,即將釋放時調用;
viewDidUnload-當內存過低,釋放一些不需要的視圖時調用。

14,應用程序的生命周期

1,啟動但還沒進入狀態保存 :
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
2,基本完成程序準備開始運行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
3,當應用程序將要入非活動狀態執行,應用程序不接收消息或事件,比如來電話了:
- (void)applicationWillResignActive:(UIApplication *)application
4,當應用程序入活動狀態執行,這個剛好跟上面那個方法相反:
- (void)applicationDidBecomeActive:(UIApplication *)application 
5,當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可:
- (void)applicationDidEnterBackground:(UIApplication *)application 
6,當程序從后臺將要重新回到前臺時候調用,這個剛好跟上面的那個方法相反:
- (void)applicationWillEnterForeground:(UIApplication *)application 
7,當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作:
- (void)applicationWillTerminate:(UIApplication *)application

15,判斷view是不是指定視圖的子視圖

BOOL isView = [textView isDescendantOfView:self.view];

16,判斷對象是否遵循了某協議

if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)]) {
 [self.selectedController performSelector:@selector(onTriggerRefresh)];
}

17,頁面強制橫屏

#pragma mark - 強制橫屏代碼
- (BOOL)shouldAutorotate{ 
//是否支持轉屏
  return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ 
//支持哪些轉屏方向 
 return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ 
return UIInterfaceOrientationLandscapeRight;
}
- (BOOL)prefersStatusBarHidden{
 return NO;
}

18,系統鍵盤通知消息

1、UIKeyboardWillShowNotification-將要彈出鍵盤
2、UIKeyboardDidShowNotification-顯示鍵盤
3、UIKeyboardWillHideNotification-將要隱藏鍵盤
4、UIKeyboardDidHideNotification-鍵盤已經隱藏
5、UIKeyboardWillChangeFrameNotification-鍵盤將要改變frame
6、UIKeyboardDidChangeFrameNotification-鍵盤已經改變frame

19,關閉navigationController的滑動返回手勢

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

20,設置狀態欄背景為任意的顏色

- (void)setStatusColor{
 UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 20)];
 statusBarView.backgroundColor = [UIColor orangeColor]; 
[self.view addSubview:statusBarView];
}

21,讓Xcode的控制臺支持LLDB類型的打印

打開終端輸入三條命令: 
touch ~/.lldbinit 
echo display @import UIKit >> ~/.lldbinit 
echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit

下次重新運行項目,然后就不報錯了。
![Uploading 790890-f3e134d18e165916_002997.png . . .]

22,Label行間距

-(void)test{
 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.contentLabel.text]; 
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineSpacing:3]; 
//調整行間距 
 [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [self.contentLabel.text length])]; 
self.contentLabel.attributedText = attributedString;
}

23,UIImageView填充模式

@"UIViewContentModeScaleToFill", // 拉伸自適應填滿整個視圖 
@"UIViewContentModeScaleAspectFit", // 自適應比例大小顯示 
@"UIViewContentModeScaleAspectFill", // 原始大小顯示 
@"UIViewContentModeRedraw", // 尺寸改變時重繪 @"UIViewContentModeCenter", // 中間 @"UIViewContentModeTop", // 頂部
@"UIViewContentModeBottom", // 底部
@"UIViewContentModeLeft", // 中間貼左 
@"UIViewContentModeRight", // 中間貼右 
@"UIViewContentModeTopLeft", // 貼左上 
@"UIViewContentModeTopRight", // 貼右上 
@"UIViewContentModeBottomLeft", // 貼左下 
@"UIViewContentModeBottomRight", // 貼右下

24,宏定義檢測block是否可用

#define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); };
 // 宏定義之前的用法
 if (completionBlock) { 
completionBlock(arg1, arg2);
 }
 // 宏定義之后的用法
 BLOCK_EXEC(completionBlock, arg1, arg2);

25,Debug欄打印時自動把Unicode編碼轉化成漢字

// 有時候我們在xcode中打印中文,會打印出Unicode編碼,還需要自己去一些在線網站轉換,有了插件就方便多了。 DXXcodeConsoleUnicodePlugin 插件

26,設置狀態欄文字樣式顏色

  [[UIApplication sharedApplication] setStatusBarHidden:NO];
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

26,自動生成模型代碼的插件

// 可自動生成模型的代碼,省去寫模型代碼的時間ESJsonFormat-for-Xcode

27,iOS中的一些手勢

輕擊手勢(TapGestureRecognizer)
輕掃手勢(SwipeGestureRecognizer)
長按手勢(LongPressGestureRecognizer)
拖動手勢(PanGestureRecognizer)
捏合手勢(PinchGestureRecognizer)
旋轉手勢(RotationGestureRecognizer)

27,iOS 開發中一些相關的路徑

模擬器的位置:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs 
文檔安裝位置:/Applications/Xcode.app/Contents/Developer/Documentation/DocSets
插件保存路徑:~/Library/ApplicationSupport/Developer/Shared/Xcode/Plug-ins
自定義代碼段的保存路徑:~/Library/Developer/Xcode/UserData/CodeSnippets/ 
如果找不到CodeSnippets文件夾,可以自己新建一個CodeSnippets文件夾。
證書路徑~/Library/MobileDevice/Provisioning Profiles

28,獲取 iOS 路徑的方法

獲取家目錄路徑的函數NSString *homeDir = NSHomeDirectory();
獲取Documents目錄路徑的方法
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *docDir = [paths objectAtIndex:0];
獲取Documents目錄路徑的方法
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
獲取tmp目錄路徑的方法:NSString *tmpDir = NSTemporaryDirectory();

**29,字符串相關操作 **

去除所有的空格[str stringByReplacingOccurrencesOfString:@" " withString:@""]
去除首尾的空格[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
- (NSString *)uppercaseString; 全部字符轉為大寫字母
- (NSString *)lowercaseString 全部字符轉為小寫字母

30, CocoaPods pod install/pod update更新慢的問題

pod install --verbose --no-repo-update 
pod update --verbose --no-repo-update如果不加后面的參數,默認會升級CocoaPods的spec倉庫,加一個參數可以省略這一步,然后速度就會提升不少。

31,MRC和ARC混編設置方式

在XCode中targets的build phases選項下Compile Sources下選擇 不需要arc編譯的文件雙擊輸入 -fno-objc-arc 即可MRC工程中也可以使用ARC的類,方法如下:在XCode中targets的build phases選項下Compile Sources下選擇要使用arc編譯的文件雙擊輸入 -fobjc-arc 即可

32,把tableview里cell的小對勾的顏色改成別的顏色

_mTableView.tintColor = [UIColor redColor];

33,調整tableview的separaLine線的位置

tableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);

34,設置滑動的時候隱藏navigationbar

navigationController.hidesBarsOnSwipe = Yes

35,自動處理鍵盤事件,實現輸入框防遮擋的插件

IQKeyboardManagerhttps://github.com/hackiftekhar/IQKeyboardManager

36,Quartz2D相關

圖形上下是一個CGContextRef類型的數據。圖形上下文包含:
1,繪圖路徑(各種各樣圖形)
2,繪圖狀態(顏色,線寬,樣式,旋轉,縮放,平移)
3,輸出目標(繪制到什么地方去?UIView、圖片)
1,獲取當前圖形上下文CGContextRef ctx = UIGraphicsGetCurrentContext();
2,添加線條CGContextMoveToPoint(ctx, 20, 20);
3,渲染CGContextStrokePath(ctx);CGContextFillPath(ctx);
4,關閉路徑CGContextClosePath(ctx);
5,畫矩形CGContextAddRect(ctx, CGRectMake(20, 20, 100, 120));
6,設置線條顏色[[UIColor redColor] setStroke];
7, 設置線條寬度CGContextSetLineWidth(ctx, 20);
8,設置頭尾樣式CGContextSetLineCap(ctx, kCGLineCapSquare);
9,設置轉折點樣式CGContextSetLineJoin(ctx, kCGLineJoinBevel);
10,畫圓CGContextAddEllipseInRect(ctx, CGRectMake(30, 50, 100, 100));
11,指定圓心CGContextAddArc(ctx, 100, 100, 50, 0, M_PI * 2, 1);
12,獲取圖片上下文UIGraphicsGetImageFromCurrentImageContext();
13,保存圖形上下文CGContextSaveGState(ctx)
14,恢復圖形上下文CGContextRestoreGState(ctx)

37,屏幕截圖

1. 開啟一個與圖片相關的圖形上下文 UIGraphicsBeginImageContextWithOptions(self.view.bounds.size,NO,0.0); 
2. 獲取當前圖形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); 
 3. 獲取需要截取的view的layer [self.view.layer renderInContext:ctx]; 
4. 從當前上下文中獲取圖片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
5. 關閉圖形上下文 UIGraphicsEndImageContext(); 
6. 把圖片保存到相冊 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

37,左右抖動動畫

//1, 創建核心動畫
CAKeyframeAnimation *keyAnima = [CAKeyframeAnimation animation]; 
//2, 告訴系統執行什么動畫。
keyAnima.keyPath = @"transform.rotation"; 
keyAnima.values = @[@(-M_PI_4 /90.0 * 5),@(M_PI_4 /90.0 * 5),@(-M_PI_4 /90.0 * 5)]; 
// 3, 執行完之后不刪除動畫 
keyAnima.removedOnCompletion = NO; 
// 4, 執行完之后保存最新的狀態 
keyAnima.fillMode = kCAFillModeForwards;
 // 5, 動畫執行時間 
keyAnima.duration = 0.2; 
// 6, 設置重復次數。
 keyAnima.repeatCount = MAXFLOAT;
 // 7, 添加核心動畫 
[self.iconView.layer addAnimation:keyAnima forKey:nil];

38,CALayer 的知識

CALayer 負責視圖中顯示內容和動畫UIView 負責監聽和響應事件創建UIView對象時,UIView內部會自動創建一個圖層(既CALayer)UIView本身不具備顯示的功能,是它內部的層才有顯示功能.CALayer屬性:position 中點(由anchorPoint決定)anchorPoint 錨點borderColor 邊框顏色borderWidth 邊框寬度cornerRadius 圓角半徑shadowColor 陰影顏色contents 內容opacity 透明度shadowOpacity 偏移shadowRadius 陰影半徑shadowColor 陰影顏色masksToBounds 裁剪

39,性能相關

1. 視圖復用,比如UITableViewCell,UICollectionViewCell.
2. 數據緩存,比如用SDWebImage實現圖片緩存。
3. 任何情況下都不能堵塞主線程,把耗時操作盡量放到子線程。
4. 如果有多個下載同時并發,可以控制并發數。5. 在合適的地方盡量使用懶加載。
6. 重用重大開銷對象,比如:NSDateFormatter、NSCalendar。
7. 選擇合適的數據存儲。
8. 避免循環引用。避免delegate用retain、strong修飾,block可能導致循環引用,NSTimer也可能導致內存泄露等。
9. 當涉及到定位的時候,不用的時候最好把定位服務關閉。因為定位耗電、流量。
10. 加鎖對性能有重大開銷。
11. 界面最好不要添加過多的subViews.
12. TableView 如果不同行高,那么返回行高,最好做緩存。
13. Viewdidload 里盡量不要做耗時操作。

40,驗證身份證號碼

//驗證身份證號碼
- (BOOL)checkIdentityCardNo:(NSString*)cardNo{ 
if (cardNo.length != 18) {
 return NO; 
} 
NSArray* codeArray = [NSArray arrayWithObjects:@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",@"6",@"3",@"7",@"9",@"10",@"5",@"8",@"4",@"2", nil];
 NSDictionary* checkCodeDic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"0",@"X",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2", nil] forKeys:[NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10", nil]]; 
NSScanner* scan = [NSScanner scannerWithString:[cardNo substringToIndex:17]]; 
int val;
 BOOL isNum = [scan scanInt:&val] && [scan isAtEnd]; 
if (!isNum) { 
return NO; }
 int sumValue = 0; 
for (int i =0; i<17; i++) { 
sumValue+=[[cardNo substringWithRange:NSMakeRange(i , 1) ] intValue]* [[codeArray objectAtIndex:i] intValue];
 } 
NSString* strlast = [checkCodeDic objectForKey:[NSString stringWithFormat:@"%d",sumValue%11]];
 if ([strlast isEqualToString: [[cardNo substringWithRange:NSMakeRange(17, 1)]uppercaseString]]) { 
return YES;
 } 
return NO;}

41,響應者鏈條順序

1> 當應用程序啟動以后創建 UIApplication 對象
2> 然后啟動“消息循環”監聽所有的事件
3> 當用戶觸摸屏幕的時候, "消息循環"監聽到這個觸摸事件
4> "消息循環" 首先把監聽到的觸摸事件傳遞了 UIApplication 對象
5> UIApplication 對象再傳遞給 UIWindow 對象
6> UIWindow 對象再傳遞給 UIWindow 的根控制器(rootViewController)
7> 控制器再傳遞給控制器所管理的 view
8> 控制器所管理的 View 在其內部搜索看本次觸摸的點在哪個控件的范圍內(調用Hit test檢測是否在這個范圍內)
9> 找到某個控件以后(調用這個控件的 touchesXxx 方法), 再一次向上返回, 最終返回給"消息循環"
10> "消息循環"知道哪個按鈕被點擊后, 在搜索這個按鈕是否注冊了對應的事件, 如果注冊了, 那么就調用這個"事件處理"程序。(一般就是執行控制器中的"事件處理"方法)

42,使用函數式指針執行方法和忽略performSelector方法的時候警告

不帶參數的:
SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);
帶參數的:
SEL selector = NSSelectorFromString(@"processRegion:ofView:");
IMP imp = [_controller methodForSelector:selector];
CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
CGRect result = func(_controller, selector, someRect, someView);
忽略警告:
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" [someController performSelector: NSSelectorFromString(@"someMethod")]
#pragma clang diagnostic pop
如果需要忽視的警告有多處,可以定義一個宏:
#define SuppressPerformSelectorLeakWarning(Stuff) \ 
 do {\ 
_Pragma("clang diagnostic push") 
\ _Pragma("clang diagnostic ignored 
\"-Warc-performSelector-leaks\"") 
\ Stuff;
 \ _Pragma("clang diagnostic pop") \ 
} while (0)
使用方法:SuppressPerformSelectorLeakWarning( [_target performSelector:_action withObject:self]);

43,UIApplication的簡單使用

--------設置角標數字--------
 //獲取UIApplication對象 UIApplication *ap = [UIApplication sharedApplication]; 
//在設置之前, 要注冊一個通知,從ios8之后,都要先注冊一個通知對象.才能夠接收到提醒.
 UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; 
//注冊通知對象
 [ap registerUserNotificationSettings:notice]; 
//設置提醒數字 
ap.applicationIconBadgeNumber = 20;
--------設置聯網狀態--------
 UIApplication *ap = [UIApplication sharedApplication]; ap.networkActivityIndicatorVisible = YES;
--------------------------

44, UITableView隱藏空白部分線條

self.tableView.tableFooterView = [[UIView alloc]init];

45,顯示git增量的Xcode插件:GitDiff
下載地址:https://github.com/johnno1962/GitDiff這款插件的名字是GitDiff,作用就是可以顯示表示出git增量提交的代碼行,比如下圖會在Xcode左邊標識出來:

46,各種收藏的網址

unicode編碼轉換http://tool.chinaz.com/tools/unicode.aspx 
JSON 字符串格式化http://www.runoob.com/jsontool
RGB 顏色值轉換http://www.sioe.cn/yingyong/yanse-rgb-16/
短網址生成http://dwz.wailian.work/MAC 
軟件下載http://www.waitsun.com/objc 中國http://objccn.io/

47,NSObject 繼承圖


48,淺拷貝、深拷貝、copy和strong

淺拷貝:(任何一方的變動都會影響到另一方)只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷毀的時候,指向這片內存的幾個指針需要重新定義才可以使用。
深拷貝:(任何一方的變動都不會影響到另一方)拷貝對象的具體內容,內存地址是自主分配的,拷貝結束后,兩個對象雖然存的值是相同的,但是內存地址不一樣,兩個對象也互不影響,互不干涉。
copy和Strong的區別:copy是創建一個新對象,Strong是創建一個指針。

49,SEL 和 IMP

SEL: 其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去尋找對應的方法地址,找到方法地址后就可以調用方法。這些都是運行時特性,發消息就是發送SEL,然后根據SEL找到地址,調用方法。
IMP: 是”implementation”的縮寫,它是objetive-C 方法 (method)實現代碼塊的地址,類似函數指針,通過它可以 直接訪問任意一個方法。免去發送消息的代價。

50, self 和 super

在動態方法中,self代表著"對象"在靜態方法中,self代表著"類"萬變不離其宗,記住一句話就行了:self代表著當前方法的調用者self 和 super 是oc提供的 兩個保留字, 但有根本區別,self是類的隱藏的參數變量,指向當前調用方法的對象(類也是對象,類對象)另一個隱藏參數是_cmd,代表當前類方法的selector。super并不是隱藏的參數,它只是一個"編譯器指示符"super 就是個障眼法 發,編譯器符號, 它可以替換成 [self class],只不過 方法是從 self 的超類開始尋找。

51, 長連接 和 短連接

長連接:(長連接在沒有數據通信時,定時發送數據包(心跳),以維持連接狀態)連接→數據傳輸→保持連接(心跳)→數據傳輸→保持連接(心跳)→……→關閉連接; 
長連接:連接服務器就不斷開短連接:(短連接在沒有數據傳輸時直接關閉就行了)連接→數據傳輸→關閉連接;
短連接:連接上服務器,獲取完數據,就立即斷開。

52, HTTP 基本狀態碼

200 OK 請求已成功,請求所希望的響應頭或數據體將隨此響應返回。300 Multiple Choices 被請求的資源有一系列可供選擇的回饋信息,每個都有自己特定的地址和瀏覽器驅動的商議信息。用戶或瀏覽器能夠自行選擇一個首選的地址進行重定向。400 Bad Request 由于包含語法錯誤,當前請求無法被服務器理解。除非進行修改,否則客戶端不應該重復提交這個請求。404 Not Found 請求失敗,請求所希望得到的資源未被在服務器上發現。沒有信息能夠告訴用戶這個狀況到底是暫時的還是永久的。假如服務器知道情況的話,應當使用410狀態碼來告知舊資源因為某些內部的配置機制問題,已經永久的不可用,而且沒有任何可以跳轉的地址。404這個狀態碼被廣泛應用于當服務器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況下。408 Request Timeout 請求超時。客戶端沒有在服務器預備等待的時間內完成一個請求的發送。客戶端可以隨時再次提交這一請求而無需進行任何更改。500 Internal Server Error 服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器的程序碼出錯時出現。

53, TCP 和 UDP

TCP:- 建立連接,形成傳輸數據的通道- 在連接中進行大數據傳輸(數據大小受限制)- 通過三次握手完成連接,是可靠協議- 必須建立連接,效率比UDP低
UDP:- 只管發送,不管接受- 將數據以及源和目的封裝成數據包中,不需要建立連接、- 每個數據報的大小限制在64K之內- 不可靠協議- 速度快

54, 三次握手和四次斷開

三次握手: 你在嗎-我在的-我問你個事情四次斷開握手 我這個問題問完了--你問完了嗎---可以下線了嗎---我真的問完了拜拜

55, 設置按鈕按下時候會發光

button.showsTouchWhenHighlighted=YES;

56,怎么把tableview里Cell的小對勾顏色改成別的顏色?

_mTableView.tintColor = [UIColor redColor];

57, 怎么調整Cell 的 separaLine的位置?**

_myTableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);

58, ScrollView莫名其妙不能在viewController劃到頂怎么辦?

self.automaticallyAdjustsScrollViewInsets = NO;

59, 設置TableView不顯示沒內容的Cell。
self.tableView.tableFooterView = [[UIView alloc]init]

60,復制字符串到iOS剪貼板

UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = self.label.text;

61,宏定義多行使用方法

例子:( 只需要每行加個 \ 就行了)
#define YKCodingScanData \
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{} \
- (instancetype)initWithScanJson:(NSDictionary *)dict{ \
if (self = [super init]) { \
[self setValuesForKeysWithDictionary:dict]; \
} \ 
return self; \
} \

62,去掉cell點擊后背景變色

[tableView deselectRowAtIndexPath:indexPath animated:NO];
如果發現在tableView的didSelect中present控制器彈出有些慢也可以試試這個方法

63,線程租調度事例

// 群組-統一監控一組任務 
dispatch_group_t group = dispatch_group_create(); 
dispatch_queue_t q = dispatch_get_global_queue(0, 0); 
// 添加任務 // group 負責監控任務,queue 負責調度任務 
dispatch_group_async(group, q, ^{ [NSThread sleepForTimeInterval:1.0]; NSLog(@"任務1 %@", [NSThread currentThread]); }); 
dispatch_group_async(group, q, ^{ NSLog(@"任務2 %@", [NSThread currentThread]); }); dispatch_group_async(group, q, ^{ NSLog(@"任務3 %@", [NSThread currentThread]); }); 
// 監聽所有任務完成 - 等到 group 中的所有任務執行完畢后,"由隊列調度 block 中的任務異步執行!" dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
// 修改為主隊列,后臺批量下載,結束后,主線程統一更新UI NSLog(@"OK %@", [NSThread currentThread]); }); NSLog(@"come here");

64、視圖坐標轉換

// 將像素point由point所在視圖轉換到目標視圖view中,返回在目標視圖view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
// 將像素point從view中轉換到當前視圖中,返回在當前視圖中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
// 將rect由rect所在視圖轉換到目標視圖view中,返回在目標視圖view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
// 將rect從view中轉換到當前視圖中,返回在當前視圖中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
*例把UITableViewCell中的subview(btn)的frame轉換到controllerA中
// controllerA 中有一個UITableView, UITableView里有多行UITableVieCell,cell上放有一個button
// 在controllerA中實現:CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];或CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell];
// 此rc為btn在controllerA中的rect或當已知btn時:CGRect rc = [btn.superview convertRect:btn.frame toView:self.view];或CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview];

65、設置animation動畫終了,不返回初始狀態

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

66、UIViewAnimationOptions類型

常規動畫屬性設置(可以同時選擇多個進行設置)
UIViewAnimationOptionLayoutSubviews:動畫過程中保證子視圖跟隨運動。
UIViewAnimationOptionAllowUserInteraction:動畫過程中允許用戶交互。
UIViewAnimationOptionBeginFromCurrentState:所有視圖從當前狀態開始運行。
UIViewAnimationOptionRepeat:重復運行動畫。
UIViewAnimationOptionAutoreverse :動畫運行到結束點后仍然以動畫方式回到初始點。
UIViewAnimationOptionOverrideInheritedDuration:忽略嵌套動畫時間設置。
UIViewAnimationOptionOverrideInheritedCurve:忽略嵌套動畫速度設置。
UIViewAnimationOptionAllowAnimatedContent:動畫過程中重繪視圖(注意僅僅適用于轉場動畫)。 
UIViewAnimationOptionShowHideTransitionViews:視圖切換時直接隱藏舊視圖、顯示新視圖,而不是將舊視圖從父視圖移除(僅僅適用于轉場動畫)
UIViewAnimationOptionOverrideInheritedOptions :不繼承父動畫設置或動畫類型。
2.動畫速度控制(可從其中選擇一個設置)
UIViewAnimationOptionCurveEaseInOut:動畫先緩慢,然后逐漸加速。
UIViewAnimationOptionCurveEaseIn :動畫逐漸變慢。
UIViewAnimationOptionCurveEaseOut:動畫逐漸加速。
UIViewAnimationOptionCurveLinear :動畫勻速執行,默認值。
3.轉場類型(僅適用于轉場動畫設置,可以從中選擇一個進行設置,基本動畫、關鍵幀動畫不需要設置)
UIViewAnimationOptionTransitionNone:沒有轉場動畫效果。
UIViewAnimationOptionTransitionFlipFromLeft :從左側翻轉效果。
UIViewAnimationOptionTransitionFlipFromRight:從右側翻轉效果。
UIViewAnimationOptionTransitionCurlUp:向后翻頁的動畫過渡效果。 
UIViewAnimationOptionTransitionCurlDown :向前翻頁的動畫過渡效果。 
UIViewAnimationOptionTransitionCrossDissolve:舊視圖溶解消失顯示下一個新視圖的效果。 
UIViewAnimationOptionTransitionFlipFromTop :從上方翻轉效果。 
UIViewAnimationOptionTransitionFlipFromBottom:從底部翻轉效果。

67、獲取當前View所在的控制器

#import "UIView+CurrentController.h"
@implementation UIView (CurrentController)/** 獲取當前View所在的控制器*/
-(UIViewController *)getCurrentViewController{ 
UIResponder *next = [self nextResponder
]; 
do {
 if ([next isKindOfClass:[UIViewController class]]) { 
return (UIViewController *)next; 
} 
next = [next nextResponder]; }
while (next != nil); 
return nil;}

68、iOS橫向滾動的scrollView和系統pop手勢返回沖突的解決辦法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
// 首先判斷otherGestureRecognizer是不是系統pop手勢
 if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) { 
// 再判斷系統手勢的state是began還是fail,同時判斷scrollView的位置是不是正好在最左邊 
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) { 
return YES;
 } 
} return NO;
}

69、設置狀態欄方向位置

修改狀態欄方向,[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
枚舉值說明:UIDeviceOrientationPortraitUpsideDown, //設備直立,home按鈕在上
UIDeviceOrientationLandscapeLeft, //設備橫置,home按鈕在右
UIDeviceOrientationLandscapeRight, //設備橫置, home按鈕在左
UIDeviceOrientationFaceUp, //設備平放,屏幕朝上
UIDeviceOrientationFaceDown //設備平放,屏幕朝下再實現這個代理方法就行了
- (BOOL)shouldAutorotate{
 return NO; 
//必須返回no, 才能強制手動旋轉}

69、修改 UICollectionViewCell 之間的間距

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{ 
return UIEdgeInsetsMake(10, 10, 10, 10);
}

70,時間戳轉換成標準時間

-(NSString *)TimeStamp:(NSString *)strTime{ 
//因為時差問題要加8小時 == 28800 sec 
NSTimeInterval time=[strTime doubleValue]+28800; 
NSDate *detaildate=[NSDate dateWithTimeIntervalSince1970:time];
 //實例化一個NSDateFormatter對象 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
 //設定時間格式,這里可以設置成自己需要的格式 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSString *currentDateStr = [dateFormatter stringFromDate: detaildate]; 
return currentDateStr;
}

71,CocoaPods 安裝不上怎么辦

終端進入 repos目錄cd ~/.cocoapods/repos新建一個文件夾master然后下載 https://coding.net/u/CocoaPods/p/Specs/git到master下

72,快速創建Block

輸入 :xcode中輸入 : inlineblock

73,Git 關聯倉庫 ,和基本配置

-------Git global setup-------git config --global user.name "張大森"git config --global user.email "zhangdasen@126.com"-------Create a new repository-------git clone git@gitlab.testAddress.com:test/QRZxing.gitcd QRZxingtouch README.mdgitadd README.mdgit commit -m "add README"git push -u origin master-------Existing folder or Git repository-------cd existing_foldergit initgit remote add origin git@gitlab.testAddress.com:test/QRZxing.gitgit add .git commitgit push -u origin master

74,Git 命令大全


1234.png

以上整理只為自己和大家方便查看,iOS中小技巧和黑科技數不盡如果大家有不錯的代碼和技巧,也可留言或私信我,然后加上。待續。。。。。。會繼續更新的! ??
http://www.lxweimin.com/p/7c3ee5e67d03

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容