iOS 基礎開發技巧 (一)

ppsheep發表於2016-11-07

歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來

iOS 基礎開發技巧 (一)

文章也會同步更新到我的部落格:
ppsheep.com

這裡主要講一些我在日常開發中用到的一些小的技巧,其實也算不上技巧吧,就是省去一些不必要的程式碼,或者有的小問題困擾你很久說不行在這裡你能找到答案

iOS OC專案的pch檔案使用

在專案中如果我們需要一些公共的引用,或者一些全域性的巨集 那我們經常在pch中設定好

具體怎麼設定呢 在專案下新建一個pch檔案

iOS 基礎開發技巧 (一)
1

一般我會取名 專案名-PrefixHeader

在target——>Bulid Setting 中 設定 PrefixHeader

iOS 基礎開發技巧 (一)
2

我的專案資料夾結構

iOS 基礎開發技巧 (一)

$(SRCROOT)這個是指工程的根目錄

找到這個pch檔案就行 然後啟動APP就會編譯這個檔案了

pch.h中

//
//  APP-1-PrefixHeader.pch
//  APP-1
//
//  Created by 羊謙 on 2016/10/28.
//  Copyright © 2016年 羊謙. All rights reserved.
//

#ifndef APP_1_PrefixHeader_pch
#define APP_1_PrefixHeader_pch

//在這裡直接定義你的巨集變數   或者公共引用就行

#endif /* APP_1_PrefixHeader_pch */複製程式碼

UITableView的Group樣式下頂部空白處理

要給tableHeaderView賦一個高度不為0的view才能處理頂部留白

//分組列表頭部空白處理
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0.1)];
self.tableView.tableHeaderView = view;複製程式碼

在UIView的擴充套件 快速修改frame

在iOS修改view的frame,我們經常需要寫一大堆程式碼,來修改frame中的一個小屬性,這裡有一個方法,就是直接修改frame的每個值

新建一個category UIView+PPSFrame.h

#import 

@interface UIView (PPSFrame)

@property (assign, nonatomic) CGFloat    top;//上 相當於frame.origin.y
@property (assign, nonatomic) CGFloat    bottom;//下 相當於frame.size.height + frame.origin.y
@property (assign, nonatomic) CGFloat    left;//相當於frame.origin.x
@property (assign, nonatomic) CGFloat    right;//相當於frame.origin.x+frame.size.width

@property (assign, nonatomic) CGFloat    centerX;
@property (assign, nonatomic) CGFloat    centerY;

@property (assign, nonatomic) CGFloat    width;
@property (assign, nonatomic) CGFloat    height;
@property (assign, nonatomic) CGSize    size;


@end複製程式碼

在.m檔案中設定各個屬性

#import "UIView+Layout.h"

@implementation UIView (Layout)

@dynamic top;
@dynamic bottom;
@dynamic left;
@dynamic right;

@dynamic width;
@dynamic height;

@dynamic size;

- (CGFloat)top
{
    return self.frame.origin.y;
}

- (void)setTop:(CGFloat)top
{
    CGRect frame = self.frame;
    frame.origin.y = top;
    self.frame = frame;
}

- (CGFloat)left
{
    return self.frame.origin.x;
}

- (void)setLeft:(CGFloat)left
{
    CGRect frame = self.frame;
    frame.origin.x = left;
    self.frame = frame;
}

- (CGFloat)bottom
{
    return self.frame.size.height + self.frame.origin.y;
}

- (void)setBottom:(CGFloat)bottom
{
    CGRect frame = self.frame;
    frame.origin.y = bottom - frame.size.height;
    self.frame = frame;
}

- (CGFloat)right
{
    return self.frame.size.width + self.frame.origin.x;
}

- (void)setRight:(CGFloat)right
{
    CGRect frame = self.frame;
    frame.origin.x = right - frame.size.width;
    self.frame = frame;
}

- (CGFloat)centerX
{
    return self.center.x;
}

- (void)setCenterX:(CGFloat)centerX
{
    CGPoint center = self.center;
    center.x = centerX;
    self.center = center;
}

- (CGFloat)centerY
{
    return self.center.y;
}

- (void)setCenterY:(CGFloat)centerY
{
    CGPoint center = self.center;
    center.y = centerY;
    self.center = center;
}

- (CGFloat)width
{
    return self.frame.size.width;
}

- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)height
{
    return self.frame.size.height;
}

- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

- (CGSize)size
{
    return self.frame.size;
}

- (void)setSize:(CGSize)size
{
    CGRect frame = self.frame;
    frame.size = size;
    self.frame = frame;
}

@end複製程式碼

獲取某個view的Controller

其實就是根據view的響應鏈,來查詢viewcontroller

- (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;
}複製程式碼

清空NSUserDefaults的記錄

方法一:是獲取當前的app的bundleId NSUserDefaults中有方法根據bundleId清空記錄

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];複製程式碼

方法二:獲取所有儲存在NSUserDefaults中的資料,因為是按照key-value形式儲存,所以迴圈key就能夠刪除資料

- (void)clearDefaults{
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict)
    {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}複製程式碼

GCD timer定時器的使用

這裡的定時器,是一個每秒在主執行緒跑的一個方法

 __block int countSecond = 30; //倒數計時
    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); //每秒執行
    dispatch_source_set_event_handler(timer, ^{
        if (countSecond==0) { //倒數計時完畢
            //@"倒數計時結束,關閉"
            dispatch_source_cancel(timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                //倒數計時完畢需要執行的操作
            });
        }else{ //倒數計時
            NSLog(@"%@", [NSString stringWithFormat:@"%ld",(long)countSecond]);
            dispatch_async(dispatch_get_main_queue(), ^{
                //每秒需要執行的操作
                //在這裡更新UI之類的
            });

            countSecond--;
        }
    });
    dispatch_resume(timer);複製程式碼

計算檔案大小

- (long long)fileSizeAtPath:(NSString *)path
{
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:path])
    {
        long long size = [fileManager attributesOfItemAtPath:path error:nil].fileSize;
        return size;
    }

    return 0;
}複製程式碼

計算資料夾大小

- (long long)folderSizeAtPath:(NSString *)path
{
    NSFileManager *fileManager = [NSFileManager defaultManager];

    long long folderSize = 0;

    if ([fileManager fileExistsAtPath:path])
    {
        NSArray *childerFiles = [fileManager subpathsAtPath:path];
        for (NSString *fileName in childerFiles)
        {
            NSString *fileAbsolutePath = [path stringByAppendingPathComponent:fileName];
            if ([fileManager fileExistsAtPath:fileAbsolutePath])
            {
                long long size = [fileManager attributesOfItemAtPath:fileAbsolutePath error:nil].fileSize;
                folderSize += size;
            }
        }
    }

    return folderSize;
}複製程式碼

向上取整和向下取整

floor(x)函式,是一個向下取整函式,是一個C函式 即是去不大於x的一個最大整數
floor(3.12) = 3 floor(4.9) = 4

與floor(x)函式對應的是ceil函式
這個即是向上取整了
ceil(3.9) = 4  ceil(1.2) = 2複製程式碼

給任何一個view設定一張圖片

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);複製程式碼

未完待續。。。

相關文章