iOS開發(fā)經(jīng)驗總結(jié)匯總

1、設(shè)置UILabel行間距

NSMutableAttributedString*?attrString?=?[[NSMutableAttributedString??alloc]?initWithString:label.text];

NSMutableParagraphStyle?*style?=?[[NSMutableParagraphStyle?alloc]?init];

[style?setLineSpacing:20];

[attrString?addAttribute:NSParagraphStyleAttributeName?value:style?range:NSMakeRange(0,?label.text.length)];

label.attributedText?=?attrString;

// 或者使用xib淀散,看下gif圖

Untitled.gif

2并思、當(dāng)使用-performSelector:withObject:withObject:afterDelay:方法時尘惧,需要傳入多參數(shù)問題

//?方法一、

//?把參數(shù)放進(jìn)一個數(shù)組/字典驹沿,直接把數(shù)組/字典當(dāng)成一個參數(shù)傳過去惨恭,具體方法實現(xiàn)的地方再解析這個數(shù)組/字典

NSArray?*?array?=

[NSArray?arrayWithObjects:?@"first",?@"second",?nil];

[self?performSelector:@selector(fooFirstInput:)?withObject:?array?afterDelay:15.0];

//?方法二、

//?使用NSInvocation

SEL?aSelector?=?NSSelectorFromString(@"doSoming:argument2:");

NSInteger?argument1?=?10;

NSString?*argument2?=?@"argument2";

if([self?respondsToSelector:aSelector])?{

NSInvocation?*inv?=?[NSInvocation?invocationWithMethodSignature:[self?methodSignatureForSelector:aSelector]];

[inv?setSelector:aSelector];

[inv?setTarget:self];

[inv?setArgument:&(argument1)?atIndex:2];

[inv?setArgument:&(argument2)?atIndex:3];

[inv?performSelector:@selector(invoke)?withObject:nil?afterDelay:15.0];

}

3通熄、UILabel顯示不同顏色字體

NSMutableAttributedString?*?string?=?[[NSMutableAttributedString?alloc]?initWithString:label.text];

[string?addAttribute:NSForegroundColorAttributeName?value:[UIColor?redColor]?range:NSMakeRange(0,5)];

[string?addAttribute:NSForegroundColorAttributeName?value:[UIColor?greenColor]?range:NSMakeRange(5,6)];

[string?addAttribute:NSForegroundColorAttributeName?value:[UIColor?blueColor]?range:NSMakeRange(11,5)];

label.attributedText?=?string;

4唆涝、比較兩個CGRect/CGSize/CGPoint是否相等

if?(CGRectEqualToRect(rect1,?rect2))?{?//?兩個區(qū)域相等

//?do?some

}

if?(CGPointEqualToPoint(point1,?point2))?{?//?兩個點相等

//?do?some

}

if?(CGSizeEqualToSize(size1,?size2))?{?//?兩個size相等

//?do?some

}

5、比較兩個NSDate相差多少小時

NSDate*?date1?=?someDate;

NSDate*?date2?=?someOtherDate;

NSTimeInterval?distanceBetweenDates?=?[date1?timeIntervalSinceDate:date2];

double?secondsInAnHour?=?3600;

//?除以3600是把秒化成小時棠隐,除以60得到結(jié)果為相差的分鐘數(shù)

NSInteger?hoursBetweenDates?=?distanceBetweenDates?/?secondsInAnHour;

6石抡、每個cell之間增加間距

//?方法一,每個分區(qū)只顯示一行cell助泽,分區(qū)頭當(dāng)作你想要的間距(注意啰扛,從數(shù)據(jù)源數(shù)組中取值的時候需要用indexPath.section而不是indexPath.row)

-?(NSInteger)numberOfSectionsInTableView:(UITableView?*)tableView

{

return?yourArry.count;

}

-?(NSInteger)tableView:(UITableView?*)tableView?numberOfRowsInSection:(NSInteger)section

{

return?1;

}

-(CGFloat)tableView:(UITableView?*)tableView?heightForHeaderInSection:(NSInteger)section

{

return?cellSpacingHeight;

}

//?方法二,在cell的contentView上加個稍微低一點的view嗡贺,cell上原本的內(nèi)容放在你的view上隐解,而不是contentView上,這樣能偽造出一個間距來诫睬。

//?方法三煞茫,自定義cell,重寫setFrame:方法

-?(void)setFrame:(CGRect)frame

{

frame.size.height?-=?20;

[super?setFrame:frame];

}

7摄凡、播放一張張連續(xù)的圖片

//?加入現(xiàn)在有三張圖片分別為animate_1续徽、animate_2、animate_3

//?方法一

imageView.animationImages?=?@[[UIImage?imageNamed:@"animate_1"],?[UIImage?imageNamed:@"animate_2"],?[UIImage?imageNamed:@"animate_3"]];

imageView.animationDuration?=?1.0;

//?方法二

imageView.image?=?[UIImage?animatedImageNamed:@"animate_"?duration:1.0];

//?方法二解釋下亲澡,這個方法會加載animate_為前綴的钦扭,后邊0-1024,也就是animate_0床绪、animate_1一直到animate_1024

8客情、加載gif圖片

推薦使用這個框架FLAnimatedImage

9、防止離屏渲染為image添加圓角

//?image分類

-?(UIImage?*)circleImage

{

//?NO代表透明

UIGraphicsBeginImageContextWithOptions(self.size,?NO,?1);

//?獲得上下文

CGContextRef?ctx?=?UIGraphicsGetCurrentContext();

//?添加一個圓

CGRect?rect?=?CGRectMake(0,?0,?self.size.width,?self.size.height);

//?方形變圓形

CGContextAddEllipseInRect(ctx,?rect);

//?裁剪

CGContextClip(ctx);

//?將圖片畫上去

[self?drawInRect:rect];

UIImage?*image?=?UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return?image;

}

10癞己、查看系統(tǒng)所有字體

//?打印字體

for?(id?familyName?in?[UIFont?familyNames])?{

NSLog(@"%@",?familyName);

for?(id?fontName?in?[UIFont?fontNamesForFamilyName:familyName])?NSLog(@"??%@",?fontName);

}

//?也可以進(jìn)入這個網(wǎng)址查看?http://iosfonts.com/

11膀斋、獲取隨機數(shù)

NSInteger?i?=?arc4random();

12、獲取隨機數(shù)小數(shù)(0-1之間)

#define?ARC4RANDOM_MAX??????0x100000000

double?val?=?((double)arc4random()?/?ARC4RANDOM_MAX);

13痹雅、AVPlayer視頻播放完成的通知監(jiān)聽

[[NSNotificationCenter?defaultCenter]

addObserver:self

selector:@selector(videoPlayEnd)

name:AVPlayerItemDidPlayToEndTimeNotification

object:nil];

14仰担、判斷兩個rect是否有交叉

if?(CGRectIntersectsRect(rect1,?rect2))?{

}

15、判斷一個字符串是否為數(shù)字

NSCharacterSet?*notDigits?=?[[NSCharacterSet?decimalDigitCharacterSet]?invertedSet];

if?([str?rangeOfCharacterFromSet:notDigits].location?==?NSNotFound)

{

//?是數(shù)字

}?else

{

//?不是數(shù)字

}

16绩社、將一個view保存為pdf格式

-?(void)createPDFfromUIView:(UIView*)aView?saveToDocumentsWithFileName:(NSString*)aFilename

{

NSMutableData?*pdfData?=?[NSMutableData?data];

UIGraphicsBeginPDFContextToData(pdfData,?aView.bounds,?nil);

UIGraphicsBeginPDFPage();

CGContextRef?pdfContext?=?UIGraphicsGetCurrentContext();

[aView.layer?renderInContext:pdfContext];

UIGraphicsEndPDFContext();

NSArray*?documentDirectories?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,YES);

NSString*?documentDirectory?=?[documentDirectories?objectAtIndex:0];

NSString*?documentDirectoryFilename?=?[documentDirectory?stringByAppendingPathComponent:aFilename];

[pdfData?writeToFile:documentDirectoryFilename?atomically:YES];

NSLog(@"documentDirectoryFileName:?%@",documentDirectoryFilename);

}

17惰匙、讓一個view在父視圖中心

child.center?=?[parent?convertPoint:parent.center?fromView:parent.superview];

18技掏、獲取當(dāng)前導(dǎo)航控制器下前一個控制器

-?(UIViewController?*)backViewController

