dataframe 控对象_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 *)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
// 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.jianshu.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
下次重新運行項目,然后就不報錯了。
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,自動處理鍵盤事件,實現輸入框防遮擋的插件
IQKeyboardManager
https://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.git
cd QRZxing
touch README.mdgit
add README.mdgit commit -m "add README"
git push -u origin master
-------Existing folder or Git repository-------
cd existing_folder
git init
git remote add origin git@gitlab.testAddress.com:test/QRZxing.git
git add .
git commit
git push -u origin master
74,Git 命令大全
75,編譯器優化級別
GCC_OPTIMIZATION_LEVEL
None: 不做優化使用這個設置,編譯器的目標是減少編譯成本,使調試產生預期的結果。
Fast:優化編譯將為大函數占用更多的時間和內存使用這個設置,編譯器將嘗試減少代碼的大小和執行時間,不進行任何優化,需要大量編譯時間。
Faster:編譯器執行幾乎所有支持的優化,它不考慮空間和速度之間的平衡與“Fast”設置相比,該設置會增加編譯時間和生成代碼的性能。編譯器不進行循環展開、內聯函數和寄存器變量的重命名。
Fastest:開啟“Faster”支持的所有的優化,同時也開啟內聯函數和寄存器變量的重命名選項
Fastest,smallest:優化代碼大小這個設置啟用“Faster”所有的優化,一般不增加代碼大小,它還執行旨在減小代碼大小的進一步優化。
76,獲取本機DNS服務器,根據域名獲取IP
/// 獲取本機DNS服務器
- (NSString *)outPutDNSServers
{
res_state res = malloc(sizeof(struct __res_state));
int result = res_ninit(res);
NSMutableArray *dnsArray = @[].mutableCopy;
if ( result == 0 )
{
for ( int i = 0; i < res->nscount; i++ )
{
NSString *s = [NSString stringWithUTF8String : inet_ntoa(res->nsaddr_list[i].sin_addr)];
[dnsArray addObject:s];
}
}
else{
NSLog(@"%@",@" res_init result != 0");
}
res_nclose(res);
return dnsArray.firstObject;
}
/// 根據域名獲取IP地址
- (NSString*)getIPWithHostName:(const NSString*)hostName
{
const char *hostN= [hostName UTF8String];
// 記錄主機的信息,包括主機名、別名、地址類型、地址長度和地址列表 結構體
struct hostent *phot;
@try {
// 返回對應于給定主機名的包含主機名字和地址信息的hostent結構指針
phot = gethostbyname(hostN);
struct in_addr ip_addr;
memcpy(&ip_addr, phot->h_addr_list[0], 4);
char ip[20] = {0};
inet_ntop(AF_INET, &ip_addr, ip, sizeof(ip));
NSString* strIPAddress = [NSString stringWithUTF8String:ip];
return strIPAddress;
}
@catch (NSException *exception) {
return nil;
}
}
77,獲取當前wifi連接信息
- (void)viewDidLoad {
[super viewDidLoad];
id info = nil;
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *ifnam in ifs) {
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
NSString *str = info[@"SSID"];
NSString *str2 = info[@"BSSID"];
NSString *str3 = [[ NSString alloc] initWithData:info[@"SSIDDATA"] encoding:NSUTF8StringEncoding];
NSLog(@"%@ %@ %@",str,str2,str3);
}
以上整理只為自己和大家方便查看,iOS中小技巧和黑科技數不盡
如果大家有不錯的代碼和技巧,也可留言或私信我,然后加上。
待續。。。。。。
會繼續更新的! 😇
總結
以上是生活随笔為你收集整理的dataframe 控对象_iOS知识 - 常用小技巧大杂烩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学生创新创业计划-2019
- 下一篇: grid autosport额外内容下载