IOS開發(fā)的一些小技巧

在實(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就可以打包上線了。

下面是圖文教程

第一步:


第一步.jpeg

第二步:


第二步.jpeg

第三步:
第三步.jpeg

第四步:


第四步.jpeg

第五步:
第五步.jpeg

第六步:
第六步.jpeg

第七步:
第七步.jpeg

第八步:
第八步.jpeg

最后一步: 在項(xiàng)目配置文件中辈灼。配置對(duì)應(yīng)的宏定義就能實(shí)現(xiàn)切換不同的target,實(shí)現(xiàn)不同的環(huán)境配置份企。

最后一步.jpeg

附上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甜紫,如下:

關(guān)系圖
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文件夾中,就可以正常展示了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌半火,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季俩,死亡現(xiàn)場(chǎng)離奇詭異钮糖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門店归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阎抒,“玉大人,你說我怎么就攤上這事消痛∏胰” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵秩伞,是天一觀的道長逞带。 經(jīng)常有香客問我,道長纱新,這世上最難降的妖魔是什么展氓? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮怒炸,結(jié)果婚禮上带饱,老公的妹妹穿的比我還像新娘。我一直安慰自己阅羹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布教寂。 她就那樣靜靜地躺著捏鱼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酪耕。 梳的紋絲不亂的頭發(fā)上导梆,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音迂烁,去河邊找鬼看尼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盟步,可吹牛的內(nèi)容都是我干的藏斩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼却盘,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼狰域!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黄橘,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤兆览,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后塞关,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抬探,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年帆赢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了小压。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线梗。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖场航,靈堂內(nèi)的尸體忽然破棺而出缠导,到底是詐尸還是另有隱情,我是刑警寧澤溉痢,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布僻造,位于F島的核電站,受9級(jí)特大地震影響孩饼,放射性物質(zhì)發(fā)生泄漏髓削。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一镀娶、第九天 我趴在偏房一處隱蔽的房頂上張望立膛。 院中可真熱鬧,春花似錦梯码、人聲如沸宝泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儿奶。三九已至,卻和暖如春鳄抒,著一層夾襖步出監(jiān)牢的瞬間闯捎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工许溅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓤鼻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓贤重,卻偏偏與公主長得像茬祷,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子游桩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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