{

NSInteger?myIndex?=?[self.navigationController.viewControllers?indexOfObject:self];

if?(?myIndex?!=?0?&&?myIndex?!=?NSNotFound?)?{

return?[self.navigationController.viewControllers?objectAtIndex:myIndex-1];

}?else?{

return?nil;

}

}

19铃将、保存UIImage到本地

NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);

NSString?*filePath?=?[[paths?objectAtIndex:0]?stringByAppendingPathComponent:@"Image.png"];

[UIImagePNGRepresentation(image)?writeToFile:filePath?atomically:YES];

20项鬼、鍵盤上方增加工具欄

UIToolbar?*keyboardDoneButtonView?=?[[UIToolbar?alloc]?init];

[keyboardDoneButtonView?sizeToFit];

UIBarButtonItem?*doneButton?=?[[UIBarButtonItem?alloc]?initWithTitle:@"Done"

style:UIBarButtonItemStyleBordered?target:self

action:@selector(doneClicked:)];

[keyboardDoneButtonView?setItems:[NSArray?arrayWithObjects:doneButton,?nil]];

txtField.inputAccessoryView?=?keyboardDoneButtonView;

21、copy一個view

因為UIView沒有實現(xiàn)copy協(xié)議劲阎,因此找不到copyWithZone方法绘盟,使用copy的時候?qū)е卤罎?/p>

但是我們可以通過歸檔再解檔實現(xiàn)copy,這相當(dāng)于對視圖進(jìn)行了一次深拷貝悯仙,代碼如下

id?copyOfView?=

[NSKeyedUnarchiver?unarchiveObjectWithData:[NSKeyedArchiver?archivedDataWithRootObject:originalView]];

22龄毡、在image上繪制文字并生成新的image

UIFont?*font?=?[UIFont?boldSystemFontOfSize:12];

UIGraphicsBeginImageContext(image.size);

[image?drawInRect:CGRectMake(0,0,image.size.width,image.size.height)];

CGRect?rect?=?CGRectMake(point.x,?point.y,?image.size.width,?image.size.height);

[[UIColor?whiteColor]?set];

[text?drawInRect:CGRectIntegral(rect)?withFont:font];

UIImage?*newImage?=?UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

23、判斷一個view是否為另一個view的子視圖

//?如果myView是self.view本身锡垄,也會返回yes

BOOL?isSubView?=?[myView?isDescendantOfView:self.view];

24沦零、判斷一個字符串是否包含另一個字符串

//?方法一、這種方法只適用于iOS8之后货岭,如果是配iOS8之前用方法二

if?([str?containsString:otherStr])?NSLog(@"包含");

//?方法二

NSRange?range?=?[str?rangeOfString:otherStr];

if?(range.location?!=?NSNotFound)?NSLog(@"包含");

25路操、UICollectionView自動滾動到某行

//?重寫viewDidLayoutSubviews方法

-(void)viewDidLayoutSubviews?{

[super?viewDidLayoutSubviews];

[self.collectionView?scrollToItemAtIndexPath:indexPath?atScrollPosition:UICollectionViewScrollPositionCenteredVertically?animated:NO];

}

26、修改系統(tǒng)UIAlertController

//?但是據(jù)說這種方法會被App?Store拒絕(慎用千贯!)

UIAlertController?*alertVC?=?[UIAlertController?alertControllerWithTitle:@""?message:@""?preferredStyle:UIAlertControllerStyleActionSheet];

NSMutableAttributedString?*hogan?=?[[NSMutableAttributedString?alloc]?initWithString:@"我是一個大文本"];

[hogan?addAttribute:NSFontAttributeName

value:[UIFont?systemFontOfSize:30]

range:NSMakeRange(4,?1)];

[hogan?addAttribute:NSForegroundColorAttributeName

value:[UIColor?redColor]

range:NSMakeRange(4,?1)];

[alertVC?setValue:hogan?forKey:@"attributedTitle"];

UIAlertAction?*button?=?[UIAlertAction?actionWithTitle:@"Label?text"?style:UIAlertActionStyleDefault?handler:^(UIAlertAction?*action){?}];

UIImage?*accessoryImage?=?[UIImage?imageNamed:@"1"];

[button?setValue:accessoryImage?forKey:@"image"];

[alertVC?addAction:button];

[self?presentViewController:alertVC?animated:YES?completion:nil];

27屯仗、判斷某一行的cell是否已經(jīng)顯示

CGRect?cellRect?=?[tableView?rectForRowAtIndexPath:indexPath];

BOOL?completelyVisible?=?CGRectContainsRect(tableView.bounds,?cellRect);

28脐嫂、讓導(dǎo)航控制器pop回指定的控制器

NSMutableArray?*allViewControllers?=?[NSMutableArray?arrayWithArray:[self.navigationController?viewControllers]];

for?(UIViewController?*aViewController?in?allViewControllers)?{

if?([aViewController?isKindOfClass:[RequiredViewController?class]])?{

[self.navigationController?popToViewController:aViewController?animated:NO];

}

}

29橘沥、動畫修改label上的文字

//?方法一

CATransition?*animation?=?[CATransition?animation];

animation.timingFunction?=?[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animation.type?=?kCATransitionFade;

animation.duration?=?0.75;

[self.label.layer?addAnimation:animation?forKey:@"kCATransitionFade"];

self.label.text?=?@"New";

//?方法二

[UIView?transitionWithView:self.label

duration:0.25f

options:UIViewAnimationOptionTransitionCrossDissolve

animations:^{

self.label.text?=?@"Well?done!";

}?completion:nil];

//?方法三

[UIView?animateWithDuration:1.0

animations:^{

self.label.alpha?=?0.0f;

self.label.text?=?@"newText";

self.label.alpha?=?1.0f;

}];

30、判斷字典中是否包含某個key值

if?([dic?objectForKey:@"yourKey"])?{

NSLog(@"有這個值");

}?else?{

NSLog(@"沒有這個值");

}

31炮沐、獲取屏幕方向

UIInterfaceOrientation?orientation?=?[UIApplication?sharedApplication].statusBarOrientation;

if(orientation?==?0)?//Default?orientation

//默認(rèn)

else?if(orientation?==?UIInterfaceOrientationPortrait)

//豎屏

else?if(orientation?==?UIInterfaceOrientationLandscapeLeft)

//?左橫屏

else?if(orientation?==?UIInterfaceOrientationLandscapeRight)

//右橫屏

32敦第、設(shè)置UIImage的透明度

//?方法一峰弹、添加UIImage分類

-?(UIImage?*)imageByApplyingAlpha:(CGFloat)?alpha?{

UIGraphicsBeginImageContextWithOptions(self.size,?NO,?0.0f);

CGContextRef?ctx?=?UIGraphicsGetCurrentContext();

CGRect?area?=?CGRectMake(0,?0,?self.size.width,?self.size.height);

CGContextScaleCTM(ctx,?1,?-1);

CGContextTranslateCTM(ctx,?0,?-area.size.height);

CGContextSetBlendMode(ctx,?kCGBlendModeMultiply);

CGContextSetAlpha(ctx,?alpha);

CGContextDrawImage(ctx,?area,?self.CGImage);

UIImage?*newImage?=?UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return?newImage;

}

//?方法二、如果沒有奇葩需求芜果,干脆用UIImageView設(shè)置透明度

UIImageView?*imageView?=?[[UIImageView?alloc]?initWithImage:[UIImage?imageWithName:@"yourImage"]];

imageView.alpha?=?0.5;

33鞠呈、Attempt to mutate immutable object with insertString:atIndex:

這個錯是因為你拿字符串調(diào)用insertString:atIndex:方法的時候,調(diào)用對象不是NSMutableString师幕,應(yīng)該先轉(zhuǎn)成這個類型再調(diào)用

34粟按、UIWebView添加單擊手勢不響應(yīng)

UITapGestureRecognizer?*tap?=?[[UITapGestureRecognizer?alloc]?initWithTarget:self?action:@selector(webViewClick)];

tap.delegate?=?self;

[_webView?addGestureRecognizer:tap];

//?因為webView本身有一個單擊手勢,所以再添加會造成手勢沖突霹粥,從而不響應(yīng)灭将。需要綁定手勢代理,并實現(xiàn)下邊的代理方法

-?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer?*)otherGestureRecognizer{

return?YES;

}

35后控、獲取手機RAM容量

//?需要導(dǎo)入#import

mach_port_t?host_port;

mach_msg_type_number_t?host_size;

vm_size_t?pagesize;

host_port?=?mach_host_self();

host_size?=?sizeof(vm_statistics_data_t)?/?sizeof(integer_t);

host_page_size(host_port,?&pagesize);

