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