iOS開(kāi)發(fā)小冷易忘知識(shí)點(diǎn)總結(jié)

整理一下一些偏冷知識(shí)點(diǎn),偶爾看一下。各位道友如果發(fā)現(xiàn)什么錯(cuò)誤請(qǐng)及時(shí)指正,有好的東西也可以往上面補(bǔ)充!

  • 設(shè)置導(dǎo)航欄的背景顏色用barTintColor
    self.navigationBar.barTintColor = [UIColor colorWithRed:3/255.0f green:101/255.0f blue:100/255.0f alpha:1.0f] ;

  • 獲取.plist文件:
    // 1.從本地文件中讀取數(shù)據(jù)(在實(shí)際項(xiàng)目開(kāi)發(fā)中在這寫(xiě)網(wǎng)絡(luò)請(qǐng)求)
    // 獲取文件本地的路徑
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"json"];
    // 把本地?cái)?shù)據(jù)讀取出來(lái),不需要任何轉(zhuǎn)換,就是二進(jìn)制數(shù)據(jù)
    NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath];

  • NSString字符串轉(zhuǎn)換成NSData類型的數(shù)據(jù):
    // NSString字符串轉(zhuǎn)換成NSData類型的數(shù)據(jù)
    NSData *jsondata = [result dataUsingEncoding:NSUTF8StringEncoding] ;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsondata options:NSJSONReadingMutableContainers error:nil] ;

  • 獲取文本的高度:
    // Label中文字的大小默認(rèn)是18
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    WeiBoModel *weiboModel = _dataList[indexPath.row] ;
    NSString *textString = weiboModel.text ;
    CGSize size = [textString sizeWithFont:[UIFont systemFontOfSize:18] constrainedToSize:CGSizeMake(kScreenWidth, 1000)] ;
    return size.height +20;
    }

  • 設(shè)置圖片拉伸:
    // 設(shè)置圖片拉伸
    UIImage *bgImage = [UIImage imageNamed:@"userinfo_shadow_pic.png"];
    _bgImageView.image = [bgImage stretchableImageWithLeftCapWidth:15 topCapHeight:15];

  • 設(shè)置圖片圓角:
    // 設(shè)置圓角
    _userImageView.layer.cornerRadius = 25;
    _userImageView.layer.masksToBounds = YES;
  • 設(shè)置點(diǎn)擊cell然后不留下點(diǎn)擊的痕跡:
    // 設(shè)置沒(méi)有痕跡
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    [tableView deselectRowAtIndexPath:indexPath animated:YES] ;
    }
  • 設(shè)置button中圖片和文本的位置
    button.imageEdgeInsets = UIEdgeInsetsMake(0, -100, 0, 0) ;
    button.titleEdgeInsets = UIEdgeInsetsMake(0, -100, 0, 0) ;
  • 延遲調(diào)用
    // 延遲兩秒鐘調(diào)用yanchiAction方法
    [self performSelector:@selector(yanchiAction) withObject:nil afterDelay:0.2] ;
  • 刷新UICollectionView視圖
    [cell setNeedsLayout] ;

  • 設(shè)置內(nèi)填充
    self.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) ;

  • 設(shè)置tabBarView 的標(biāo)簽欄沒(méi)有內(nèi)填充效果
    self.automaticallyAdjustsScrollViewInsets = NO ;

  • 判斷字符串是否的開(kāi)頭
    if([context hasPrefix:@"@"]) ;

  • 請(qǐng)求數(shù)據(jù)從控制臺(tái)打印成data類型的數(shù)據(jù)方便進(jìn)行json解析
    po operation.responseString

  • 禁止滑動(dòng)視圖滑動(dòng)
    scrollView.scrollEnabled = NO;

  • 設(shè)置超出父視圖部分不減切
    _scrollView.clipsToBounds = NO ;

  • 取消UIScrollView的彈性效果
    scrollView.bounces = NO;

  • ScrollView禁止滑動(dòng)
    scrollView.scrollEnabled = YES;

  • 判斷點(diǎn)擊的是哪個(gè)視圖,返回值是個(gè)視圖
    tap.view.tap

  • 這是tableView沒(méi)有默認(rèn)的分割線
    self.separatorStyle = NO ;

  • 子視圖超過(guò)父視圖點(diǎn)擊沒(méi)反應(yīng)
    (注意:如果父視圖是UIScrollView,需要設(shè)置self.bgScrollView.clipsToBounds = NO;,因?yàn)閁IScrollView默認(rèn)會(huì)進(jìn)行裁剪,會(huì)導(dǎo)致超出的部分沒(méi)有了。)

  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint hitPoint = [self.cardView.dayRateHelp convertPoint:point fromView:self];
    if ([self.cardView.dayRateHelp pointInside:hitPoint withEvent:event])
        return self.cardView.dayRateHelp;
    return [super hitTest:point withEvent:event];
}
  • 用KVC修改UIPageControl的選中圖片和默認(rèn)圖片(系統(tǒng)默認(rèn)是不允許修改的)
  [self.pageControl setValue:currentImage forKey:@"_currentPageImage"];
  [self.pageControl setValue:pageImage forKey:@"_pageImage"];
  • 清除文本視圖按鈕
    textField.clearButtonMode = UITextFieldViewModeWhileEditing;

  • 點(diǎn)擊單元格不留下點(diǎn)擊的痕跡
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    [tableView deselectRowAtIndexPath:indexPath animated:YES] ;
    }

  • 設(shè)置單元格選中的樣式(無(wú)樣式)
    cell.selectionStyle = UITableViewCellSelectionStyleNone ;

  • 設(shè)置標(biāo)簽欄的選種文字和圖片顏色
    self.tabBar.tintColor = [UIColor redColor] ;

  • 故事版創(chuàng)建靜態(tài)單元格,注意創(chuàng)建的UITableViewControl 文件。m文件中有部分自動(dòng)創(chuàng)建的代碼時(shí)需要?jiǎng)h除的,如果是集成于baseTableViewControl也要?jiǎng)h除代碼
    // 獲取故事版
    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    // 獲取視圖
    MyTableViewController *myView = [board instantiateViewControllerWithIdentifier:@"MyID"] ;

  • 判斷一個(gè)字典里是否有某個(gè)key
    if([[dic allKeys]containsObject:@"key"])

  • 隨機(jī)數(shù)
    long price = arc4random()%10*1000 ;

  • 刷新視圖
    [label setNeedsDisplay] ;

  • 延遲幾秒鐘執(zhí)行
    [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];

  • 去掉cell的分割線(如果是用xib做的,右邊也有這個(gè)屬性,設(shè)置為none即可)
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

  • 取消cell選中效果
    tableView.selectionStyle = UITableViewCellSelectionStyleNone;