vm_statistics_data_t?vm_stat;

if?(host_statistics(host_port,?HOST_VM_INFO,?(host_info_t)&vm_stat,?&host_size)?!=?KERN_SUCCESS)?{

NSLog(@"Failed?to?fetch?vm?statistics");

}

/*?Stats?in?bytes?*/

natural_t?mem_used?=?(vm_stat.active_count?+

vm_stat.inactive_count?+

vm_stat.wire_count)?*?pagesize;

natural_t?mem_free?=?vm_stat.free_count?*?pagesize;

natural_t?mem_total?=?mem_used?+?mem_free;

NSLog(@"已用:?%u?可用:?%u?總共:?%u",?mem_used,?mem_free,?mem_total);

36庙曙、地圖上兩個點之間的實際距離

//?需要導(dǎo)入#import

CLLocation?*locA?=?[[CLLocation?alloc]?initWithLatitude:34?longitude:113];

CLLocation?*locB?=?[[CLLocation?alloc]?initWithLatitude:31.05?longitude:121.76];

//?CLLocationDistance求出的單位為米

CLLocationDistance?distance?=?[locA?distanceFromLocation:locB];

37、在應(yīng)用中打開設(shè)置的某個界面

//?打開設(shè)置->通用

[[UIApplication?sharedApplication]?openURL:[NSURL?URLWithString:@"prefs:root=General"]];

//?以下是設(shè)置其他界面

prefs:root=General&path=About

prefs:root=General&path=ACCESSIBILITY

prefs:root=AIRPLANE_MODE

prefs:root=General&path=AUTOLOCK

prefs:root=General&path=USAGE/CELLULAR_USAGE

prefs:root=Brightness

prefs:root=Bluetooth

prefs:root=General&path=DATE_AND_TIME

prefs:root=FACETIME

prefs:root=General

prefs:root=General&path=Keyboard

prefs:root=CASTLE

prefs:root=CASTLE&path=STORAGE_AND_BACKUP

prefs:root=General&path=INTERNATIONAL

prefs:root=LOCATION_SERVICES

prefs:root=ACCOUNT_SETTINGS

prefs:root=MUSIC

prefs:root=MUSIC&path=EQ

prefs:root=MUSIC&path=VolumeLimit

prefs:root=General&path=Network

prefs:root=NIKE_PLUS_IPOD

prefs:root=NOTES

prefs:root=NOTIFICATIONS_ID

prefs:root=Phone

prefs:root=Photos

prefs:root=General&path=ManagedConfigurationList

prefs:root=General&path=Reset

prefs:root=Sounds&path=Ringtone

prefs:root=Safari

prefs:root=General&path=Assistant

prefs:root=Sounds

prefs:root=General&path=SOFTWARE_UPDATE_LINK

prefs:root=STORE

prefs:root=TWITTER

prefs:root=FACEBOOK

prefs:root=General&path=USAGE?prefs:root=VIDEO

prefs:root=General&path=Network/VPN

prefs:root=Wallpaper

prefs:root=WIFI

prefs:root=INTERNET_TETHERING

prefs:root=Phone&path=Blocked

prefs:root=DO_NOT_DISTURB

38浩淘、在UITextView中顯示html文本

UITextView?*textView?=?[[UITextView?alloc]?initWithFrame:CGRectMake(20,?30,?100,?199)];

textView.backgroundColor?=?[UIColor?redColor];

[self.view?addSubview:textView];

NSString?*htmlString?=?@"

![](http://blogs.babble.com/famecrawler/files/2010/11/mickey_mouse-1097.jpg)";

NSAttributedString?*attributedString?=?[[NSAttributedString?alloc]?initWithData:?[htmlString?dataUsingEncoding:NSUnicodeStringEncoding]?options:?@{?NSDocumentTypeDocumentAttribute:?NSHTMLTextDocumentType?}?documentAttributes:?nil?error:?nil];

textView.attributedText?=?attributedString;

39捌朴、監(jiān)聽scrollView是否滾動到了頂部/底部

-(void)scrollViewDidScroll:?(UIScrollView*)scrollView

{

float?scrollViewHeight?=?scrollView.frame.size.height;

float?scrollContentSizeHeight?=?scrollView.contentSize.height;

float?scrollOffset?=?scrollView.contentOffset.y;

if?(scrollOffset?==?0)

{

//?滾動到了頂部

}

else?if?(scrollOffset?+?scrollViewHeight?==?scrollContentSizeHeight)

{

//?滾動到了底部

}

}

40吴攒、UISlider增量/減量為固定值(假如為5)

-?(void)setupSlider

{

UISlider?*slider?=?[[UISlider?alloc]?init];

[self.view?addSubview:slider];

[slider?addTarget:self?action:@selector(sliderAction:)?forControlEvents:UIControlEventValueChanged];

slider.maximumValue?=?100;

slider.minimumValue?=?0;

slider.frame?=?CGRectMake(200,?20,?100,?30);

}

-?(void)sliderAction:(UISlider?*)slider

{

[slider?setValue:((int)((slider.value?+?2.5)?/?5)?*?5)?animated:NO];

}

41、選中textField或者textView所有文本(我這里以textView為例)

[self.textView?setSelectedTextRange:[self.textView?textRangeFromPosition:self.textView.beginningOfDocument?toPosition:self.textView.endOfDocument]]

42砂蔽、從導(dǎo)航控制器中刪除某個控制器

//?方法一洼怔、知道這個控制器所處的導(dǎo)航控制器下標(biāo)

NSMutableArray?*navigationArray?=?[[NSMutableArray?alloc]?initWithArray:?self.navigationController.viewControllers];

[navigationArray?removeObjectAtIndex:?2];

self.navigationController.viewControllers?=?navigationArray;

//?方法二、知道具體是哪個控制器

NSArray*?tempVCA?=?[self.navigationController?viewControllers];

for(UIViewController?*tempVC?in?tempVCA)

{

if([tempVC?isKindOfClass:[urViewControllerClass?class]])

{

[tempVC?removeFromParentViewController];

}

}

43左驾、隱藏UITextView/UITextField光標(biāo)

textField.tintColor?=?[UIColor?clearColor];

44镣隶、當(dāng)UITextView/UITextField中沒有文字時,禁用回車鍵

textField.enablesReturnKeyAutomatically?=?YES;

45诡右、字符串encode編碼(編碼url字符串不成功的問題)

//?我們一般用這個方法處理stringByAddingPercentEscapesUsingEncoding但是這個方法好想不會處理/和&這種特殊符號安岂,這種情況就需要用下邊這個方法處理

@implementation?NSString?(NSString_Extended)

-?(NSString?*)urlencode?{

NSMutableString?*output?=?[NSMutableString?string];

const?unsigned?char?*source?=?(const?unsigned?char?*)[self?UTF8String];

int?sourceLen?=?strlen((const?char?*)source);

for?(int?i?=?0;?i?<?sourceLen;?++i)?{

const?unsigned?char?thisChar?=?source[i];

if?(thisChar?==?'?'){

[output?appendString:@"+"];

}?else?if?(thisChar?==?'.'?||?thisChar?==?'-'?||?thisChar?==?'_'?||?thisChar?==?'~'?||

(thisChar?>=?'a'?&&?thisChar?=?'A'?&&?thisChar?=?'0'?&&?thisChar?<=?'9'))?{

[output?appendFormat:@"%c",?thisChar];

}?else?{

[output?appendFormat:@"%%X",?thisChar];

}

}

return?output;

}

46、計算UILabel上某段文字的frame

@implementation?UILabel?(TextRect)

-?(CGRect)boundingRectForCharacterRange:(NSRange)range

{

NSTextStorage?*textStorage?=?[[NSTextStorage?alloc]?initWithAttributedString:[self?attributedText]];

NSLayoutManager?*layoutManager?=?[[NSLayoutManager?alloc]?init];

[textStorage?addLayoutManager:layoutManager];

NSTextContainer?*textContainer?=?[[NSTextContainer?alloc]?initWithSize:[self?bounds].size];

textContainer.lineFragmentPadding?=?0;

[layoutManager?addTextContainer:textContainer];

NSRange?glyphRange;

[layoutManager?characterRangeForGlyphRange:range?actualGlyphRange:&glyphRange];

return?[layoutManager?boundingRectForGlyphRange:glyphRange?inTextContainer:textContainer];

}

47帆吻、獲取隨機UUID

NSString?*result;

if([[[UIDevice?currentDevice]?systemVersion]?floatValue]?>?6.0)

{

result?=?[[NSUUID?UUID]?UUIDString];

}

else

{

CFUUIDRef?uuidRef?=?CFUUIDCreate(NULL);

CFStringRef?uuid?=?CFUUIDCreateString(NULL,?uuidRef);

CFRelease(uuidRef);

result?=?(__bridge_transfer?NSString?*)uuid;

}

48域那、仿蘋果抖動動畫

#define?RADIANS(degrees)?(((degrees)?*?M_PI)?/?180.0)

-?(void)startAnimate?{

view.transform?=?CGAffineTransformRotate(CGAffineTransformIdentity,?RADIANS(-5));

[UIView?animateWithDuration:0.25?delay:0.0?options:(UIViewAnimationOptionAllowUserInteraction?|?UIViewAnimationOptionRepeat?|?UIViewAnimationOptionAutoreverse)?animations:^?{

view.transform?=?CGAffineTransformRotate(CGAffineTransformIdentity,?RADIANS(5));

}?completion:nil];

}

-?(void)stopAnimate?{

[UIView?animateWithDuration:0.25?delay:0.0?options:(UIViewAnimationOptionAllowUserInteraction?|?UIViewAnimationOptionBeginFromCurrentState?|?UIViewAnimationOptionCurveLinear)?animations:^?{

view.transform?=?CGAffineTransformIdentity;

}?completion:nil];

}

49、修改UISearBar內(nèi)部背景顏色

UITextField?*textField?=?[_searchBar?valueForKey:@"_searchField"];

textField.backgroundColor?=?[UIColor?redColor];

50猜煮、UITextView滾動到頂部

//?方法一

[self.textView?scrollRangeToVisible:NSMakeRange(0,?0)];

//?方法二

[self.textView?setContentOffset:CGPointZero?animated:YES];

51次员、通知監(jiān)聽APP生命周期

UIApplicationDidEnterBackgroundNotification?應(yīng)用程序進(jìn)入后臺

UIApplicationWillEnterForegroundNotification?應(yīng)用程序?qū)⒁M(jìn)入前臺

