在實(shí)際的開發(fā)中掌握一些小的開發(fā)技巧哆料,往往會(huì)讓你的開發(fā)效率顯著提升。下面是我自己總結(jié)的一些小的開發(fā)技巧吗铐,希望對(duì)感興趣的小伙伴有些幫助东亦。
1.在開發(fā)中判斷字符串是否為空的正確姿勢(shì)
// IOS 開發(fā)中判斷字符串是否為空字符的方法
- (BOOL)isBlankString:(id)string {
if (!string)
{
return YES;
}
if ([string isKindOfClass:[NSNull class]])
{
return YES;
}
if ([string isKindOfClass:[NSString class]] && [string isEqualToString:@"(null)"])
{
return YES;
}
if ([string isKindOfClass:[NSString class]] && [string isEqualToString:@"<null>"])
{
return YES;
}
if ([string isKindOfClass:[NSString class]] && [string length]==0)
{
return YES;
}
if ([string isKindOfClass:[NSString class]] && [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0)
{
return YES;
}
return NO;
}
2.在Xcode工程中創(chuàng)建多個(gè)target
在實(shí)際的項(xiàng)目里往往需要配置不同的開發(fā)環(huán)境(分別是:生產(chǎn)環(huán)境、測(cè)試環(huán)境唬渗、開發(fā)環(huán)境)典阵,每次項(xiàng)目進(jìn)行環(huán)境切換的時(shí)候,對(duì)應(yīng)的修改各種配置會(huì)十分麻煩镊逝,如果在項(xiàng)目里創(chuàng)建多個(gè)target分別是:生產(chǎn)環(huán)境壮啊、測(cè)試環(huán)境、開發(fā)環(huán)境)撑蒜,每個(gè)target對(duì)應(yīng)一個(gè)環(huán)境歹啼,并配置不同的info.plist文件,這樣做的好處是不用開發(fā)人員每次都要去手動(dòng)開啟/注釋某些代碼去發(fā)布座菠,而是先配置好狸眼,到時(shí)候直接切換target就可以打包上線了。
下面是圖文教程
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
第八步:
最后一步: 在項(xiàng)目配置文件中辈灼。配置對(duì)應(yīng)的宏定義就能實(shí)現(xiàn)切換不同的target,實(shí)現(xiàn)不同的環(huán)境配置份企。
附上github中的對(duì)應(yīng)鏈接
3.如何快速的查看一段代碼的執(zhí)行時(shí)間。
#define StartTime NSDate *startTime = [NSDate date]
#define EndTime NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])
在想要查看執(zhí)行時(shí)間的代碼的地方進(jìn)行這么處理
StartTime
//do your work here
EndTime
4.判斷一個(gè)類的實(shí)例是不是某類的子類或就是某類巡莹,使用isKindOfClass司志。
假如類B繼承于類A甜紫,如下:
B *objB = [[B alloc] init];
BOOL rev = [objB inKindOfClass:[A class]]; //判斷實(shí)例對(duì)象objB是否是類A的子類或就是類A
//如果rev=YES則表示實(shí)例對(duì)象objB是類A的子類或類A
BOOL rev = [objB isMemberOfClass:[A class]]; //判斷實(shí)例對(duì)象objB是否是類A,結(jié)果rev=NO
BOOL rev = [objB isMemberOfClass:[B class]]; //判斷實(shí)例對(duì)象objB是否是類B骂远,結(jié)果rev=YES
//isSubclassOfClass等同于inKindOfClass囚霸,是判斷一個(gè)類是否是某類的子類或就是某類,但它是類方法激才,適用于類間判斷
BOOL rev = [B isSubclassOfClass:[A class]]; //判斷類B是否是類A的子類或就是類A拓型,結(jié)果rev=YES
BOOL rev = [B isSubclassOfClass:[B class]]; //判斷類B是否是類A的子類或就是類A,結(jié)果rev=YES
5.判斷一個(gè)類是否是UIWindow的rootViewController
方式一:
UIViewController *vc = self.window.rootViewController;
//判斷如果是在登錄頁面瘸恼,那么不進(jìn)行跳轉(zhuǎn)
if ([vc isKindOfClass:[LoginViewController class]]) {
return;
}
方式二:
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if ([window.rootViewController isKindOfClass:[LoginViewController class]]) {
return;
}
6.刪除所有NSUserDefaults記錄
//方法一
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
//方法二
- (void)resetDefaults
{
NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
NSDictionary * dict = [defs dictionaryRepresentation];
for (id key in dict)
{
[defs removeObjectForKey:key];
}
[defs synchronize];
}
7.獲取某個(gè)view所在的控制器
- (UIViewController *)viewController
{
UIViewController *viewController = nil;
UIResponder *next = self.nextResponder;
while (next)
{
if ([next isKindOfClass:[UIViewController class]])
{
viewController = (UIViewController *)next;
break;
}
next = next.nextResponder;
}
return viewController;
}
8.獲取圖片某一點(diǎn)的顏色
- (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image
{
UIColor* color = nil;
CGImageRef inImage = image.CGImage;
CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
if (cgctx == NULL) {
return nil; /* error */
}
size_t w = CGImageGetWidth(inImage);
size_t h = CGImageGetHeight(inImage);
CGRect rect = {{0,0},{w,h}};
CGContextDrawImage(cgctx, rect, inImage);
unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
int offset = 4*((w*round(point.y))+round(point.x));
int alpha = data[offset];
int red = data[offset+1];
int green = data[offset+2];
int blue = data[offset+3];
color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:
(blue/255.0f) alpha:(alpha/255.0f)];
}
CGContextRelease(cgctx);
if (data) {
free(data);
}
return color;
}
9.禁止鎖屏
默認(rèn)情況下劣挫,當(dāng)設(shè)備一段時(shí)間沒有觸控動(dòng)作時(shí),ios會(huì)鎖住屏幕东帅。但有一些應(yīng)用是不需要鎖屏的压固,比如視頻播放器。
[UIApplication sharedApplication].idleTimerDisabled = YES;
或
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
10.手動(dòng)更改iOS狀態(tài)欄的顏色
- (void)setStatusBarBackgroundColor:(UIColor *)color
{
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)])
{
statusBar.backgroundColor = color;
}
}
11.判斷當(dāng)前ViewController是push還是present的方式顯示的
NSArray *viewcontrollers=self.navigationController.viewControllers;
if (viewcontrollers.count > 1)
{
if ([viewcontrollers objectAtIndex:viewcontrollers.count - 1] == self)
{
//push方式
[self.navigationController popViewControllerAnimated:YES];
}
}
else
{
//present方式
[self dismissViewControllerAnimated:YES completion:nil];
}
12.修改UITextField中Placeholder的文字顏色
[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
修改UITextField中Placeholder的文字大小
[textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];
13.CocoaPods pod install/pod update更新慢的問題
pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
//如果不加后面的參數(shù)靠闭,默認(rèn)會(huì)升級(jí)CocoaPods的spec倉庫帐我,加一個(gè)參數(shù)可以省略這一步,然后速度就會(huì)提升不少
14.GCD timer定時(shí)器
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執(zhí)行
dispatch_source_set_event_handler(timer, ^{
//@"倒計(jì)時(shí)結(jié)束愧膀,關(guān)閉"
dispatch_source_cancel(timer);
dispatch_async(dispatch_get_main_queue(), ^{
});
});
dispatch_resume(timer);
15.圖片上繪制文字 寫一個(gè)UIImage的category
- (UIImage *)imageWithTitle:(NSString *)title fontSize:(CGFloat)fontSize
{
//畫布大小
CGSize size=CGSizeMake(self.size.width,self.size.height);
//創(chuàng)建一個(gè)基于位圖的上下文
UIGraphicsBeginImageContextWithOptions(size,NO,0.0);//opaque:NO scale:0.0
[self drawAtPoint:CGPointMake(0.0,0.0)];
//文字居中顯示在畫布上
NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
paragraphStyle.alignment=NSTextAlignmentCenter;//文字居中
//計(jì)算文字所占的size,文字居中顯示在畫布上
CGSize sizeText=[title boundingRectWithSize:self.size options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}context:nil].size;
CGFloat width = self.size.width;
CGFloat height = self.size.height;
CGRect rect = CGRectMake((width-sizeText.width)/2, (height-sizeText.height)/2, sizeText.width, sizeText.height);
//繪制文字
[title drawInRect:rect withAttributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSForegroundColorAttributeName:[ UIColor whiteColor],NSParagraphStyleAttributeName:paragraphStyle}];
//返回繪制的新圖形
UIImage *newImage= UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
16查找一個(gè)視圖的所有子視圖
- (NSMutableArray *)allSubViewsForView:(UIView *)view
{
NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
for (UIView *subView in view.subviews)
{
[array addObject:subView];
if (subView.subviews.count > 0)
{
[array addObjectsFromArray:[self allSubViewsForView:subView]];
}
}
return array;
}
17.UIView設(shè)置部分圓角
你是不是也遇到過這樣的問題拦键,一個(gè)button或者label,只要右邊的兩個(gè)角圓角檩淋,或者只要一個(gè)圓角芬为。該怎么辦呢。這就需要圖層蒙版來幫助我們了
CGRect rect = view.bounds;
CGSize radio = CGSizeMake(30, 30);//圓角尺寸
UIRectCorner corner = UIRectCornerTopLeft|UIRectCornerTopRight;//這只圓角位置
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corner cornerRadii:radio];
CAShapeLayer *masklayer = [[CAShapeLayer alloc]init];//創(chuàng)建shapelayer
masklayer.frame = view.bounds;
masklayer.path = path.CGPath;//設(shè)置路徑
view.layer.mask = masklayer;
18.給UIView設(shè)置圖片
UIImage *image = [UIImage imageNamed:@"image"];
self.MYView.layer.contents = (__bridge id _Nullable)(image.CGImage);
self.MYView.layer.contentsRect = CGRectMake(0, 0, 0.5, 0.5);
19.去掉導(dǎo)航欄返回的back標(biāo)題
[[UIBarButtonItemappearance]setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)forBarMetrics:UIBarMetricsDefault];
20.防止scrollView手勢(shì)覆蓋側(cè)滑手勢(shì)
[scrollView.panGestureRecognizerrequireGestureRecognizerToFail:self.navigationController.interactivePopGestureRecognizer];
21.dispatch_group的使用(多請(qǐng)求同時(shí)進(jìn)行)
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_enter(dispatchGroup);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"第一個(gè)請(qǐng)求完成");
dispatch_group_leave(dispatchGroup);
});
dispatch_group_enter(dispatchGroup);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"第二個(gè)請(qǐng)求完成");
dispatch_group_leave(dispatchGroup);
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
NSLog(@"請(qǐng)求完成");
});
22.UITableView的Group樣式下頂部空白處理
//分組列表頭部空白處理
_messageTable.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];
_messageTable.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];
23狼钮、UITableView收起鍵盤何必這么麻煩 一個(gè)屬性搞定碳柱,效果好(UIScrollView同樣可以使用
yourTableViewName.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
24、去除UItableView的Header粘滯效果
//去除UItableView的Header粘滯效果
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == self.mineTableView) {
CGFloat sectionHeaderHeight = 20;
if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
} else if (scrollView.contentOffset.y >= sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
}
25、通過LaunchScreen.storyBoard設(shè)置啟動(dòng)頁
通過LaunchScreen.storyBoard設(shè)置啟動(dòng)頁開始的時(shí)候,圖片放到Assets.xcassets中撮抓,總是白屏糠雨,后來將圖片放置到圖片images文件夾中,就可以正常展示了。