-   數(shù)據(jù)發(fā)生改變后一定要重新刷新數(shù)據(jù)  
- (void)viewWillAppear:(BOOL)animated{  

    [super viewWillAppear:animated];  
    /** 
     *  clearsSelectionOnViewWillAppear 
     *  這個(gè)是它的一個(gè)屬性,默認(rèn)是yes 返回列表頁(yè)面的時(shí)候,默認(rèn)取消這行的選中狀態(tài),可是我們已經(jīng)把這條數(shù)據(jù)刪除的話,會(huì)出問(wèn)題 
     *  如果你點(diǎn)擊了一行cell,進(jìn)入下一個(gè)頁(yè)面,在這個(gè)頁(yè)面中,我們把本該屬于這行cell的數(shù)據(jù)給刪了 
     *  如果  self.clearsSelectionOnViewWillAppear = yes,返回前一頁(yè)時(shí),會(huì)刷新這一行cell,執(zhí)行cellForRow方法,結(jié)果數(shù)據(jù)卻沒(méi)了,就崩潰了 
     *  如果  self.clearsSelectionOnViewWillAppear = no,不會(huì)刷新這一行cell,就沒(méi)事兒了 
     */  
   self.clearsSelectionOnViewWillAppear =NO;  
    [self.tableView reloadData];---->并不一定要放在這里,看取得數(shù)據(jù)在什么位置,刷新數(shù)據(jù)在什么位置  
}  
  • awakeFromNib(storyboard)和 viewDidLoad的區(qū)別

    • awakeFromNib
    
    當(dāng).nib文件被加載的時(shí)候,會(huì)發(fā)送一個(gè)awakeFromNib的消息到.nib文件中的每個(gè)對(duì)象,每個(gè)對(duì)象都可以定義自己的 awakeFromNib函數(shù)來(lái)響應(yīng)這個(gè)消息,執(zhí)行一些必要的操作。也就是說(shuō)通過(guò)nib文件創(chuàng)建view對(duì)象是執(zhí)行awakeFromNib 。
    
    
    • viewDidLoad
    
    當(dāng)view對(duì)象被加載到內(nèi)存是就會(huì)執(zhí)行viewDidLoad,所以不管通過(guò)nib文件還是代碼的方式創(chuàng)建對(duì)象都會(huì)執(zhí)行viewDidLoad。awakeFromNib和viewDidLoad的區(qū)別
    
    
  • 將漢字轉(zhuǎn)換為不帶音調(diào)的拼音