UIApplicationDidFinishLaunchingNotification?應(yīng)用程序完成啟動

UIApplicationDidFinishLaunchingNotification?應(yīng)用程序由掛起變的活躍

UIApplicationWillResignActiveNotification?應(yīng)用程序掛起(有電話進(jìn)來或者鎖屏)

UIApplicationDidReceiveMemoryWarningNotification?應(yīng)用程序收到內(nèi)存警告

UIApplicationDidReceiveMemoryWarningNotification?應(yīng)用程序終止(后臺殺死、手機關(guān)機等)

UIApplicationSignificantTimeChangeNotification?當(dāng)有重大時間改變(凌晨0點友瘤,設(shè)備時間被修改翠肘,時區(qū)改變等)

UIApplicationWillChangeStatusBarOrientationNotification?設(shè)備方向?qū)⒁淖?/p>

UIApplicationDidChangeStatusBarOrientationNotification?設(shè)備方向改變

UIApplicationWillChangeStatusBarFrameNotification?設(shè)備狀態(tài)欄frame將要改變

UIApplicationDidChangeStatusBarFrameNotification?設(shè)備狀態(tài)欄frame改變

UIApplicationBackgroundRefreshStatusDidChangeNotification?應(yīng)用程序在后臺下載內(nèi)容的狀態(tài)發(fā)生變化

UIApplicationProtectedDataWillBecomeUnavailable?本地受保護(hù)的文件被鎖定,無法訪問

UIApplicationProtectedDataWillBecomeUnavailable?本地受保護(hù)的文件可用了

52、觸摸事件類型

UIControlEventTouchCancel?取消控件當(dāng)前觸發(fā)的事件

UIControlEventTouchDown?點按下去的事件

UIControlEventTouchDownRepeat?重復(fù)的觸動事件

UIControlEventTouchDragEnter?手指被拖動到控件的邊界的事件

UIControlEventTouchDragExit?一個手指從控件內(nèi)拖到外界的事件

UIControlEventTouchDragInside?手指在控件的邊界內(nèi)拖動的事件

UIControlEventTouchDragOutside?手指在控件邊界之外被拖動的事件

UIControlEventTouchUpInside?手指處于控制范圍內(nèi)的觸摸事件

UIControlEventTouchUpOutside?手指超出控制范圍的控制中的觸摸事件

53辫秧、UITextField文字周圍增加邊距

//?子類化UITextField束倍,增加insert屬性

@interface?WZBTextField?:?UITextField

@property?(nonatomic,?assign)?UIEdgeInsets?insets;

@end

//?在.m文件重寫下列方法

-?(CGRect)textRectForBounds:(CGRect)bounds?{

CGRect?paddedRect?=?UIEdgeInsetsInsetRect(bounds,?self.insets);

if?(self.rightViewMode?==?UITextFieldViewModeAlways?||?self.rightViewMode?==?UITextFieldViewModeUnlessEditing)?{

return?[self?adjustRectWithWidthRightView:paddedRect];

}

return?paddedRect;

}

-?(CGRect)placeholderRectForBounds:(CGRect)bounds?{

CGRect?paddedRect?=?UIEdgeInsetsInsetRect(bounds,?self.insets);

if?(self.rightViewMode?==?UITextFieldViewModeAlways?||?self.rightViewMode?==?UITextFieldViewModeUnlessEditing)?{

return?[self?adjustRectWithWidthRightView:paddedRect];

}

return?paddedRect;

}

-?(CGRect)editingRectForBounds:(CGRect)bounds?{

CGRect?paddedRect?=?UIEdgeInsetsInsetRect(bounds,?self.insets);

if?(self.rightViewMode?==?UITextFieldViewModeAlways?||?self.rightViewMode?==?UITextFieldViewModeWhileEditing)?{

return?[self?adjustRectWithWidthRightView:paddedRect];

}

return?paddedRect;

}

-?(CGRect)adjustRectWithWidthRightView:(CGRect)bounds?{

CGRect?paddedRect?=?bounds;

paddedRect.size.width?-=?CGRectGetWidth(self.rightView.frame);

return?paddedRect;

}

54、監(jiān)聽UISlider拖動狀態(tài)

//?添加事件

[slider?addTarget:self?action:@selector(sliderValurChanged:forEvent:)?forControlEvents:UIControlEventValueChanged];

//?實現(xiàn)方法

-?(void)sliderValurChanged:(UISlider*)slider?forEvent:(UIEvent*)event?{

UITouch?*touchEvent?=?[[event?allTouches]?anyObject];

switch?(touchEvent.phase)?{

case?UITouchPhaseBegan:

NSLog(@"開始拖動");

break;

case?UITouchPhaseMoved:

NSLog(@"正在拖動");

break;

case?UITouchPhaseEnded:

NSLog(@"結(jié)束拖動");

break;

default:

break;

}

}

55盟戏、設(shè)置UITextField光標(biāo)位置

//?textField需要設(shè)置的textField绪妹,index要設(shè)置的光標(biāo)位置

-?(void)cursorLocation:(UITextField?*)textField?index:(NSInteger)index

{

NSRange?range?=?NSMakeRange(index,?0);

UITextPosition?*start?=?[textField?positionFromPosition:[textField?beginningOfDocument]?offset:range.location];

UITextPosition?*end?=?[textField?positionFromPosition:start?offset:range.length];

[textField?setSelectedTextRange:[textField?textRangeFromPosition:start?toPosition:end]];

}

56、去除webView底部黑色

[webView?setBackgroundColor:[UIColor?clearColor]];

[webView?setOpaque:NO];

for?(UIView?*v1?in?[webView?subviews])

{

if?([v1?isKindOfClass:[UIScrollView?class]])

{

for?(UIView?*v2?in?v1.subviews)

{

if?([v2?isKindOfClass:[UIImageView?class]])

{

v2.hidden?=?YES;

}

}

}

}

57柿究、獲取collectionViewCell在屏幕中的frame

UICollectionViewLayoutAttributes?*attributes?=?[collectionView?layoutAttributesForItemAtIndexPath:indexPath];

CGRect?cellRect?=?attributes.frame;

CGRect?cellFrameInSuperview?=?[collectionView?convertRect:cellRect?toView:[cv?superview]];

58邮旷、比較兩個UIImage是否相等

-?(BOOL)image:(UIImage?*)image1?isEqualTo:(UIImage?*)image2

{

NSData?*data1?=?UIImagePNGRepresentation(image1);

NSData?*data2?=?UIImagePNGRepresentation(image2);

return?[data1?isEqual:data2];

}

