多年iOS開發經驗總結(轉)

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];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容