- (NSString *)transformMandarinToLatin:(NSString *)string  
{  
    NSMutableString *preString = [string mutableCopy];  
    /*轉(zhuǎn)換成成帶音 調(diào)的拼音*/  
    CFStringTransform((CFMutableStringRef)preString, NULL, kCFStringTransformMandarinLatin, NO);  
    /*去掉音調(diào)*/  
    CFStringTransform((CFMutableStringRef)preString, NULL, kCFStringTransformStripDiacritics, NO);  
    return preString;  
}  
  • 圖片適應(yīng)問(wèn)題(超出部分裁剪)
    有兩個(gè)view: view1,view2
    view2添加view1到中,如果view2大于view1,或者view2的坐標(biāo)不全在view1的范圍內(nèi),view2是蓋著view1的,意思就是超出的部份也會(huì)畫(huà)出來(lái)
    UIView有一個(gè)屬性,clipsTobounds 默認(rèn)情況下是NO。
    如果,我們想要view2把超出的那部份隱藏起來(lái)的話,就得改變它的父視圖也就view1的clipsTobounds屬性值。
    view1.clipsTobounds = YES;
  • 第三方FMDB數(shù)據(jù)庫(kù)操作問(wèn)題
    Unknown error finalizing or resetting statement (5: database is locked)
    在使用fmdb時(shí)有時(shí)候一不小心沒(méi)寫(xiě)好代碼就會(huì)這樣子啦,為什么呢,其實(shí)呢,應(yīng)該是在前面代碼中有調(diào)用數(shù)據(jù)庫(kù)而且并沒(méi)有調(diào)用[db close]就直接跳出結(jié)果來(lái)了,所以在前面的數(shù)據(jù)庫(kù)操作中先運(yùn)行[db close]再返回?cái)?shù)據(jù)即可;

  • 通過(guò)注冊(cè)鍵盤(pán)顯示的消息

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:)  
name:UIKeyboardWillShowNotification object:nil];  
   - (void)keyboardWillShown:(NSNotification *)aNotification{
  // 鍵盤(pán)信息字典
  NSDictionary *info = [aNotification userInfo];

}

  • 改變導(dǎo)航欄中間標(biāo)題顏色

    UIColor * color = [UIColor whiteColor];  
    NSDictionary * dict = [NSDictionary dictionaryWithObject: colorforKey:NSForegroundColorAttributeName];  
    self.navigationController.navigationBar.titleTextAttributes = dict;  
    
  • UIWebView要實(shí)現(xiàn)橫向滑動(dòng),跟UIWebview的增高沒(méi)有關(guān)系,你需要設(shè)定UIWebView的屬性scrollView的contentsize.width大于UIWebView的frame.size.width.

  • 如何監(jiān)測(cè)系統(tǒng)鍵盤(pán)的彈出(有第三方框架很方便)
    通過(guò)注冊(cè)鍵盤(pán)顯示的消息

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:)  

name:UIKeyboardWillShowNotification object:nil];  

- (void)keyboardWillShown:(NSNotification*)aNotification{  
    // 鍵盤(pán)信息字典  
    NSDictionary* info = [aNotification userInfo];  
}  

  • 改變狀態(tài)欄顏色

在Info.plist 添加

UIViewControllerBasedStatusBarAppearance, 設(shè)置值為 NO

然后再didFinishLaunchingWithOptions的AppDelegate, 添加這些代碼:

[application setStatusBarHidden:NO];[application setStatusBarStyle:UIStatusBarStyleLightContent];

  • 路徑截取字符串的一些處理

      // 從路徑中獲得完整的文件名(帶后綴)
    
      exestr = [filePath lastPathComponent];
    
      // 獲得文件名(不帶后綴)
    
      exestr = [exestr stringByDeletingPathExtension];
    
      // 獲得文件的擴(kuò)展類型(不帶'.')
    
      exestr = [filePath pathExtension];
    
  • 第三方庫(kù)不支持64位造成編譯錯(cuò)誤

Xcode升級(jí)到5.1,apple默認(rèn)讓所有app都通過(guò)64位編譯器編譯。通過(guò)下面的方式可以關(guān)閉: 選中Targets—>Build Settings—>Architectures。雙擊Architectures,選擇other,刪除$(ARCH_STANDARD)(點(diǎn)’-’),然后增加armv7和armv7s(點(diǎn)‘+’)。clean一下再編譯就行了。

  • 移動(dòng)導(dǎo)航欄的方法:

#import <QuartzCore/QuartzCore.h>  

#define kNavBarDefaultPosition CGPointMake(160, 22)  

        if (contentOffsetY > _scrollViewContentOffsetYThreshold) {  

            layer.position = CGPointMake(layer.position.x,  

           - MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0));  

        }  

        else  

        {  

            layer.position = kNavBarDefaultPosition;    

        }  

  • CGRect的一些相關(guān)方法:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 120, 120, 120)];  

// 獲取矩形左邊緣的x坐標(biāo)  

NSLog(@"MinX = %f",CGRectGetMinX(view.frame));  

// 獲取矩形頂部的y坐標(biāo)  

NSLog(@"MinY = %f",CGRectGetMinY(view.frame));  

// 獲取矩形中心點(diǎn)的坐標(biāo)  

NSLog(@"MidX = %f",CGRectGetMidX(view.frame));  

NSLog(@"MidY = %f",CGRectGetMidY(view.frame));  

// 獲取矩形右邊緣的x坐標(biāo)  

NSLog(@"MaxX = %f",CGRectGetMaxX(view.frame));  

// 獲取矩形底部的y坐標(biāo)  

NSLog(@"MaxY = %f",CGRectGetMaxY(view.frame));  

// 返回手勢(shì)在一個(gè)UIView上的觸摸點(diǎn)坐標(biāo)  

- (CGPoint)locationInView:(UIView *)view:  

// 判斷矩形是否包含了一個(gè)點(diǎn)  

NSLog(@"isRectContainPoint = %d",CGRectContainsPoint(view.frame, CGPointMake(160, 180)));  


CGRectInset CGRect CGRectInset (    

CGRect rect,    

CGFloat dx,    

CGFloat dy    

);    

該結(jié)構(gòu)體的應(yīng)用是以原rect為中心,再參考dx,dy,進(jìn)行縮放或者放大。    

CGRect r1 = CGRectMake(100, 100, 50, 50);    

CGRect r3 = CGRectInset(r1, 10, 8);//結(jié)果應(yīng)為:110,108,30,34 具體小多少都是要參照dx和dy來(lái)判定的。    


CGRectOffset CGRect CGRectOffset(    

CGRect rect,    

CGFloat dx,    

CGFloat dy    

); 相對(duì)于源矩形原點(diǎn)rect(左上角的點(diǎn))沿x軸和y軸偏移, 再rect基礎(chǔ)上沿x軸和y軸偏移    

float offset = 125.0;    

CGRect r1 = CGRectMake(100, 100, 5, 5);    

CGRect r2 = CGRectOffset(r1, offset, offset);    

結(jié)果:    

 {{225, 225}, {5, 5}}    

// 將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的像素值  

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;  

// 將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的像素值  

- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;  

// 將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的rect  

- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;  

// 將rect從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的rect  

- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;  

例把UITableViewCell中的subview(btn)的frame轉(zhuǎn)換到 controllerA中  

// controllerA 中有一個(gè)UITableView, UITableView里有多行UITableVieCell,cell上放有一個(gè)button  

// 在controllerA中實(shí)現(xiàn):  

CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];  

或  

CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell];  

// 此rc為btn在controllerA中的rect  

或當(dāng)已知btn時(shí):  

CGRect rc = [btn.superview convertRect:btn.frame toView:self.view];  

或  

CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview];  

  • 弱引用的幾種寫(xiě)法

      weak typeof(&_self)weakSelf = self;
    
      __weak __typeof(self) weakSelf = self;
    
      __weak XxxViewController _weakSelf = self;
    
      __weak id weakSelf = self;
    
  • CGImageRef與UIImage的互轉(zhuǎn)

CGImage和CGImageRef這兩個(gè)應(yīng)當(dāng)是用來(lái)重繪圖形的類,它們?cè)趹?yīng)用時(shí)是按照?qǐng)D像的像素矩陣來(lái)繪制圖片的,它們可以用來(lái)處理bitmap。

CGImageRef與UIImage的互轉(zhuǎn)

// CGImageRef轉(zhuǎn)換成UIImage CGImageRef  

iOffscreen = CGBitmapContextCreateImage(context);

UIImage* image = [UIImage imageWithCGImage: iOffscreen];

// UIImage轉(zhuǎn)換成CGImageRef  

UIImage *loadImage=[UIImage imageNamed:@"888.png"];

CGImageRef cgimage=loadImage.CGImage;
  • jpg和png圖片存儲(chǔ)沙盒
NSData *data;  

        if (UIImagePNGRepresentation(image) == nil) {  

            data = UIImageJPEGRepresentation(image, 1);  

        } else {  

            data = UIImagePNGRepresentation(image);  

        }  

  • UIImagePNGRepresentation轉(zhuǎn)換PNG格式的圖片為二進(jìn)制,如果圖片的格式為JPEG則返回nil;

 [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil];    將圖片保存為PNG格式  

 [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil];   將圖片保存為JPEG格式  

我們也可以寫(xiě)成下面的格式存儲(chǔ)圖片


NSString *pngImage = [filePath stringByAppendingPathComponent:@"Documents/image.png"];  

NSString *jpgImage = [filePath stringByAppendingPathComponent:@"Documents/image.jpg"];  

[data writeToFile:pngImage atomically:YES];  

[data writeToFile:jpgImage atomically:YES];  

  • 修改button上字體大小

button.titleLabel.font = [UIFont systemFontOfSize: 28.0];

  • 兩個(gè)經(jīng)緯度之間的相對(duì)距離

CLLocation *orig=[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue]  longitude:[mainDelegate.longitude_self doubleValue]];    

CLLocation* dist=[[CLLocation alloc] initWithLatitude:[tmpNewsModel.latitude doubleValue] longitude:[tmpNewsModel.longitude doubleValue]];    

CLLocationDistance kilometers=[orig distanceFromLocation:dist]/1000;    

NSLog(@"距離:",kilometers);    

  • 真機(jī)調(diào)試錯(cuò)誤

獲得開(kāi)發(fā)簽名后在真機(jī)器上部署測(cè)試,在點(diǎn)擊Build And Run后,提示The executable was signed with invalid entitlements.(The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile.)錯(cuò)誤->(0xE8008016),
解決方法如下:

第一步:在工程中添加文件new file,選擇Code Signing 中的Entitlements,添加后名稱為Entitlements.plist。

第二步:點(diǎn)擊Entitlements.plist進(jìn)行編輯,刪除所有Root下的Key,然后添加一個(gè)Boolean類型,名稱為get-task-allow的Key,狀態(tài)為CHECKED

第三步:在Targets中的Info中的Build選項(xiàng)卡中的Code Signing Entitlements的值設(shè)為Entitlements.plist,重新Build即可解決

  • 獲取視頻的第一幀圖片(用來(lái)在視頻列表默認(rèn)顯示一個(gè)圖片)

+ (UIImage *)getFirstFrameOfVideoWithVideoURL:(NSURL *)videoURL  

{  

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];  

    NSParameterAssert(asset);  

    AVAssetImageGenerator *assetIG = [[AVAssetImageGenerator alloc] initWithAsset:asset];  

    assetIG.appliesPreferredTrackTransform = YES;  

    assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;  

    CGImageRef thumbnailImageRef = NULL;  

    CFTimeInterval thumbnailImageTime = 60;  

    NSError *igError = nil;  

    thumbnailImageRef = [assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) actualTime:NULL error:&igError];  

    if (!thumbnailImageRef)  

        NSLog(@"thumbnailImageGenerationError %@", igError );  

    UIImage *thumbnailImage = thumbnailImageRef ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] : nil;  

    return thumbnailImage;  

}  

  • storyboard中放置ScrollView無(wú)法滾動(dòng)的情況