59、解決當(dāng)UIScrollView上有UIButton的時候蝇摸,觸摸到button滑動不了的問題

//?子類化UIScrollView婶肩,并重寫以下方法

-?(instancetype)initWithFrame:(CGRect)frame?{

if?(self?=?[super?initWithFrame:frame])?{

self.delaysContentTouches?=?NO;

}

return?self;

}

-?(BOOL)touchesShouldCancelInContentView:(UIView?*)view?{

if?([view?isKindOfClass:UIButton.class])?{

return?YES;

}

return?[super?touchesShouldCancelInContentView:view];

}

60、UITextView中的文字添加陰影效果

-?(void)setTextLayer:(UITextView?*)textView?color:(UIColor?*)color

{

CALayer?*textLayer?=?((CALayer?*)[textView.layer.sublayers?objectAtIndex:0]);

textLayer.shadowColor?=?color.CGColor;

textLayer.shadowOffset?=?CGSizeMake(0.0f,?1.0f);

textLayer.shadowOpacity?=?1.0f;

textLayer.shadowRadius?=?1.0f;

}

61貌夕、MD5加密

+?(NSString?*)md5:(NSString?*)str

{

const?char?*concat_str?=?[str?UTF8String];

unsigned?char?result[CC_MD5_DIGEST_LENGTH];

CC_MD5(concat_str,?(unsigned?int)strlen(concat_str),?result);

NSMutableString?*hash?=?[NSMutableString?string];

for?(int?i?=0;?i<16;?i++){

[hash?appendFormat:@"X",?result[i]];

}

return?[hash?uppercaseString];

}

62律歼、base64加密

@interface?NSData?(Base64)

/**

*??@brief??字符串base64后轉(zhuǎn)data

*/

+?(NSData?*)dataWithBase64EncodedString:(NSString?*)string

{

if?(![string?length])?return?nil;

NSData?*decoded?=?nil;

#if?__MAC_OS_X_VERSION_MIN_REQUIRED?<?__MAC_10_9?||?__IPHONE_OS_VERSION_MIN_REQUIRED?<?__IPHONE_7_0

if?(![NSData?instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)])

{

#pragma?clang?diagnostic?push

#pragma?clang?diagnostic?ignored?"-Wdeprecated-declarations"

decoded?=?[[self?alloc]?initWithBase64Encoding:[string?stringByReplacingOccurrencesOfString:@"[^A-Za-z0-9+/=]"?withString:@""?options:NSRegularExpressionSearch?range:NSMakeRange(0,?[string?length])]];

#pragma?clang?diagnostic?pop

}

else

#endif

{

decoded?=?[[self?alloc]?initWithBase64EncodedString:string?options:NSDataBase64DecodingIgnoreUnknownCharacters];

}

return?[decoded?length]??decoded:?nil;

}

/**

*??@brief??NSData轉(zhuǎn)string

*??@param?wrapWidth?換行長度??76??64

*/

-?(NSString?*)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth

{

if?(![self?length])?return?nil;

NSString?*encoded?=?nil;

#if?__MAC_OS_X_VERSION_MIN_REQUIRED?<?__MAC_10_9?||?__IPHONE_OS_VERSION_MIN_REQUIRED?<?__IPHONE_7_0

if?(![NSData?instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)])

{

#pragma?clang?diagnostic?push

#pragma?clang?diagnostic?ignored?"-Wdeprecated-declarations"

encoded?=?[self?base64Encoding];

#pragma?clang?diagnostic?pop

}

else

#endif

{

switch?(wrapWidth)

{

case?64:

{

return?[self?base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

}

case?76:

{

return?[self?base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

}

default:

{

encoded?=?[self?base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0];

}

}

}

if?(!wrapWidth?||?wrapWidth?>=?[encoded?length])

{

return?encoded;

}

wrapWidth?=?(wrapWidth?/?4)?*?4;

NSMutableString?*result?=?[NSMutableString?string];

for?(NSUInteger?i?=?0;?i?<?[encoded?length];?i+=?wrapWidth)

{

if?(i?+?wrapWidth?>=?[encoded?length])

{

[result?appendString:[encoded?substringFromIndex:i]];

break;

}

[result?appendString:[encoded?substringWithRange:NSMakeRange(i,?wrapWidth)]];

[result?appendString:@"\r\n"];

}

return?result;

}

/**

*??@brief??NSData轉(zhuǎn)string?換行長度默認(rèn)64

*/

-?(NSString?*)base64EncodedString

{

return?[self?base64EncodedStringWithWrapWidth:0];

}

63、AES加密

#import

@interface?NSData?(AES)

/**

*??利用AES加密數(shù)據(jù)

*/

-?(NSData*)encryptedWithAESUsingKey:(NSString*)key?andIV:(NSData*)iv?{

NSData?*keyData?=?[key?dataUsingEncoding:NSUTF8StringEncoding];

size_t?dataMoved;

NSMutableData?*encryptedData?=?[NSMutableData?dataWithLength:self.length?+?kCCBlockSizeAES128];

CCCryptorStatus?status?=?CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,encryptedData.mutableBytes,?encryptedData.length,&dataMoved);

if?(status?==?kCCSuccess)?{

encryptedData.length?=?dataMoved;

return?encryptedData;

}

return?nil;

}

/**

*??@brief??利用AES解密據(jù)

*/

-?(NSData*)decryptedWithAESUsingKey:(NSString*)key?andIV:(NSData*)iv?{

NSData?*keyData?=?[key?dataUsingEncoding:NSUTF8StringEncoding];

size_t?dataMoved;

NSMutableData?*decryptedData?=?[NSMutableData?dataWithLength:self.length?+?kCCBlockSizeAES128];

CCCryptorStatus?result?=?CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,decryptedData.mutableBytes,?decryptedData.length,&dataMoved);

if?(result?==?kCCSuccess)?{

decryptedData.length?=?dataMoved;

return?decryptedData;

}

return?nil;

}

64啡专、3DES加密

#import

@interface?NSData?(3DES)

/**

*??利用3DES加密數(shù)據(jù)

*/

-?(NSData*)encryptedWith3DESUsingKey:(NSString*)key?andIV:(NSData*)iv?{

NSData?*keyData?=?[key?dataUsingEncoding:NSUTF8StringEncoding];

size_t?dataMoved;

NSMutableData?*encryptedData?=?[NSMutableData?dataWithLength:self.length?+?kCCBlockSize3DES];

CCCryptorStatus?result?=?CCCrypt(kCCEncrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,encryptedData.mutableBytes,encryptedData.length,&dataMoved);

if?(result?==?kCCSuccess)?{

encryptedData.length?=?dataMoved;

return?encryptedData;

}

return?nil;

}

/**

*??@brief???利用3DES解密數(shù)據(jù)

*/

-?(NSData*)decryptedWith3DESUsingKey:(NSString*)key?andIV:(NSData*)iv?{

NSData?*keyData?=?[key?dataUsingEncoding:NSUTF8StringEncoding];

size_t?dataMoved;

NSMutableData?*decryptedData?=?[NSMutableData?dataWithLength:self.length?+?kCCBlockSize3DES];

CCCryptorStatus?result?=?CCCrypt(kCCDecrypt,kCCAlgorithm3DES,kCCOptionPKCS7Padding,keyData.bytes,keyData.length,iv.bytes,self.bytes,self.length,decryptedData.mutableBytes,decryptedData.length,&dataMoved);

if?(result?==?kCCSuccess)?{

decryptedData.length?=?dataMoved;

return?decryptedData;

}

return?nil;

}

65险毁、單個頁面多個網(wǎng)絡(luò)請求的情況,需要監(jiān)聽所有網(wǎng)絡(luò)請求結(jié)束后刷新UI

dispatch_group_t?group?=?dispatch_group_create();

dispatch_queue_t?serialQueue?=?dispatch_queue_create("com.wzb.test.www",?DISPATCH_QUEUE_SERIAL);

dispatch_group_enter(group);

dispatch_group_async(group,?serialQueue,?^{

//?網(wǎng)絡(luò)請求一

[WebClick?getDataSuccess:^(ResponseModel?*model)?{

dispatch_group_leave(group);

}?failure:^(NSString?*err)?{

dispatch_group_leave(group);

}];

});

dispatch_group_enter(group);

dispatch_group_async(group,?serialQueue,?^{

//?網(wǎng)絡(luò)請求二

[WebClick?getDataSuccess:getBigTypeRM?onSuccess:^(ResponseModel?*model)?{

dispatch_group_leave(group);

}??????????????????????????????????failure:^(NSString?*errorString)?{

dispatch_group_leave(group);

}];

});

