1、禁止手機睡眠
[UIApplication?sharedApplication].idleTimerDisabled?=?YES;
2、隱藏某行cell
-?(CGFloat)tableView:(UITableView?*)tableView?heightForRowAtIndexPath:(NSIndexPath?*)indexPath
{
//?如果是你需要隱藏的那一行,返回高度為0
if(indexPath.row?==?YouWantToHideRow)
return0;
return44;
}
//?然后再你需要隱藏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?=?[RootViewControllernew];
[UIView?setAnimationsEnabled:oldState];
}?completion:^(BOOL?finished)?{
}];
8、去除數組中重復的對象
NSArray?*newArr?=?[oldArr?valueForKeyPath:@“@distinctUnionOfObjects.self"];
9、編譯的時候遇到 no such file or directory: /users/apple/XXX
是因為編譯的時候,在此路徑下找不到這個文件,解決這個問題,首先是是要檢查缺少的文件是不是在工程中,如果不在工程中,需要從本地拖進去,如果發現已經存在工程中了,或者拖進去還是報錯,這時候需要去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)?{
NSURL?*url?=?[NSURL?URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication?sharedApplication]?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();
returnimage;
}
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、強/弱引用
1
2#define?WeakSelf(type)??__weak?typeof(type)?weak##type?=?type;?//?weak
#define?StrongSelf(type)??__strong?typeof(type)?type?=?weak##type;?//?strong
24、由角度轉換弧度
1
#define?DegreesToRadian(x)?(M_PI?*?(x)?/?180.0)
25、由弧度轉換角度
1
#define?RadianToDegrees(radian)?(radian*180.0)/(M_PI)
26、獲取圖片資源
1
#define?GetImage(imageName)?[UIImage?imageNamed:[NSString?stringWithFormat:@"%@",imageName]]
27、獲取temp
1
#define?PathTemp?NSTemporaryDirectory()
28、獲取沙盒 Document
1
#define?PathDocument?[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES)?firstObject]
29、獲取沙盒 Cache
1
#define?PathCache?[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES)?firstObject]
30、GCD代碼只執行一次
1
#define?kDISPATCH_ONCE_BLOCK(onceBlock)?static?dispatch_once_t?onceToken;?dispatch_once(&onceToken,?onceBlock);
31、自定義NSLog
1
2
3
4
5#ifdef?DEBUG
#define?NSLog(fmt,?...)?NSLog((@"%s?[Line?%d]?"?fmt),?__PRETTY_FUNCTION__,?__LINE__,?##__VA_ARGS__)
#else
#define?NSLog(...)
#endif
32、Font
1
2
3
4
5#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
1
#define?FORMAT(f,?...)??????[NSString?stringWithFormat:f,?##?__VA_ARGS__]
34、在主線程上運行
1
#define?kDISPATCH_MAIN_THREAD(mainQueueBlock)?dispatch_async(dispatch_get_main_queue(),?mainQueueBlock);
35、開啟異步線程
1
#define?kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock)?dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,?0),?globalQueueBlocl);
36、通知
1
2
3#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、隨機顏色
1
2
3
4
5
6
7+?(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];
returnrandColor;
}
38、獲取window
1
2
3
4
5
6
7
8
9
10
11
12+(UIWindow*)getWindow?{
UIWindow*?win?=?nil;//[UIApplication?sharedApplication].keyWindow;
for(id?itemin[UIApplication?sharedApplication].windows)?{
if([item?class]?==?[UIWindow?class])?{
if(!((UIWindow*)item).hidden)?{
win?=?item;
break;
}
}
}
returnwin;
}
39、修改textField的placeholder的字體顏色、大小
1
2[textField?setValue:[UIColor?redColor]?forKeyPath:@"_placeholderLabel.textColor"];
[textField?setValue:[UIFont?boldSystemFontOfSize:16]?forKeyPath:@"_placeholderLabel.font"];
40、統一收起鍵盤
1
[[[UIApplication?sharedApplication]?keyWindow]?endEditing:YES];
41、控制屏幕旋轉,在控制器中寫
1
2
3
4
5
6
7
8
9
10
11
12
13
14/**?是否支持自動轉屏?*/
-?(BOOL)shouldAutorotate?{
returnYES;
}
/**?支持哪些屏幕方向?*/
-?(UIInterfaceOrientationMask)supportedInterfaceOrientations?{
returnUIInterfaceOrientationMaskLandscapeLeft?|?UIInterfaceOrientationMaskLandscapeRight;
}
/**?默認的屏幕方向(當前ViewController必須是通過模態出來的UIViewController(模態帶導航的無效)方式展現出來的,才會調用這個方法)?*/
-?(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation?{
returnUIInterfaceOrientationLandscapeLeft?|?UIInterfaceOrientationLandscapeRight;
}
42、獲取app緩存大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19-?(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?*fileNameinenumerator)?{
NSString?*path?=?[myCachePath?stringByAppendingPathComponent:fileName];
NSDictionary?*fileDict?=?[[NSFileManager?defaultManager]?attributesOfItemAtPath:path?error:nil];
count?+=?fileDict.fileSize;//自定義所有緩存大小
}
//?得到是字節??轉化為M
CGFloat?totalSize?=?((CGFloat)imageCacheSize+count)/1024/1024;
returntotalSize;
}
43、清理app緩存
1
2
3
4
5
6
7
8
9
10
11-?(void)handleClearView?{
//刪除兩部分
//1.刪除?sd?圖片緩存
//先清除內存中的圖片緩存
[[SDImageCache?sharedImageCache]?clearMemory];
//清除磁盤的緩存
[[SDImageCache?sharedImageCache]?clearDisk];
//2.刪除自己緩存
NSString?*myCachePath?=?[NSHomeDirectory()?stringByAppendingPathComponent:@"Library/Caches"];
[[NSFileManager?defaultManager]?removeItemAtPath:myCachePath?error:nil];
}
44、模型轉字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57static?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;
}
returndict;
}
-?(BOOL)isClassFromFoundation:(Class)c
{
if(c?==?[NSObject?class]?||?c?==?[NSManagedObject?class])returnYES;
__block?BOOL?result?=?NO;
[[self?foundationClasses]?enumerateObjectsUsingBlock:^(Class?foundationClass,?BOOL?*stop)?{
if([c?isSubclassOfClass:foundationClass])?{
result?=?YES;
*stop?=?YES;
}
}];
returnresult;
}
-?(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];
}
returnclasses;
}
45、交換兩個方法實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Class?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、打印百分號和引號
1
2NSLog(@"%%");
NSLog(@"\"");
47、幾個常用權限判斷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17if([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、獲取手機型號
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56+?(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";
returnplatform;
}
49、長按復制功能
1
2
3
4
5
6
7
8
9
10-?(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、判斷圖片類型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37//通過圖片Data數據第一個字節?來獲取圖片擴展名
-?(NSString?*)contentTypeForImageData:(NSData?*)data
{
uint8_t?c;
[data?getBytes:&c?length:1];
switch(c)
{
case0xFF:
return@"jpeg";
case0x89:
return@"png";
case0x47:
return@"gif";
case0x49:
case0x4D:
return@"tiff";
case0x52:
if([data?length]?<?12)?{
returnnil;
}
NSString?*testString?=?[[NSString?alloc]?initWithData:[data?subdataWithRange:NSMakeRange(0,?12)]?encoding:NSASCIIStringEncoding];
if([testString?hasPrefix:@"RIFF"]
&&?[testString?hasSuffix:@"WEBP"])
{
return@"webp";
}
returnnil;
}
returnnil;
}
53、獲取手機和app信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40NSDictionary?*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、獲取一個類的所有屬性
1
2
3
4
5
6
7id?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圓角
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18-?(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();
returnimage;
}
56、image拉伸
1
2
3
4
5
6
7+?(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字符串轉字典
1
2
3
4
5+?(NSDictionary?*)parseJSONStringToNSDictionary:(NSString?*)JSONString?{
NSData?*JSONData?=?[JSONString?dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary?*responseJSON?=?[NSJSONSerialization?JSONObjectWithData:JSONData?options:NSJSONReadingMutableLeaves?error:nil];
returnresponseJSON;
}
58、身份證號驗證
1
2
3
4
5
6
7
8
9
10-?(BOOL)validateIdentityCard?{
BOOL?flag;
if(self.length?<=?0)?{
flag?=?NO;
returnflag;
}
NSString?*regex2?=?@"^(\\d{14}|\\d{17})(\\d|[xX])$";
NSPredicate?*identityCardPredicate?=?[NSPredicate?predicateWithFormat:@"SELF?MATCHES?%@",regex2];
return[identityCardPredicate?evaluateWithObject:self];
}
59、獲取設備mac地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43+?(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");
returnNULL;
}
if(sysctl(mib,?6,?NULL,?&len,?NULL,?0)?<?0)?{
printf("Error:?sysctl,?take?1\n");
returnNULL;
}
if((buf?=?malloc(len))?==?NULL)?{
printf("Could?not?allocate?memory.?Rrror!\n");
returnNULL;
}
if(sysctl(mib,?6,?buf,?&len,?NULL,?0)?<?0)?{
printf("Error:?sysctl,?take?2");
returnNULL;
}
ifm?=?(struct?if_msghdr?*)buf;
sdl?=?(struct?sockaddr_dl?*)(ifm?+?1);
ptr?=?(unsigned?char?*)LLADDR(sdl);
NSString?*outstring?=?[NSString?stringWithFormat:@"X:X:X:X:X:X",
*ptr,?*(ptr+1),?*(ptr+2),?*(ptr+3),?*(ptr+4),?*(ptr+5)];
free(buf);
returnoutstring;
}
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進去的都能拿到
1
2
3
4
5
6
7
8
9
10
11
12
13-?(UIViewController?*)getVisibleViewControllerFrom:(UIViewController*)vc?{
if([vc?isKindOfClass:[UINavigationController?class]])?{
return[self?getVisibleViewControllerFrom:[((UINavigationController*)?vc)?visibleViewController]];
}elseif([vc?isKindOfClass:[UITabBarController?class]]){
return[self?getVisibleViewControllerFrom:[((UITabBarController*)?vc)?selectedViewController]];
}else{
if(vc.presentedViewController)?{
return[self?getVisibleViewControllerFrom:vc.presentedViewController];
}else{
returnvc;
}
}
}
62、runtime為一個類動態添加屬性
1
2//?動態添加屬性的本質是:?讓對象的某個屬性與值產生關聯
objc_setAssociatedObject(self,?WZBPlaceholderViewKey,?placeholderView,?OBJC_ASSOCIATION_RETAIN_NONATOMIC);
63、獲取runtime為一個類動態添加的屬性
1
objc_getAssociatedObject(self,?WZBPlaceholderViewKey);
64、KVO監聽某個對象的屬性
1
2
3
4
5
6
7
8
9
10//?添加監聽者
[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判斷網絡狀態
1
2
3
4
5
6
7
8
9
10NetworkStatus?status?=?[[Reachability?reachabilityForInternetConnection]?currentReachabilityStatus];
if(status?==?NotReachable)?{
NSLog(@"當前設備無網絡");
}
if(status?==?ReachableViaWiFi)?{
NSLog(@"當前wifi網絡");
}
if(status?==?NotReachable)?{
NSLog(@"當前蜂窩移動網絡");
}
66、AFNetworking監聽網絡狀態
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21//?監聽網絡狀況
AFNetworkReachabilityManager?*mgr?=?[AFNetworkReachabilityManager?sharedManager];
[mgr?setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus?status)?{
switch(status)?{
caseAFNetworkReachabilityStatusUnknown:
break;
caseAFNetworkReachabilityStatusNotReachable:?{
[SVProgressHUD?showInfoWithStatus:@"當前設備無網絡"];
}
break;
caseAFNetworkReachabilityStatusReachableViaWiFi:
[SVProgressHUD?showInfoWithStatus:@"當前Wi-Fi網絡"];
break;
caseAFNetworkReachabilityStatusReachableViaWWAN:
[SVProgressHUD?showInfoWithStatus:@"當前蜂窩移動網絡"];
break;
default:
break;
}
}];
[mgr?startMonitoring];
67、透明顏色不影響子視圖透明度
1
[UIColor?colorWithRed:?green:?blue:?alpha:];
68、取圖片某一點的顏色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40if(point.x?<?0?||?point.y?<?0)returnnil;
CGImageRef?imageRef?=?self.CGImage;
NSUInteger?width?=?CGImageGetWidth(imageRef);
NSUInteger?height?=?CGImageGetHeight(imageRef);
if(point.x?>=?width?||?point.y?>=?height)returnnil;
unsigned?char?*rawData?=?malloc(height?*?width?*?4);
if(!rawData)returnnil;
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);
returnnil;
}
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);
returnresult;
69、判斷該圖片是否有透明度通道
1
2
3
4
5
6
7
8-?(BOOL)hasAlphaChannel
{
CGImageAlphaInfo?alpha?=?CGImageGetAlphaInfo(self.CGImage);
return(alpha?==?kCGImageAlphaFirst?||
alpha?==?kCGImageAlphaLast?||
alpha?==?kCGImageAlphaPremultipliedFirst?||
alpha?==?kCGImageAlphaPremultipliedLast);
}
70、獲得灰度圖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21+?(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)?{
returnnil;
}
CGContextDrawImage(context,CGRectMake(0,?0,?width,?height),?sourceImage.CGImage);
CGImageRef?contextRef?=?CGBitmapContextCreateImage(context);
UIImage?*grayImage?=?[UIImage?imageWithCGImage:contextRef];
CGContextRelease(context);
CGImageRelease(contextRef);
returngrayImage;
}
71、根據bundle中的文件名讀取圖片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37+?(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];
}
returnnil;
}
72、合并兩個圖片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15+?(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();
returnimage;
}
73、根據bundle中的圖片名創建imageview
1
2
3
4+?(id)imageViewWithImageNamed:(NSString*)imageName
{
return[[UIImageView?alloc]?initWithImage:[UIImage?imageNamed:imageName]];
}
74、為imageView添加倒影
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23CGRect?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、畫水印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//?畫水印
-?(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的文字內容顯示在左上/右上/左下/右下/中心頂/中心底部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50自定義UILabel
//?重寫label的textRectForBounds方法
-?(CGRect)textRectForBounds:(CGRect)bounds?limitedToNumberOfLines:(NSInteger)numberOfLines?{
CGRect?rect?=?[supertextRectForBounds:bounds?limitedToNumberOfLines:numberOfLines];
switch(self.textAlignmentType)?{
caseWZBTextAlignmentTypeLeftTop:?{
rect.origin?=?bounds.origin;
}
break;
caseWZBTextAlignmentTypeRightTop:?{
rect.origin?=?CGPointMake(CGRectGetMaxX(bounds)?-?rect.size.width,?bounds.origin.y);
}
break;
caseWZBTextAlignmentTypeLeftBottom:?{
rect.origin?=?CGPointMake(bounds.origin.x,?CGRectGetMaxY(bounds)?-?rect.size.height);
}
break;
caseWZBTextAlignmentTypeRightBottom:?{
rect.origin?=?CGPointMake(CGRectGetMaxX(bounds)?-?rect.size.width,?CGRectGetMaxY(bounds)?-?rect.size.height);
}
break;
caseWZBTextAlignmentTypeTopCenter:?{
rect.origin?=?CGPointMake((CGRectGetWidth(bounds)?-?CGRectGetWidth(rect))?/?2,?CGRectGetMaxY(bounds)?-?rect.origin.y);
}
break;
caseWZBTextAlignmentTypeBottomCenter:?{
rect.origin?=?CGPointMake((CGRectGetWidth(bounds)?-?CGRectGetWidth(rect))?/?2,?CGRectGetMaxY(bounds)?-?CGRectGetMaxY(bounds)?-?rect.size.height);
}
break;
caseWZBTextAlignmentTypeLeft:?{
rect.origin?=?CGPointMake(0,?rect.origin.y);
}
break;
caseWZBTextAlignmentTypeRight:?{
rect.origin?=?CGPointMake(rect.origin.x,?0);
}
break;
caseWZBTextAlignmentTypeCenter:?{
rect.origin?=?CGPointMake((CGRectGetWidth(bounds)?-?CGRectGetWidth(rect))?/?2,?(CGRectGetHeight(bounds)?-?CGRectGetHeight(rect))?/?2);
}
break;
default:
break;
}
returnrect;
}
-?(void)drawTextInRect:(CGRect)rect?{
CGRect?textRect?=?[self?textRectForBounds:rect?limitedToNumberOfLines:self.numberOfLines];
[superdrawTextInRect:textRect];
}
77、scrollView上的輸入框,鍵盤擋住的問題
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17推薦用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
2
3
4//?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".
是因為編譯器不清楚這個對象能不能相應這個方法,如果不能,則是不安全的,而且編譯器也不清楚該怎么處理這個方法的返回值!
1
2
3
4
5
6
7
8
9
10使用以下代碼調用即可:
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、一個字符串是否包含另一個字符串
1
2
3
4
5
6
7
8
9
10
11
12
13//?方法1
if([str1?containsString:str2])?{
NSLog(@"str1包含str2");
}else{
NSLog(@"str1不包含str2");
}
//?方法2
if([str1?rangeOfString:?str2].location?==?NSNotFound)?{
NSLog(@"str1包含str2");
}else{
NSLog(@"str1不包含str2");
}
82、cell去除選中效果
1
cell.selectionStyle?=?UITableViewCellSelectionStyleNone;
83、cell點按效果
1
2
3-?(void)tableView:(UITableView?*)tableView?didSelectRowAtIndexPath:(NSIndexPath?*)indexPath?{
[tableView?deselectRowAtIndexPath:indexPath?animated:YES];
}
84、當刪除一個從xib拖出來的屬性時,一定記得把xib中對應的線也刪掉,不然會報類似[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、移除字符串中的空格和換行
1
2
3
4
5
6+?(NSString?*)removeSpaceAndNewline:(NSString?*)str?{
NSString?*temp?=?[str?stringByReplacingOccurrencesOfString:@"?"withString:@""];
temp?=?[temp?stringByReplacingOccurrencesOfString:@"\r"withString:@""];
temp?=?[temp?stringByReplacingOccurrencesOfString:@"\n"withString:@""];
returntemp;
}
89、判斷字符串中是否有空格
1
2
3
4
5
6
7
8
9
10+?(BOOL)isBlank:(NSString?*)str?{
NSRange?_range?=?[str?rangeOfString:@"?"];
if(_range.location?!=?NSNotFound)?{
//有空格
returnYES;
}else{
//沒有空格
returnNO;
}
}
90、獲取一個視頻的第一幀圖片
1
2
3
4
5
6
7
8
9
10NSURL?*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];
returnone;
91、獲取視頻的時長
1
2
3
4
5
6
7+?(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);
returnseconds;
}
92、字符串是否為空
1
2
3+?(BOOL)isEqualToNil:(NSString?*)str?{
returnstr.length?<=?0?||?[str?isEqualToString:@""]?||?!str;
}
93、將app上傳到App Store的時候通常會遇到這個問題
try again
很多人說這事蘋果爸爸服務器問題,重復嘗試幾次,總會成功的!
但是經過嘗試發現如果使用Application Loader上傳成功率就非常高,所以還是推薦把ipa文件導出直接用Application Loader上傳。
如果Application Loader也不行,需要檢查下自己的網絡,有時候vpn也會提高速度。
94、當tableView占不滿一屏時,去除下邊多余的單元格
1
2self.tableView.tableHeaderView?=?[UIViewnew];
self.tableView.tableFooterView?=?[UIViewnew];
95、isKindOfClass和isMemberOfClass的區別
1
2isKindOfClass可以判斷某個對象是否屬于某個類,或者這個類的子類。
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 () failed to obtain a cell from its dataSource ()
這個錯誤原因是tableView的代理方法-tableView:cellForRowAtIndexPath:需要返回一個UITableViewCell,而你返回了一個nil。另外這個地方返回值不是UITableViewCell類型也會導致崩潰
99、約束如何做UIView動畫?
1、把需要改的約束Constraint拖條線出來,成為屬性
2、在需要動畫的地方加入代碼,改變此屬性的constant屬性
3、開始做UIView動畫,動畫里邊調用layoutIfNeeded方法
1
2
3
4
5@property?(weak,?nonatomic)?IBOutlet?NSLayoutConstraint?*buttonTopConstraint;
self.buttonTopConstraint.constant?=?100;
[UIView?animateWithDuration:.5?animations:^{
[self.view?layoutIfNeeded];
}];
100、從NSURL中拿到鏈接字符串
1
NSString?*urlString?=?myURL.absoluteString;
101、將tableView滾動到頂部
1
2
3[tableView?setContentOffset:CGPointZero?animated:YES];
或者
[tableView?scrollRectToVisible:CGRectMake(0,?0,?1,?1)?animated:YES];
102、如果用addTarget:action:forControlEvents:方法為一個button添加了很多點擊事件,在某個時刻想一次刪除怎么辦?只需要調用下邊這句代碼
1
[youButton?removeTarget:nil?action:nil?forControlEvents:UIControlEventAllEvents];
103、某個字體的高度
1
font.lineHeight;
104、刪除某個view所有的子視圖
1
2[[someView?subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
105、刪除NSUserDefaults所有記錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14//方法一
NSString?*appDomain?=?[[NSBundle?mainBundle]?bundleIdentifier];
[[NSUserDefaults?standardUserDefaults]?removePersistentDomainForName:appDomain];
//方法二
-?(void)resetDefaults?{
NSUserDefaults?*?defs?=?[NSUserDefaults?standardUserDefaults];
NSDictionary?*?dict?=?[defs?dictionaryRepresentation];
for(id?keyindict)?{
[defs?removeObjectForKey:key];
}
[defs?synchronize];
}
//?方法三
[[NSUserDefaults?standardUserDefaults]?setPersistentDomain:[NSDictionary?dictionary]?forName:[[NSBundle?mainBundle]?bundleIdentifier]];
106、禁用系統滑動返回功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16-?(void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
if([self.navigationController?respondsToSelector:@selector(interactivePopGestureRecognizer)])?{self.navigationController.interactivePopGestureRecognizer.delegate?=?self;
}
}
-?(void)viewWillDisappear:(BOOL)animated?{
[superviewWillDisappear:animated];
if([self.navigationController?respondsToSelector:@selector(interactivePopGestureRecognizer)])?{self.navigationController.interactivePopGestureRecognizer.delegate?=?nil;
}
}
-?(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer?*)gestureRecognizer
{
returnNO;
}
107、模擬器報錯
模擬器報錯
解決辦法:
打開模擬器->Simulator->Reset Content and Settings...
如果不行,就重啟試試!
108、自定義cell選中背景顏色
1
2
3UIView?*bgColorView?=?[[UIView?alloc]?init];
bgColorView.backgroundColor?=?[UIColor?redColor];
[cell?setSelectedBackgroundView:bgColorView];
109、UILabel設置內邊距
1
2
3
4
5
6子類化UILabel,重寫drawTextInRect方法
-?(void)drawTextInRect:(CGRect)rect?{
//?邊距,上左下右
UIEdgeInsets?insets?=?{0,?5,?0,?5};
[superdrawTextInRect:UIEdgeInsetsInsetRect(rect,?insets)];
}
110、UILabel設置文字描邊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16子類化UILabel,重寫drawTextInRect方法
-?(void)drawTextInRect:(CGRect)rect
{
CGContextRef?c?=?UIGraphicsGetCurrentContext();
//?設置描邊寬度
CGContextSetLineWidth(c,?1);
CGContextSetLineJoin(c,?kCGLineJoinRound);
CGContextSetTextDrawingMode(c,?kCGTextStroke);
//?描邊顏色
self.textColor?=?[UIColor?redColor];
[superdrawTextInRect:rect];
//?文本顏色
self.textColor?=?[UIColor?yellowColor];
CGContextSetTextDrawingMode(c,?kCGTextFill);
[superdrawTextInRect:rect];
}
111、使用模擬器截圖
1
2快捷鍵command?+?s
或者File->Save?Screen?Shot
112、scrollView滾動到最下邊
1
2CGPoint?bottomOffset?=?CGPointMake(0,?scrollView.contentSize.height?-?scrollView.bounds.size.height);
[scrollView?setContentOffset:bottomOffset?animated:YES];
113、UIView背景顏色漸變
1
2
3
4
5
6UIView?*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動畫
1
[yourView.layer?removeAllAnimations]
115、為UIView某個角添加圓角
1
2
3
4
5
6//?左上角和右下角添加圓角
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放置在其兄弟視圖的最上面
1
[parentView?bringSubviewToFront:yourView]
118、將一個view放置在其兄弟視圖的最下面
1
[parentView?sendSubviewToBack:yourView]
119、讓手機震動一下
1
2
3
4
5倒入框架
#import
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在指定的地方換行
1
2
3//?換行符為\n,在需要換行的地方加上這個符號即可,如
label.numberOfLines?=?0;
label.text?=?@"此處\n換行";
122、搖一搖功能
1
2
3
4
5
6
7
8
9
10
11
121、打開搖一搖功能
[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、獲取圖片大小
1
2CGFloat?imageWidth?=?image.size.width;
CGFloat?imageHeight?=?imageWidth?*?image.scale;
124、獲取view的坐標在整個window上的位置
1
2
3
4//?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的字體大小
1
[segment?setTitleTextAttributes:@{NSFontAttributeName?:?[UIFont?systemFontOfSize:15.0f]}?forState:UIControlStateNormal];
127、在非ViewController的地方彈出UIAlertController對話框
1
2
3
4
5
6
7
8
9
10
11
12
13//??最好抽成一個分類
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所屬的控制器
1
2
3
4
5
6
7
8
9
10//?view分類方法
-?(UIViewController?*)belongViewController?{
for(UIView?*next?=?[self?superview];?next;?next?=?next.superview)?{
UIResponder*?nextResponder?=?[next?nextResponder];
if([nextResponder?isKindOfClass:[UIViewController?class]])?{
return(UIViewController?*)nextResponder;
}
}
returnnil;
}
129、UIImage和base64互轉
1
2
3
4
5
6
7
8
9//?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設置背景透明
1
2[webView?setBackgroundColor:[UIColor?clearColor]];
[webView?setOpaque:NO];
131、判斷NSDate是不是今天
1
2
3
4
5
6
7
8NSDateComponents?*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分割線顏色
1
[self.tableView?setSeparatorColor:[UIColor?myColor]];
133、設置屏幕方向
1
[[UIDevice?currentDevice]?setValue:@(UIInterfaceOrientationLandscapeLeft)?forKey:@"orientation"];
134、比較兩個顏色是否相等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21-?(BOOL)isEqualToColor:(UIColor?*)otherColor?{
CGColorSpaceRef?colorSpaceRGB?=?CGColorSpaceCreateDeviceRGB();
6
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?);
6
UIColor?*color?=?[UIColor?colorWithCGColor:colorRef];
CGColorRelease(colorRef);
returncolor;
}else
returncolor;
};
6
UIColor?*selfColor?=?convertColorToRGBSpace(self);
otherColor?=?convertColorToRGBSpace(otherColor);
CGColorSpaceRelease(colorSpaceRGB);
return[selfColor?isEqual:otherColor];
}
135、tableViewCell分割線頂到頭
1
2
3
4
5
6
7
8
9
10-?(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拉伸或壓縮
1
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)
1
Operation?not?permitted?-?/usr/bin/pod
解決辦法:直接在終端執行 sudo gem install -n /usr/local/bin cocoapods
139、在狀態欄增加網絡請求的菊花,類似safari加載網頁的時候狀態欄菊花
1
[UIApplication?sharedApplication].networkActivityIndicatorVisible?=?YES;
140、檢查一個rect是否包含一個point
1
2//?point是否在rect內
BOOL?isContains?=?CGRectContainsPoint(rect,?point);
141、在指定的寬度下,讓UILabel自動設置最佳font
1
label.adjustsFontSizeToFitWidth?=?YES;
142、將一個image保存在相冊中
1
2
3
4
5
6
7
8
9
10
11
12
13
14UIImageWriteToSavedPhotosAlbum(image,?nil,?nil,?nil);
或者
#import
[[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的大小
1
2
3
4
5
6
7UIImage?*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添加虛線邊框
/ /?繼承UITextView重寫這個方法
-?(BOOL)canPerformAction:(SEL)action?withSender:(id)sender
{
//?返回NO為禁用,YES為開啟
//?粘貼
if(action?==?@selector(paste:))returnNO;
//?剪切
if(action?==?@selector(cut:))returnNO;
//?復制
if(action?==?@selector(copy:))returnNO;
//?選擇
if(action?==?@selector(select:))returnNO;
//?選中全部
if(action?==?@selector(selectAll:))returnNO;
//?刪除
if(action?==?@selector(delete:))returnNO;
//?分享
if(action?==?@selector(share))returnNO;
return[supercanPerformAction:action?withSender:sender];
}