- (void)viewDidLayoutSubviews  

{      

    [super viewDidLayoutSubviews];  

    self.mScrollView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);  

    self.mScrollView.contentSize = CGSizeMake(kScreenWidth, 568);     

}  

- (void) viewDidAppear:(BOOL)animated  

{  

       self.scrollView.frame = CGRectMake(0, 0, 320, 480);  

       [self.scrollView setContentSize:CGSizeMake(320, 1000)];  

} 

  • 16進(jìn)制顏色轉(zhuǎn)UIColor

+ (UIColor *)colorFromHexString:(NSString *)hexString  

{  

    if ([[hexString substringToIndex:1] isEqualToString:@"#"]) {  

        hexString = [hexString substringFromIndex:1];  

    }  

    unsigned rgbValue = 0;  

    NSScanner *scanner = [NSScanner scannerWithString:hexString];  

    [scanner scanHexInt:&rgbValue];  

    return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];  

}  

  • 按對(duì)應(yīng)的尺寸縮放圖片

+ (UIImage *)compressImage:(UIImage *)imgSrc withSize:(CGSize)size  

{  

    UIGraphicsBeginImageContext(size);  

    CGRect rect = {{0,0}, size};  

    [imgSrc drawInRect:rect];  

    UIImage *compressedImg = UIGraphicsGetImageFromCurrentImageContext();  

    UIGraphicsEndImageContext();  

    return compressedImg;  

}  

  • gif圖片轉(zhuǎn)化成一個(gè)存儲(chǔ)image對(duì)象的數(shù)組
 frame(幀):一個(gè)gif可以簡(jiǎn)單認(rèn)為是多張image組成的動(dòng)畫(huà),一幀就是其中一張圖片image.
 frameCount(幀數(shù)): 就是一個(gè)gif有多少幀
 loopCount(播放次數(shù)):有些gif播放到一定次數(shù)就停止了,如果為0就代表gif一直循環(huán)播放。
delayTime(延遲時(shí)間):每一幀播放的時(shí)間,也就是說(shuō)這幀顯示到delayTime就轉(zhuǎn)到下一幀。
 所以gif播放主要就是把每一幀image解析出來(lái),然后每一幀顯示它對(duì)應(yīng)的delaytime,然后再顯示下一張。如此循環(huán)下去。
下面是純粹實(shí)現(xiàn)由系統(tǒng)提供的解碼:
-(void)decodeWithFilePath:(NSString *)filePath  
{  
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {  

        NSData *data = [NSData dataWithContentsOfFile:self.path];  

        [self decodeWithData:data];  
    });  
}  
        - (void)decodeWithData:(NSData *)data  
        {  
            CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef) data, NULL);  
            if (src)  
            {  
        //獲取gif的幀數(shù)  
        NSUInteger frameCount = CGImageSourceGetCount(src);  
        //獲取GfiImage的基本數(shù)據(jù)  
        NSDictionary *gifProperties = (NSDictionary *) CGImageSourceCopyProperties(src, NULL);  
        if(gifProperties)  
        {  
           //由GfiImage的基本數(shù)據(jù)獲取gif數(shù)據(jù)  

            NSDictionary *gifDictionary =[gifProperties objectForKey:(NSString*)kCGImagePropertyGIFDictionary];  

            //獲取gif的播放次數(shù)  

            NSUInteger loopCount = [[gifDictionary objectForKey:(NSString*)kCGImagePropertyGIFLoopCount] integerValue];  

            for (NSUInteger i = 0; i < frameCount; i++)  
            {  
                 //得到每一幀的CGImage  
                CGImageRef img = CGImageSourceCreateImageAtIndex(src, (size_t) i, NULL);  
                if (img)  
                {  
                    //把CGImage轉(zhuǎn)化為UIImage  
                    UIImage *frameImage = [UIImage imageWithCGImage:img];  
                    //獲取每一幀的圖片信息  
                    NSDictionary *frameProperties = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(src, (size_t) i, NULL);  
                    if (frameProperties)  
                    {  
                        //由每一幀的圖片信息獲取gif信息  
                        NSDictionary *frameDictionary = [frameProperties objectForKey:(NSString*)kCGImagePropertyGIFDictionary];  
                        //取出每一幀的delaytime  
                        CGFloat delayTime = [[frameDictionary objectForKey:(NSString*)kCGImagePropertyGIFDelayTime] floatValue];  
                       //TODO 這里可以實(shí)現(xiàn)邊解碼邊回調(diào)播放或者把每一幀image和delayTime存儲(chǔ)起來(lái)  
                       CFRelease(frameProperties);  
                    }  
                    CGImageRelease(img);  
                }  
            }  
            CFRelease(gifProperties);  
        }  
        CFRelease(src);  
    }      
}  

  • 使用NSCountedSet 統(tǒng)計(jì)重復(fù)元素的個(gè)數(shù)