dispatch_group_enter(group);

dispatch_group_async(group,?serialQueue,?^{

//?網(wǎng)絡(luò)請求三

[WebClick?getDataSuccess:^{

dispatch_group_leave(group);

}?failure:^(NSString?*errorString)?{

dispatch_group_leave(group);

}];

});

//?所有網(wǎng)絡(luò)請求結(jié)束后會來到這個方法

dispatch_group_notify(group,?serialQueue,?^{

dispatch_async(dispatch_get_global_queue(0,?0),?^{

dispatch_async(dispatch_get_main_queue(),?^{

//?刷新UI

});

});

});

66、解決openUrl延時問題

//?方法一

dispatch_async(dispatch_get_main_queue(),?^{

UIApplication?*application?=?[UIApplication?sharedApplication];

if?([application?respondsToSelector:@selector(openURL:options:completionHandler:)])?{

[application?openURL:URL?options:@{}

completionHandler:nil];

}?else?{

[application?openURL:URL];

}

});

//?方法二

[self?performSelector:@selector(redirectToURL:)?withObject:url?afterDelay:0.1];

-?(void)?redirectToURL

{

UIApplication?*application?=?[UIApplication?sharedApplication];

if?([application?respondsToSelector:@selector(openURL:options:completionHandler:)])?{

[application?openURL:URL?options:@{}

completionHandler:nil];

}?else?{

[application?openURL:URL];

}

}

67畔况、頁面跳轉(zhuǎn)實現(xiàn)翻轉(zhuǎn)動畫

//?modal方式

TestViewController?*vc?=?[[TestViewController?alloc]?init];

vc.view.backgroundColor?=?[UIColor?redColor];

vc.modalTransitionStyle?=?UIModalTransitionStyleCoverVertical;

[self?presentViewController:vc?animated:YES?completion:nil];

//?push方式

TestViewController?*vc?=?[[TestViewController?alloc]?init];

vc.view.backgroundColor?=?[UIColor?redColor];

[UIView?beginAnimations:@"View?Flip"?context:nil];

[UIView?setAnimationDuration:0.80];

[UIView?setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView?setAnimationTransition:UIViewAnimationTransitionFlipFromRight?forView:self.navigationController.view?cache:NO];

[self.navigationController?pushViewController:vc?animated:YES];

[UIView?commitAnimations];

68鲸鹦、tableView實現(xiàn)無限滾動

-?(void)scrollViewDidScroll:(UIScrollView?*)scrollView

{

CGFloat?actualPosition?=?scrollView.contentOffset.y;

CGFloat?contentHeight?=?scrollView.contentSize.height?-?scrollView.frame.size.height;

if?(actualPosition?>=?contentHeight)?{

[self.dataArr?addObjectsFromArray:self.dataArr];

[self.tableView?reloadData];

}

}

69、代碼方式調(diào)整屏幕亮度

//?brightness屬性值在0-1之間跷跪,0代表最小亮度馋嗜,1代表最大亮度

[[UIScreen?mainScreen]?setBrightness:0.5];

70、獲取當(dāng)前應(yīng)用CUP用量

float?cpu_usage()

{

kern_return_t?kr;

task_info_data_t?tinfo;

mach_msg_type_number_t?task_info_count;

task_info_count?=?TASK_INFO_MAX;

kr?=?task_info(mach_task_self(),?TASK_BASIC_INFO,?(task_info_t)tinfo,?&task_info_count);

if?(kr?!=?KERN_SUCCESS)?{

return?-1;

}

task_basic_info_t??????basic_info;

thread_array_t?????????thread_list;

mach_msg_type_number_t?thread_count;

thread_info_data_t?????thinfo;

mach_msg_type_number_t?thread_info_count;

thread_basic_info_t?basic_info_th;

uint32_t?stat_thread?=?0;?//?Mach?threads

basic_info?=?(task_basic_info_t)tinfo;

//?get?threads?in?the?task

kr?=?task_threads(mach_task_self(),?&thread_list,?&thread_count);

if?(kr?!=?KERN_SUCCESS)?{

return?-1;

}

if?(thread_count?>?0)

stat_thread?+=?thread_count;

long?tot_sec?=?0;

long?tot_usec?=?0;

float?tot_cpu?=?0;

int?j;

for?(j?=?0;?j?<?(int)thread_count;?j++)

{

thread_info_count?=?THREAD_INFO_MAX;

kr?=?thread_info(thread_list[j],?THREAD_BASIC_INFO,

(thread_info_t)thinfo,?&thread_info_count);

if?(kr?!=?KERN_SUCCESS)?{

return?-1;

}

basic_info_th?=?(thread_basic_info_t)thinfo;

if?(!(basic_info_th->flags?&?TH_FLAGS_IDLE))?{

tot_sec?=?tot_sec?+?basic_info_th->user_time.seconds?+?basic_info_th->system_time.seconds;

tot_usec?=?tot_usec?+?basic_info_th->user_time.microseconds?+?basic_info_th->system_time.microseconds;

tot_cpu?=?tot_cpu?+?basic_info_th->cpu_usage?/?(float)TH_USAGE_SCALE?*?100.0;

}

}?//?for?each?thread

kr?=?vm_deallocate(mach_task_self(),?(vm_offset_t)thread_list,?thread_count?*?sizeof(thread_t));

assert(kr?==?KERN_SUCCESS);

return?tot_cpu;

}

71域庇、float數(shù)據(jù)取整四舍五入

CGFloat?f?=?4.65;

NSLog(@"%d",?(int)f);????//?打印結(jié)果4

CGFloat?f?=?4.65;

NSLog(@"%d",?(int)round(f));????//?打印結(jié)果5

72嵌戈、刪除UISearchBar系統(tǒng)默認(rèn)邊框

//?方法一

searchBar.searchBarStyle?=?UISearchBarStyleMinimal;

//?方法二

[searchBar?setBackgroundImage:[[UIImage?alloc]init]];

//?方法三

searchBar.barTintColor?=?[UIColor?whiteColor];

73、為UICollectionViewCell設(shè)置圓角和陰影

cell.contentView.layer.cornerRadius?=?2.0f;

cell.contentView.layer.borderWidth?=?1.0f;

cell.contentView.layer.borderColor?=?[UIColor?clearColor].CGColor;

cell.contentView.layer.masksToBounds?=?YES;

cell.layer.shadowColor?=?[UIColor?lightGrayColor].CGColor;

cell.layer.shadowOffset?=?CGSizeMake(0,?2.0f);

cell.layer.shadowRadius?=?2.0f;

cell.layer.shadowOpacity?=?1.0f;

cell.layer.masksToBounds?=?NO;

cell.layer.shadowPath?=?[UIBezierPath?bezierPathWithRoundedRect:cell.bounds?cornerRadius:cell.contentView.layer.cornerRadius].CGPath;

74听皿、讓正在滑動的scrollView停止?jié)L動(不是禁止,而是暫時停止?jié)L動)

[scrollView?setContentOffset:scrollView.contentOffset?animated:NO];

75宽档、使用xib設(shè)置UIView的邊框尉姨、圓角

圓角和邊框看下圖即可設(shè)置

xib設(shè)置圓角邊框.png

但是增加layer.borderColor的keyPath設(shè)置邊框顏色并不能起作用,后來查了資料吗冤,這里應(yīng)該用layer.borderUIColor又厉,但是這里設(shè)置的顏色不起作用,無論設(shè)置什么顏色顯示出來的都是黑色的椎瘟。后來又去查了下覆致,有種解決方案是給CALayer添加一個分類,提供一個 - (void)setBorderUIColor:(UIColor *)color;方法就可以解決了肺蔚,實現(xiàn)如下:

xib設(shè)置邊框顏色.png

#import?"CALayer+BorderColor.h"

@implementation?CALayer?(BorderColor)

-?(void)setBorderUIColor:(UIColor?*)color

{

self.borderColor?=?color.CGColor;

}

76煌妈、根據(jù)經(jīng)緯度獲取城市等信息

//?創(chuàng)建經(jīng)緯度

CLLocation?*location?=?[[CLLocation?alloc]?initWithLatitude:latitude?longitude:longitude];

//創(chuàng)建一個譯碼器

CLGeocoder?*cLGeocoder?=?[[CLGeocoder?alloc]?init];

[cLGeocoder?reverseGeocodeLocation:userLocation?completionHandler:^(NSArray?*placemarks,?NSError?*error)?{

CLPlacemark?*place?=?[placemarks?objectAtIndex:0];

//?位置名

NSLog(@"name,%@",place.name);

//?街道

NSLog(@"thoroughfare,%@",place.thoroughfare);

//?子街道

NSLog(@"subThoroughfare,%@",place.subThoroughfare);

//?市

NSLog(@"locality,%@",place.locality);

//?區(qū)

NSLog(@"subLocality,%@",place.subLocality);

//?國家

NSLog(@"country,%@",place.country);

}

}];

/*??CLPlacemark中屬性含義

name????????????????????地名

thoroughfare????????????街道

subThoroughfare????????街道相關(guān)信息,例如門牌等

locality????????????????城市

subLocality????????????城市相關(guān)信息宣羊,例如標(biāo)志性建筑

administrativeArea??????直轄市

subAdministrativeArea??其他行政區(qū)域信息(自治區(qū)等)

postalCode??????????????郵編

ISOcountryCode??????????國家編碼

country????????????????國家

inlandWater????????????水源璧诵,湖泊

ocean??????????????????海洋

areasOfInterest????????關(guān)聯(lián)的或利益相關(guān)的地標(biāo)

*/

77、如何防止添加多個NSNotification觀察者仇冯?

//?解決方案就是添加觀察者之前先移除下這個觀察者

[[NSNotificationCenter?defaultCenter]?removeObserver:observer?name:name?object:object];

[[NSNotificationCenter?defaultCenter]?addObserver:observer?selector:selector?name:name?object:object];

78之宿、將一個xib添加到另外一個xib上

//?假設(shè)你的自定義view名字為CustomView,你需要在CustomView.m中重寫?`-?(instancetype)initWithCoder:(NSCoder?*)aDecoder`?方法苛坚,代碼如下:

-?(instancetype)initWithCoder:(NSCoder?*)aDecoder?{

if?((self?=?[super?initWithCoder:aDecoder]))?{

[self?addSubview:[[[NSBundle?mainBundle]?loadNibNamed:@"CustomView"?owner:self?options:nil]?objectAtIndex:0]];

}

return?self;

}

將一個xib添加到另外一個xib上.png

79比被、處理字符串,使其首字母大寫

NSString?*str?=?@"abcdefghijklmn";

NSString?*resultStr;

if?(str?&&?str.length?>?0)?{

resultStr?=?[str?stringByReplacingCharactersInRange:NSMakeRange(0,1)?withString:[[str?substringToIndex:1]?capitalizedString]];

}

NSLog(@"%@",?resultStr);

80泼舱、判斷一個UIAlertView/UIAlertController是否顯示

//?UIAlertView自帶屬性

if?(alert.visible)

{

NSLog(@"顯示了");

}?else?{

NSLog(@"未顯示");

}

//?UIAlertController沒有visible屬性等缀,需要自己判斷,添加一個全局變量?BOOL?visible

UIAlertController?*alertController?=?[UIAlertController?alertControllerWithTitle:@"Title"?message:@"message"?preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction?*alertAction?=?[UIAlertAction?actionWithTitle:@"ActionTitle"?style:UIAlertActionStyleDefault?handler:^(UIAlertAction?*?_Nonnull?action)?{

self.visible?=?NO;

}];

UIAlertAction?*calcelAction?=?[UIAlertAction?actionWithTitle:@"calcelTitle"?style:UIAlertActionStyleCancel?handler:^(UIAlertAction?*?_Nonnull?action)?{

self.visible?=?NO;

}];

[alertController?addAction:alertAction];

[alertController?addAction:calcelAction];

[self?presentViewController:alertController?animated:YES?completion:^{

self.visible?=?YES;

}];

81柠掂、獲取字符串中的數(shù)字

-?(NSString?*)getNumberFromStr:(NSString?*)str

{

NSCharacterSet?*nonDigitCharacterSet?=?[[NSCharacterSet?decimalDigitCharacterSet]?invertedSet];

return?[[str?componentsSeparatedByCharactersInSet:nonDigitCharacterSet]?componentsJoinedByString:@""];

}

6

NSLog(@"%@",?[self?getNumberFromStr:@"a0b0c1d2e3f4fda8fa8fad9fsad23"]);?//?00123488923

82项滑、為UIView的某個方向添加邊框

//?添加UIView分類

//?UIView+WZB.h

#import

/**

邊框方向

-?WZBBorderDirectionTop:?頂部

-?WZBBorderDirectionLeft:?左邊

-?WZBBorderDirectionBottom:?底部

-?WZBBorderDirectionRight:?右邊

*/

typedef?NS_ENUM(NSInteger,?WZBBorderDirectionType)?{

WZBBorderDirectionTop?=?0,

WZBBorderDirectionLeft,

WZBBorderDirectionBottom,

WZBBorderDirectionRight

};

@interface?UIView?(WZB)

/**

為UIView的某個方向添加邊框

@param?direction?邊框方向

@param?color?邊框顏色

@param?width?邊框?qū)挾?/p>

*/

-?(void)wzb_addBorder:(WZBBorderDirectionType)direction?color:(UIColor?*)color?width:(CGFloat)width;

@end

//?UIView+WZB.m

#import?"UIView+WZB.h"

@implementation?UIView?(WZB)

-?(void)wzb_addBorder:(WZBBorderDirectionType)direction?color:(UIColor?*)color?width:(CGFloat)width

{

CALayer?*border?=?[CALayer?layer];

border.backgroundColor?=?color.CGColor;

switch?(direction)?{

case?WZBBorderDirectionTop:

{

border.frame?=?CGRectMake(0.0f,?0.0f,?self.bounds.size.width,?width);

}

break;

case?WZBBorderDirectionLeft:

{

border.frame?=?CGRectMake(0.0f,?0.0f,?width,?self.bounds.size.height);

}

break;

case?WZBBorderDirectionBottom:

{

border.frame?=?CGRectMake(0.0f,?self.bounds.size.height?-?width,?self.bounds.size.width,?width);

}

break;

case?WZBBorderDirectionRight:

{

border.frame?=?CGRectMake(self.bounds.size.width?-?width,?0,?width,?self.bounds.size.height);

}

break;

default:

break;

}

[self.layer?addSublayer:border];

}

83、通過屬性設(shè)置UISwitch、UIProgressView等控件的寬高

mySwitch.transform?=?CGAffineTransformMakeScale(5.0f,?5.0f);

progressView.transform?=?CGAffineTransformMakeScale(5.0f,?5.0f);

84枪狂、自動搜索功能危喉,用戶連續(xù)輸入的時候不搜索,用戶停止輸入的時候自動搜索(我這里設(shè)置的是0.5s州疾,可根據(jù)需求更改)

//?輸入框文字改變的時候調(diào)用

-(void)searchBar:(UISearchBar?*)searchBar?textDidChange:(NSString?*)searchText{

//?先取消調(diào)用搜索方法

[NSObject?cancelPreviousPerformRequestsWithTarget:self?selector:@selector(searchNewResult)?object:nil];

//?0.5秒后調(diào)用搜索方法

[self?performSelector:@selector(searchNewResult)?withObject:nil?afterDelay:0.5];

}

85辜限、修改UISearchBar的占位文字顏色

//?方法一(推薦使用)

UITextField?*searchField?=?[searchBar?valueForKey:@"_searchField"];

[searchField?setValue:[UIColor?blueColor]?forKeyPath:@"_placeholderLabel.textColor"];

//?方法二(已過期)

[[UILabel?appearanceWhenContainedIn:[UISearchBar?class],?nil]?setTextColor:[UIColor?redColor]];

//?方法三(已過期)

NSDictionary?*placeholderAttributes?=?@{NSForegroundColorAttributeName?:?[UIColor?redColor],?NSFontAttributeName?:?[UIFont?fontWithName:@"HelveticaNeue"?size:15],};

NSAttributedString?*attributedPlaceholder?=?[[NSAttributedString?alloc]?initWithString:searchBar.placeholder?attributes:placeholderAttributes];

[[UITextField?appearanceWhenContainedIn:[UISearchBar?class],?nil]?setAttributedPlaceholder:attributedPlaceholder];

86、某個界面多個事件同時響應(yīng)引起的問題(比如严蓖,兩個button同時按push到新界面薄嫡,兩個都會響應(yīng),可能導(dǎo)致push重疊)

//?UIView有個屬性叫做exclusiveTouch颗胡,設(shè)置為YES后毫深,其響應(yīng)事件會和其他view互斥(有其他view事件響應(yīng)的時候點擊它不起作用)

view.exclusiveTouch?=?YES;

//?一個一個設(shè)置太麻煩了,可以全局設(shè)置

[[UIView?appearance]?setExclusiveTouch:YES];

//?或者只設(shè)置button

[[UIButton?appearance]?setExclusiveTouch:YES];

87毒姨、修改tabBar的frame

//?子類化UITabBarViewController哑蔫,我這里以修改tabBar高度為例,重寫viewWillLayoutSubviews方法

#import?"WZBTabBarViewController.h"

@interface?WZBTabBarViewController?()

@end

@implementation?WZBTabBarViewController

-?(void)viewWillLayoutSubviews?{

CGRect?tabFrame?=?self.tabBar.frame;

tabFrame.size.height?=?100;

tabFrame.origin.y?=?self.view.frame.size.height?-?100;

self.tabBar.frame?=?tabFrame;

}

@end

88弧呐、修改鍵盤背景顏色

//?設(shè)置某個鍵盤顏色

textField.keyboardAppearance?=?UIKeyboardAppearanceAlert;

//?設(shè)置工程中所有鍵盤顏色

[[UITextField?appearance]?setKeyboardAppearance:UIKeyboardAppearanceAlert];

89闸迷、修改image顏色

UIImage?*image?=?[UIImage?imageNamed:@"test"];

imageView.image?=?[image?imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

CGRect?rect?=?CGRectMake(0,?0,?image.size.width,?image.size.height);

UIGraphicsBeginImageContext(rect.size);

CGContextRef?context?=?UIGraphicsGetCurrentContext();

CGContextClipToMask(context,?rect,?image.CGImage);

CGContextSetFillColorWithColor(context,?[[UIColor?redColor]?CGColor]);

CGContextFillRect(context,?rect);

UIImage?*img?=?UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImage?*flippedImage?=?[UIImage?imageWithCGImage:img.CGImage?scale:1.0?orientation:?UIImageOrientationDownMirrored];

imageView.image?=?flippedImage;

90、動畫執(zhí)行removeFromSuperview

[UIView?animateWithDuration:0.2

animations:^{

view.alpha?=?0.0f;

}?completion:^(BOOL?finished){

[view?removeFromSuperview];

}];

91俘枫、設(shè)置UIButton高亮背景顏色

[UIView?animateWithDuration:0.2

animations:^{

view.alpha?=?0.0f;

}?completion:^(BOOL?finished){

[view?removeFromSuperview];

}];

92腥沽、設(shè)置UIButton高亮?xí)r的背景顏色

//?方法一、子類化UIButton鸠蚪,重寫setHighlighted:方法今阳,代碼如下

#import?"WZBButton.h"

@implementation?WZBButton

-?(void)setHighlighted:(BOOL)highlighted?{

[super?setHighlighted:highlighted];

UIColor?*normalColor?=?[UIColor?greenColor];

UIColor?*highlightedColor?=?[UIColor?redColor];

self.backgroundColor?=?highlighted???highlightedColor?:?normalColor;

}

//?方法二、利用setBackgroundImage:forState:方法

[button?setBackgroundImage:[self?imageWithColor:[UIColor?blueColor]]?forState:UIControlStateHighlighted];

-?(UIImage?*)imageWithColor:(UIColor?*)color?{

CGRect?rect?=?CGRectMake(0.0f,?0.0f,?1.0f,?1.0f);

UIGraphicsBeginImageContext(rect.size);

CGContextRef?context?=?UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context,?[color?CGColor]);

CGContextFillRect(context,?rect);

UIImage?*image?=?UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return?image;

}