可能你會(huì)發(fā)現(xiàn)這個(gè)類的父類是NSMutableSet。納尼?不是說(shuō)NSMutableSet是不可以儲(chǔ)存重復(fù)對(duì)象的嗎。其實(shí)NSCountedSet也是不能儲(chǔ)存重復(fù)的對(duì)象的,查看Apple文檔中對(duì)這個(gè)類的描述有這么一句:

Each distinct object inserted into an NSCountedSet object has a counter associated with it.

插入NSCountedSet對(duì)象的每個(gè)不同的對(duì)象都有一個(gè)與之相關(guān)的計(jì)數(shù)器

也就是說(shuō)如果遇到重復(fù)對(duì)象的加入,這個(gè)對(duì)象的計(jì)數(shù)器就會(huì)+1。所以可以到這個(gè)類有個(gè)名叫


- (NSUInteger)countForObject:(id)object    的方法來(lái)統(tǒng)計(jì)重復(fù)對(duì)象的個(gè)數(shù)。  

NSArray *array = @[@1, @2, @2, @1];  

NSCountedSet *set = [[NSCountedSet alloc]initWithArray:array];  

[set enumerateObjectsUsingBlock:^(id obj, BOOLBOOL *stop) {  

    NSLog(@"%@ => %d", obj, [set countForObject:obj]);  

}];  

  • 導(dǎo)航條返回鍵帶的title太討厭了,怎么讓它消失

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)  

                                                     forBarMetrics:UIBarMetricsDefault];  

  • 截屏轉(zhuǎn)化為image

UIGraphicsBeginImageContext(self.view.bounds.size);  

 [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];  

 UIImage *image= UIGraphicsGetImageFromCurrentImageContext();  

 UIGraphicsEndImageContext();  

 UIImageWriteToSavedPhotosAlbum(image, self, nil, nil); 

- (UIImage *)creatImageWithView:(UIView *)view rect:(CGRect)rect  

{  

    CGSize size = view.bounds.size;  

    UIGraphicsBeginImageContextWithOptions(size, NO, 0);  

    [view.layer renderInContext:UIGraphicsGetCurrentContext()];  

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();  

    UIGraphicsEndImageContext();  

    CGImageRef viewImageRef = viewImage.CGImage;  

    CGImageRef imageRef = CGImageCreateWithImageInRect(viewImageRef, rect);  

    UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];  

    CGImageRelease(imageRef);  

    return image;  

}  
  • storybord中設(shè)置靜態(tài)單元格時(shí)候,一定要把代碼中的數(shù)據(jù)源的兩個(gè)方法注掉,不然是不會(huì)顯示的。還有就是,xib上貌似不能用靜態(tài)單元格,storybord可以
  • 自定義view時(shí)候獲取該view的導(dǎo)航控制器和視圖控制器
  - (UIViewController*)viewController {
      for (UIView* next = [self superview]; next; next = next.superview) {
          UIResponder* nextResponder = [next nextResponder];
          if ([nextResponder isKindOfClass:[UINavigationController class]]) {
              return (UIViewController*)nextResponder;
          }
      }
      return nil;
  }  
  //獲取導(dǎo)航控制器
  - (UINavigationController*)navigationController {
      for (UIView* next = [self superview]; next; next = next.superview) {
          UIResponder* nextResponder = [next nextResponder];
          if ([nextResponder isKindOfClass:[UINavigationController class]]) {
              return (UINavigationController*)nextResponder;
          }
      }
      return nil;
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容