93邓嘹、關(guān)于圖片拉伸

推薦看這個博客酣栈,講的很詳細(xì):http://blog.csdn.net/q199109106q/article/details/8615661

94、利用runtime獲取一個類所有屬性

-?(NSArray?*)allPropertyNames:(Class)aClass

{

unsigned?count;

objc_property_t?*properties?=?class_copyPropertyList(aClass,?&count);

NSMutableArray?*rv?=?[NSMutableArray?array];

unsigned?i;

for?(i?=?0;?i?<?count;?i++)

{

objc_property_t?property?=?properties[i];

NSString?*name?=?[NSString?stringWithUTF8String:property_getName(property)];

[rv?addObject:name];

}

free(properties);

return?rv;

}

95汹押、設(shè)置textView的某段文字變成其他顏色

-?(void)setupTextView:(UITextView?*)textView?text:(NSString?*)text?color:(UIColor?*)color?{

NSMutableAttributedString?*string?=?[[NSMutableAttributedString?alloc]initWithString:textView.text];

[string?addAttribute:NSForegroundColorAttributeName?value:color?range:[textView.text?rangeOfString:text]];

[textView?setAttributedText:string];

}

96矿筝、讓push跳轉(zhuǎn)動畫像modal跳轉(zhuǎn)動畫那樣效果(從下往上推上來)

-?(void)push

{

TestViewController?*vc?=?[[TestViewController?alloc]?init];

vc.view.backgroundColor?=?[UIColor?redColor];

CATransition*?transition?=?[CATransition?animation];

transition.duration?=?0.4f;

transition.type?=?kCATransitionMoveIn;

transition.subtype?=?kCATransitionFromTop;

[self.navigationController.view.layer?addAnimation:transition?forKey:kCATransition];

[self.navigationController?pushViewController:vc?animated:NO];

}

-?(void)pop

{

CATransition*?transition?=?[CATransition?animation];

transition.duration?=?0.4f;

transition.type?=?kCATransitionReveal;

transition.subtype?=?kCATransitionFromBottom;

[self.navigationController.view.layer?addAnimation:transition?forKey:kCATransition];

[self.navigationController?popViewControllerAnimated:NO];

}

97、上傳圖片太大棚贾,壓縮圖片

-(UIImage?*)resizeImage:(UIImage?*)image

{

float?actualHeight?=?image.size.height;

float?actualWidth?=?image.size.width;

float?maxHeight?=?300.0;

float?maxWidth?=?400.0;

float?imgRatio?=?actualWidth/actualHeight;

float?maxRatio?=?maxWidth/maxHeight;

float?compressionQuality?=?0.5;//50?percent?compression

if?(actualHeight?>?maxHeight?||?actualWidth?>?maxWidth)

{

if(imgRatio?<?maxRatio)

{

//adjust?width?according?to?maxHeight

imgRatio?=?maxHeight?/?actualHeight;

actualWidth?=?imgRatio?*?actualWidth;

actualHeight?=?maxHeight;

}

else?if(imgRatio?>?maxRatio)

{

//adjust?height?according?to?maxWidth

imgRatio?=?maxWidth?/?actualWidth;

actualHeight?=?imgRatio?*?actualHeight;

actualWidth?=?maxWidth;

}

else

{

actualHeight?=?maxHeight;

actualWidth?=?maxWidth;

}

}

CGRect?rect?=?CGRectMake(0.0,?0.0,?actualWidth,?actualHeight);

UIGraphicsBeginImageContext(rect.size);

[image?drawInRect:rect];

UIImage?*img?=?UIGraphicsGetImageFromCurrentImageContext();

NSData?*imageData?=?UIImageJPEGRepresentation(img,?compressionQuality);

UIGraphicsEndImageContext();

return?[UIImage?imageWithData:imageData];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窖维,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妙痹,更是在濱河造成了極大的恐慌铸史,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怯伊,死亡現(xiàn)場離奇詭異琳轿,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門崭篡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪哄,“玉大人,你說我怎么就攤上這事琉闪〖A叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵颠毙,是天一觀的道長斯入。 經(jīng)常有香客問我蛀蜜,道長闹伪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任硕旗,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘初茶。我一直安慰自己搁宾,他們只是感情好奸忽,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布疙筹。 她就那樣靜靜地躺著幕袱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天哀托,我揣著相機與錄音,去河邊找鬼添坊。 笑死阳准,一個胖子當(dāng)著我的面吹牛绕沈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播操漠,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼浊伙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了长捧?” 一聲冷哼從身側(cè)響起嚣鄙,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎串结,沒想到半個月后哑子,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舅列,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年卧蜓,在試婚紗的時候發(fā)現(xiàn)自己被綠了帐要。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弥奸,死狀恐怖榨惠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盛霎,我是刑警寧澤赠橙,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站摩渺,受9級特大地震影響简烤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摇幻,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一横侦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绰姻,春花似錦枉侧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帜矾,卻和暖如春翼虫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡萤。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工珍剑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人死陆。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓招拙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親措译。 傳聞我的和親對象是個殘疾皇子别凤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容