iOS開發項目實戰狗糧

touchesBegan開始編寫一個應用代碼前,首先應該列出事物清單(瞭解須要作什麼)
 
從代碼可移植性的角度來看,純手寫代碼 > xib界面文件 > storyboard
從代碼複雜度的角度來看,storyboard > xib 界面文件 > 純手寫代碼
 
彈出提示框
[UIAlertView alloc]initWithTitle
 
iOS 8 建議使用 UIAlertController
改變UIAlertController的標題、內容的字體和顏色
        [UIView appearance].tintColor = [UIColor colorWithHexString:DSBlackColor];
 能夠統一修改按鈕字體顏色。
 
分享功能實現:
UIActivityViewController
 
簡單的系統 Loading效果 UIActivityIndicatorView
 
支持橫屏
Orientation 設置,而後把它從Inferred修改成 Landscape。 (General選項
Device Orientations 取消選中Portrait這個選項)。
 
lroundf 四捨五入到最接近的整數(long int)
 
方法與函數
// 下面的這個是方法:
[someObject methodName:parameter];
// 下面的這個是函數:
SomeFunction(parameter);
方法確定是對象的方法,函數不屬於某個對象
 
在dicload 裏面定義一些 類變量的初值;
 
在用到屬性的地方几乎都要用到self關鍵詞:
// 屬性: self.slider.value = 50;    @property
// 屬性「背後」的實例變量: slider.value = 50;   @synthesize 建立的實例變量 (uislider *) slider
 
獨立的方法,多個地方能夠調用,而且清晰,好維護
 
// 動做方法,(IBAction)能夠和界面中的控件創建關聯
 - (IBAction)buttonTapped:(UIButton *)button;
 
靜態/動態類型語言:
靜態語言(C,C++,C#,Objective-C,Java)數據類型肯定、提早分配內存空間,編譯時檢查
動態語言(Python,Ruby,PHP,JavaScript,Erlang),不須要指定數據類型,運行時記錄數據類型。
 
強/弱類型定義語言
腳本語言/通用語言
解釋型語言/編譯語言
 
視圖控制器 能夠監聽來自提示對話框的事件,經過設置UIAlertViewDelegate 代理
 
多界面:
new file > class >
storyboard:
1. 按住control 拖動按鈕到新的View controller 選擇modal ,建立點擊跳轉事件
2. [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 退出新視圖
 
xib 文件,按住control 拖動按鈕到 .m,action點擊事件,方法定義:
1. 定義
AboutViewController *controller = [[AboutViewController alloc]initWithNibName:@"AboutViewController" bundle:nil];
     alloc initWithNibName  經過xib文件 初始化新視圖,
2. controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  定義跳轉動畫
3. [self presentViewController:controller animated:YES completion:nil];   經過動畫,展示新視圖
4. 在新視圖的.m  button action中定義退出視圖[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 退出新視圖
 
隱藏狀態欄
1.Supporting Files 》 CrazyDrag-Info.plist 》Add Row 》View controller-based status bar appearance 在Value那裏設置爲NO
2.項目名 》Deployment Info 》Status Bar Style下面的Hide during application launch
 
修改狀態欄顏色
 
第一步:在info.plist中添加一個字段:view controller -base status bar 設置爲NO
 
第二步:
  if ( >ios7) { // 判斷是不是IOS7
 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
 
  }
iOS 9以後
 
 
程序啓動順序:
1. 入口 main.m
2.自動調用UIApplicationMain ,初始化一個應用對象,使用指定的類名稱初始化一個代理,設置程序的主Event loop。 讀取plist UIMainStoryBoardFile.
3. 自動調用代理,初始化主界面
4. 進入視圖控制器,等待交互。
 
UINavigationBar 增長 ButtonItem (擴展性,樣式很差調整,建議採用自定義)
 
UIButton *questionBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 27, 25)];
[questionBtn setBackgroundImage:[UIImage imageNamed:@"icon_send"] forState:UIControlStateNormal];
[questionBtn addTarget:self action:@selector(sendClick:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithCustomView:questionBtn];
self.navigationItem.rightBarButtonItem = leftBtn;
self.navigationItem.leftBarButtonItems = [NSArray arraywithobjects:leftBtn,rightBtn,nil];
 
  UIBarButtonItem *addNewScheduleBtn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"add_img"]                                                                        style:UIBarButtonItemStyleBordered target:self                                                         action:@selector(clickRightButton)];
  [self.navigationItem setRightBarButtonItem:addNewScheduleBtn];
 
圖片拉伸
stretchableImageWithLeftCapWidth  一個內容可拉伸,而邊角不拉伸的圖片,第一個是左邊不拉伸區域的寬度,第二個參數是上面不拉伸的高度
 
[image resizableImageWithCapInsets:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];    // 上下左右 四個角不可拉伸
 
CATransition  動畫效果
self.view.layer addAnimation:transition forKey:nil];   view使用這個動畫過渡效果。
 
#import <AVFoundation/AVFoundation.h>  播放音頻視頻
AVAudioPlayer
 
頁面跳轉
navigationController  pushViewController:controller
[self.navigationController popToRootViewController]
 
返回指定的某個vc用下面
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
 
UIView可交互
userInteractionEnabled = YES;   UIView 默認是YES,UIView接受並響應用戶的交互。 可是UIImageView 是NO 須要設置YES視圖和子視圖才能響應用戶交互。
 
字體、行距
btn.titleLabel.font = [UIFont systemFontOfSize: 14.0];  button 修改字體方法。
boldSystemFontOfSize 粗體字
button setImage   設置背景圖
label.numberOfLine =2 ;     設置最大行數
[label sizetoFit];     自動調整size
 
uiwebview 控制字體行間距 NSString *webviewText = @"<style>body{margin:0;background-color:transparent;font:16px/18px Custom-Font-Name}</style>」;
 
UILabel 行間距
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:contentLabel.text];;
            NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
            [paragraphStyle setLineSpacing:5];
            [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, contentLabel.text.length)];
 
            contentLabel.attributedText = attributedString;
            //調節高度
            CGSize size = CGSizeMake(width, 500000);
 
            CGSize labelSize = [contentLabel sizeThatFits:size];
 
 
json 解析返回的<null>處理:
if ([latitude isEqual:[NSNull null]])
 
NSMutableAttributedText
富文本,實現UILabel UIButton UITextView中文字不一樣顏色和字體。
 NSFontAttributeName (字體)   NSForegroundColorAttributeName (字體顏色)
NSStokeWidthAttributeName :@-5  NSStrokeColorAttributeName:[uicolor redColor] (描邊)
NSBackgroundColorAttributeName:transparentYellow;
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Using NSAttributed String"];
[str setAttributes]  removeAttributes
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0,5)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial-BoldItalicMT" size:30.0] range:NSMakeRange(0, 5)];
 
NSAttributedString *attributedString = ;
NSString *subString = ;
[attributedString string] rangeOfString:subString];
 
UILabel的 attributedText只讀:
NSMutableAttributedString *labelText = [myLabel.attributedText mutableCopy];
 
    [labelText setAttributes:<#(NSDictionary *)#> range:<#(NSRange)#>];
    myLabel.attributedText = labelText;
 
下劃線 刪除線 label:
 
UILabel 現實帶html標籤的文本:
GONMarkupParser.h
 
 
uitextview  禁止編輯 :.editable = NO;
控件隱藏  .hidden = YES;
 
[cell.contentView viewWithTag:tag];  獲取cell中的子控件,經過tag
[view  removeformsupview];      移除view
 
[ 值  floatvalue];      id類型轉化爲float
 
 [NSString stringWithFormat:@"%.02f%%",someFloat];     stringWithFormat 顯示百分號的實現。
 
cell 添加到 nsmuarray  這樣就能夠遍歷須要的cell
 
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 
cell 動態調節高度
   /*  UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
*/  根據cell內容 在cellForRowAtIndexPath:indexPath 中設置cell.frame, 用於動態調節row的高度。
 
限制textView 最大輸入字數
textView:(UITextView *)textView shouldChangeTextInRange:
{
if (range.location>=140)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}
 
通知中心:
// 發送通知
 [[NSNotificationCenter defaultCenter] postNotificationName:kLoginSucceedNotificationKey object:testArray];
---
 // 註冊通知事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSucceed:) name:kLoginSucceedNotificationKey object:nil];
//  處理通知事件
-(void)loginSucceed:(NSNotification*)aNotification
{
    NSMutableArray* dataArray = [aNotification object];         //  獲取到發送通知的參數
}
//    處理完成後, 移除通知
[[NSNotificationCenter defaultCenter] removeObserver:self    name:kLoginSucceedNotificationKey object:nil];
 
本地通知:
 
解析本地Json
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"TeamMembers" ofType:@"json"]];
 
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
經過POST請求URL解析json
NSString *URLString = [NSString stringWithFormat:@"%@/webservice/applyDaily",@" http://192.168.1.134:9000"];
 NSURL *url = [NSURL URLWithString:URLString];
        //第二步,建立請求
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
        [request setHTTPMethod:@"POST"];//設置請求方式爲POST,默認爲GET
        NSString *str = [NSString stringWithFormat:@"user_id=%d&title=%@&text=%@",[self.currentUser uid],[NSString stringWithFormat:@"%@的工做日報",dateFormat],contentText.text];//設置參數
        str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
        [request setHTTPBody:data];
        //第三步,鏈接服務器
        NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSDictionary *myDic = nil;
        if (response) {
            myDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:nil];
        }
 
NSDictionary ,轉化爲Json結構的 NSString
NSDictionary *dataDict = [[NSDictionary alloc] initWithObjectsAndKeys:method,@"Method", version, @"Version", appID, @"AppID", params,@"Params",key, @"Key", sessionID, @"SessionID", nil];
//dictionary 轉化爲 data
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dataDict options:NSJSONWritingPrettyPrinted error:&parseError];
     //Data轉換爲JSON string
    NSString* jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
 
控件邊框
導入QuartzCote框架:
#import <QuartzCore/QuartzCore.h>
設置邊框:
textView.layer.borderColor = [UIColorgrayColor].CGColor;
textView.layer.borderWidth =1.0;
textView.layer.cornerRadius =5.0;
 
判斷輸入框是否爲空:
textView.text.length ==0
 
Xcode運行緩存:
刪除/Users/用戶名/Library/Developer/Xcode/DerivedData 路徑下的緩存文件  Xcode clean
 
arc 支持/ 非arc支持
-fobjc-arc / -fno-objc-arc
 
關於Build Active Architecture Only屬性
這個屬性設置爲yes,是爲了debug的時候編譯速度更快,它只編譯當前的architecture版本。
而設置爲no時,會編譯全部的版本。
這個是設備對應的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
編譯出的版本是向下兼容的,好比你設置此值爲yes,用iphone4編譯出來的是armv7版本的,iphone5也能夠運行,可是armv6的設備就不能運行。
因此,通常debug的時候能夠選擇設置爲yes,release的時候要改成no,以適應不一樣設備。
 
NSString 處理空格和回車
去除兩端空格
NSString *temp = [textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
去除兩端空格和回車
NSString *text = [temp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet ]];
 
lineBreakMode:設置標籤文字過長時的顯示方式。
label.lineBreakMode = NSLineBreakByCharWrapping;//以字符爲顯示單位顯示,後面部分省略不顯示。
label.lineBreakMode = NSLineBreakByClipping;//剪切與文本寬度相同的內容長度,後半部分被刪除。
label.lineBreakMode = NSLineBreakByTruncatingHead;//前面部分文字以……方式省略,顯示尾部文字內容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;//中間的內容以……方式省略,顯示頭尾的文字內容。
label.lineBreakMode = NSLineBreakByTruncatingTail;//結尾部分的內容以……方式省略,顯示頭的文字內容。
label.lineBreakMode = NSLineBreakByWordWrapping;//以單詞爲顯示單位顯示,後面部分省略不顯示。
 
IOS Reachability
 
在子線程中,界面的刷新、更新,通常要回到主線程中處理:
dispatch_async(dispatch_get_main_queue(), ^{
            debugLog(@"resultDict--%@",resultDict);
            [self parseDataWithDict:resultDict];
            [self hideLoading];
        });
 
popToViewController用法  pop到肯定的viewController
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
for (UIViewController *controller inself.navigationController.viewControllers) {
    if ([controller isKindOfClass:[你要跳轉到的Controller class]]) {
        [self.navigationControllerpopToViewController:controller animated:YES];
    }
}
 
調起本地圖片/ 相機
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    if (buttonIndex != 2) {
                debugLog(@"拍照");
                BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];//判斷照相機是否可用(是否有攝像頭)
                if (hasCamera) {
                    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                }
            }
            {
                debugLog(@"本地圖片");
                picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            }
        }
        picker.delegate = self;
        //        picker.allowsEditing = YES; //是否可編輯
        [self presentViewController:picker animated:YES completion:nil];
 
將subview 置於supview 最頂層
    [parentView bringSubviewToFront:subview];
 
延遲執行
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];
此方式要求必須在主線程中執行,不然無效。
是一種非阻塞的執行方式,
暫時未找到取消執行的方法。
 
定位:
core.location    CLLocationManager
 
tableview 上拉加載更多 下拉刷新,寫在baseviewController中,tableviewController共用。
 
UIActivityViewController  iOS 系統分享
 
使用iOS7系統 的側邊欄返回手勢
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
 
[NSUserDefaults standardUserDefaults]
NSUserDefaults支持的數據格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL類型。
 
NSUserDefaults偶爾不工做,沒法保存改動的數據的緣由是,NSUserDefaults的機制是,過一段時間,會自動調用本身的函數synchronize去同步數據的。
而若是改動數據後,就退出程序了,即在NSUserDefaults還沒來得及synchronize以前就退出程序,就須要手動調用synchronize去保存數據了。
即,在須要的時候,手動調用NSUserDefaults去執行同步synchronize的動做,以及時保存(set 修改了的)數據。
 
 
各個控件內邊距方法
uibutton 文字位置 (內邊距)
btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft;
btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);
使文字距離作邊框保持10個像素的距離。
UITextView  contentInset
UITextField setValue:[NSNumber numberWithInt:5] forKey:@"paddingTop"];paddingLeft/paddingBottom/paddingRight
 
UIView 子類超出bounds不顯示
uiview.layer.maskToBounds = YES;
 
點擊手勢和其餘控件點擊衝突
tapGesture.delegate = self;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    CGPoint location = [touch locationInView:self.view];
    if(CGRectContainsPoint(button.frame, location))
    {
        return NO;
    }
    return YES;
//或者經過view 的class判斷
 //    if([touch.view isKindOfClass:[UIButton class]])
  //   {
   //       return NO;
    // }
    //      return YES;
}
 
UIButton setBackgroundImage和setImage 區別
首先setBackgroundImage,image會隨着button的大小而改變,圖片自動會拉伸來適應button的大小,這個時候仍然能夠設置button的title,image不會擋住title;
相反的的setImage,圖片不會進行拉伸,原比例的顯示在button上,此時再設置title,title將沒法顯示;
[btn.imageView setContentMode:UIViewContentModeScaleAspectFill];  能夠設置setImage的image顯示形式。
 
 
UIButton 字體位置
btn.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft ;//設置文字位置,現設爲居左,默認的是居中
 
獲取非子視圖 在view中的位置
CGRect rect = [self.view convertRect:sender.frame fromView:sender.superview];
http://www.jianshu.com/p/c59b32be2dfb  兩個rect是否包含 交叉等。
 
觸碰就收起鍵盤
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
http://www.cnblogs.com/gfxxbk/p/5575908.html 鍵盤類別 keyboardType
NSString 和 NSURL的互相轉換
NSString *str = @"";
NSURL *URL = [NSURL URLWithString:str]; //string>url
NSString *str1 = [URL absoluteString]; //url>string
 
獲取手勢點擊的view
- (void)imageTouch:(UITapGestureRecognizer * )sender
{
   UIView  *view = sender.self.view; // 這個view 就是點擊的那個控件
}
 
複製字符串到剪貼板
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = self.label.text;
 
壓縮圖片分別率
+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
// Create a graphics image context
UIGraphicsBeginImageContext(newSize);
 
// Tell the old image to draw in this new context, with the desired
// new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
 
// Get the new image from the context
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
 
// End the context
UIGraphicsEndImageContext();
 
// Return the new image.
return newImage;
}
 
UIView轉成 image
+ (UIImage*)convertViewToImage:(UIView*)v{
 
    CGSize s = v.bounds.size;
    // 下面方法,第一個參數表示區域大小。第二個參數表示是不是非透明的。若是須要顯示半透明效果,須要傳NO,不然傳YES。第三個參數就是屏幕密度了
    UIGraphicsBeginImageContextWithOptions(s, NO, [UIScreen mainScreen].scale);
    [v.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
 
    return image;
}
 
 
//截取部分圖像
-(UIImage*)getSubImage:(CGRect)rect
{
    CGImageRef subImageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
    CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));
 
    UIGraphicsBeginImageContext(smallBounds.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, smallBounds, subImageRef);
    UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];
    UIGraphicsEndImageContext();
 
    return smallImage;
}
 
 
圖片保存到文件路徑
[UIImagePNGRepresentation(tempImg) writeToFile:photoPath atomically:YES];
 
一步步調試解決iOS內存泄漏
 
iOS應用如何實現64位的支持
 
CocoaPods安裝和使用教程
http://code4app.com/article/cocoapods-install-usage
 
AFNetworking
http://blog.csdn.net/daiyelang/article/details/38421341
 
iOS8 中 全局webview 加入tableviewcell.contentView 不顯示.
 
[[UIColor redColor] colorWithAlphaComponent:0.3];
隨機整數(0~ 100)
unsigned index = arc4random() % 100;
 
【教程】如何設置launchImage顯示的時間
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [NSThread sleepForTimeInterval:2.0];   //設置進程中止2秒
}
 
 
presentViewController 的 ViewController 獲取  self.presentingViewController, iOS8之前的系統 在viewWillAppear 獲取,在其餘地方可能會爲nil, 設置一個屬性,在viewWillAppear中設置set屬性。其餘地方能夠調用。
 
 
解決uiscrollView 截獲uiview 的touch 事件解決方法
#import "UIScrollView+UITouch.h"
@implementation UIScrollView (UITouch)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self nextResponder] touchesBegan:touches withEvent:event];
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self nextResponder] touchesMoved:touches withEvent:event];
    [super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self nextResponder] touchesEnded:touches withEvent:event];
    [super touchesEnded:touches withEvent:event];
}
 
 
圖像翻轉,旋轉
imageView 是一個UIImageView的實例
        //左右flip
       imageView.transform = CGAffineTransformMakeScale(-1.0, 1.0);
 
 //上下flip
       imageView.transform = CGAffineTransformMakeScale(1.0,-1.0);
 
//縮放,中心點固定
      imageView.transform = CGAffineTransformMakeScale(0.1,0.1);
 
     imageView.transform = CGAffineTransformMakeScale(2.0,2.0);
// 旋轉一個角度
    imageView.transform = CGAffineTransformMakeRotation(90*M_PI/180);
 
數據存儲成plist文件
NSArray *localtionArray = dic[@"data"];
                NSString *documentsDirectory = PATH_OF_DOCUMENT;
                NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"city.plist"];
                [localtionArray writeToFile:filePath atomically:YES];  // 保存數據
 
(若是保存的是比較複雜的數據,裏面包含對象,能夠轉化爲NSData,進行存取)
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:_historyCity];
    [data writeToFile:filePath atomically:YES];  // 保存數據
    NSData * data1 = [NSData dataWithContentsOfFile:filePath];// 讀取數據
    NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data1];
 
 
NSString *documentsDirectory = PATH_OF_DOCUMENT;
        NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"city.plist"];
        areaArray = [[NSArray alloc] initWithContentsOfFile:plistPath];  // 讀取數據
 
修改 placeholder 顏色
[_userName setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
 
uiview添加邊框、陰影
    contentBgView.layer.borderColor = [UIColor colorWithHexString:@"e0e0e0"].CGColor;
    contentBgView.layer.borderWidth = 0.5f;
    contentBgView.layer.shadowColor = [UIColor blackColor].CGColor;//shadowColor陰影顏色
    contentBgView.layer.shadowOffset = CGSizeMake(0,2);//shadowOffset陰影偏移,x向右偏移4,y向下偏移4,默認(0, -3),這個跟shadowRadius配合使用
    contentBgView.layer.shadowOpacity = 0.4;//陰影透明度,默認0
    contentBgView.layer.shadowRadius = 2;//陰影半徑,默認3
 
UItextView 高度根據內容自適應
      CGRect textFrame;
     textFrame=textView.frame;
     CGSize constraint = CGSizeMake(textFrame.size.width, 99999.0f);
     CGSize size = [textView sizeThatFits:constraint];
     textFrame.size.height = MAX(size.height, 32);
     [textView setFrame:textFrame];
或者:
      CGRect textFrame;
     textFrame=textView.frame;
        textFrame.size.height= MAX(32, textView.contentSize.height);
    [textView setFrame:textFrame];
 
 
NSArray 的遍歷,倒序遍歷
 
NSArray 刪除重複項,能夠轉換爲NSSet 再轉爲NSArray
NSSet *set = [NSSet setWithArray:arr];
NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:nil ascending:YES]];
NSArray *sortSetArray = [set sortedArrayUsingDescriptors:sortDesc];
 
enumerateObjectsUsingBlock 是安全的,能夠用於遍歷時候刪除數組元素。
[marrayA enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isEqualToString:@"a"]) {
            [marrayA removeObject:obj];
        }
    }];
 
NSArray和NSOrderedSet都支持使用reverseObjectEnumerator倒序遍歷,如:
NSArray *strings = @[@"1", @"2", @"3"];
for (NSString *string in [strings reverseObjectEnumerator]) {
    NSLog(@"%@", string);
}
這個方法只在循環第一次被調用,因此也沒必要擔憂循環每次計算的問題。
 
同時,使用enumerateObjectsWithOptions:NSEnumerationReverse也能夠實現倒序遍歷:
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
    [sark doSomething];
}];
使用block同時遍歷字典key,value
 
block版本的字典遍歷能夠同時取key和value(forin只能取key再手動取value),如:
NSDictionary *dict = @{@"a": @"1", @"b": @"2"};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"key: %@, value: %@", key, obj);
}];
對於耗時且順序無關的遍歷,使用併發版本
[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
    [sark doSomethingSlow];
}];
 
label.adjustsFontSizeToFitWidth  //文本文字自適應大小
 
使用cell默認分割線時候,怎麼讓左對齊
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)])
    {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
    {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
    if ([cell respondsToSelector:@selector(setLayoutMargins:)])
    {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
 
// 待嘗試
 
[cell setSeparatorInset:UIEdgeInsetsZero];
 
[cell setLayoutMargins:UIEdgeInsetsZero];
 
}
 
1. webview 加載gif文件
 // 讀取gif圖片數據
    NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"guzhang" ofType:@"gif"]];
    // view生成
    UIWebView *webView = [[UIWebView alloc] initWithFrame:frame];
    webView.userInteractionEnabled = NO;//用戶不可交互
    [webView loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    [self.view addSubview:webView];
 
2. UIImageView animationImages
     gifImageView.animationImages = gifArray; //動畫圖片數組
    gifImageView.animationDuration = 5; //執行一次完整動畫所需的時長
    gifImageView.animationRepeatCount = 1;  //動畫重複次數
    [gifImageView startAnimating];
    [self.view addSubview:gifImageView];
 
NSArray NSMutableArray 相互轉化
// NSArray --> NSMutableArray
NSMutableArray *myMutableArray = [myArray mutableCopy];
 
// NSMutableArray --> NSArray
NSArray *myArray = [myMutableArray copy];
 
SDWebImage  清理緩存
    [[SDImageCache sharedImageCache] clearDisk];
 float tmpSize = [[SDImageCache sharedImageCache] checkTmpSize];
    NSString *clearCacheName = tmpSize >= 1 ? [NSString stringWithFormat:@"清理緩存(%.2fM)",tmpSize] : [NSString stringWithFormat:@"清理緩存(%.2fK)",tmpSize * 1024];
 
sdwebimage 獲取已緩存的圖片:
        UIImage *originalImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:urlStr];
 
SDWebImage 加進度條
 
 
跑馬燈效果 MarqueeLabel
 
autolayout  Label 根據內容設置寬度
    [_sumPriceLabel mas_updateConstraints:^(MASConstraintMaker *make) {
 
        make.width.mas_equalTo(_sumPriceLabel.intrinsicContentSize.width);
    }];
 
純單色的icon  能夠用 iconFont 作圖標, 至關於把圖標定義成一種字體,設置UI控件的text 就能夠顯示對應圖標。 icon 轉爲iconfont.ttf 字體文件
 _leftButton.titleLabel.font = [UIFont fontWithName:@"iconfont" size:25];
        [_leftButton setTitle:[IconFont sharedInstance].fanhui forState:UIControlStateNormal];
 
 
 
iOS 使用開源庫 GTMBase64 轉碼 http://www.2cto.com/kf/201405/297303.html
系統base64 轉碼 (iOS7+):
 
NSData* originData = [originStr dataUsingEncoding:NSASCIIStringEncoding];
NSData *data = UIImagePNGRepresentation(image);
        NSString *str = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
 
NSData* decodeData = [[NSData alloc] initWithBase64EncodedString:encodeResult options:0];
NSString* decodeStr = [[NSString alloc] initWithData:decodeData encoding:NSASCIIStringEncoding];
 
 
清除緩存
緩存文件夾路徑:
    NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) objectAtIndex:0];
 
 
AES加密
 
 
MD5 加密
 
 
WKWebView iOS8 WebKit庫之——WKWebView篇
 
關於wkwebview js交互用戶
 
(wkWebView 直接alloc init 會有內存泄漏 ,使用如下方式初始化
 WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
 
 
 
        config.selectionGranularity = WKSelectionGranularityCharacter;
 
 
 
        _wkWebView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-64) configuration:config];
 
//        _wkWebView.UIDelegate = self;
 
        _wkWebView.navigationDelegate = self;
 
        [self.view addSubview:_wkWebView];
)
 
UITableView,UIScrollView的時候有時候會偏移20像素
  在ios7裏面若是有滾動視圖的時候,好比UITableView,UIScrollView的時候有時候會偏移20像素。這時候能夠這樣設置
if ([[UIDevice currentDevice] systemVersion].floatValue>=7.0) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
 
self.edgesForExtendedLayout = UIRectEdgeNone;  視圖延伸,
edgesForExtendedLayout是一個類型爲UIExtendedEdge的屬性,指定邊緣要延伸的方向。
由於iOS7鼓勵全屏佈局,它的默認值很天然地是UIRectEdgeAll,四周邊緣均延伸,就是說,若是即便視圖中上有navigationBar,下有tabBar,那麼視圖仍會延伸覆蓋到四周的區域
 
使用NSLocalizedString實現國際化  http://blog.csdn.net/mamong/article/details/8510781
 
 
iOS8以上定位
{
     //定位管理器
    _locationManager=[[CLLocationManager alloc]init];
 
    if (![CLLocationManager locationServicesEnabled]) {
        [HUD showText:@"定位服務當前可能還沒有打開,請設置打開!"];
        return;
    }
 
        //設置代理
        _locationManager.delegate=self;
        //設置定位精度
        _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
        //定位頻率,每隔多少米定位一次
        CLLocationDistance distance=10.0;//十米定位一次
        _locationManager.distanceFilter=distance;
    if (IOS_VERSION >=8) {
        [_locationManager requestWhenInUseAuthorization];//使用程序其間容許訪問位置數據(iOS8定位須要)
    }
        //啓動跟蹤定位
        [_locationManager startUpdatingLocation];
 
}
 
#pragma mark - CoreLocation 代理
#pragma mark 跟蹤定位代理方法,每次位置發生變化即會執行(只要定位到相應位置)
//能夠經過模擬器設置一個虛擬位置,不然在模擬器中沒法調用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation *location=[locations lastObject];//取出當前位置
    if (location) {
        CLLocationCoordinate2D coordinate= [LocationCorrection transformFromWGSToGCJ:location.coordinate];//位置座標
        NSLog(@"經度:%f,緯度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
 
        //若是不須要實時定位,使用完即便關閉定位服務
        [_locationManager stopUpdatingLocation];
        self.currentLocation = [[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"locationSucess" object:nil userInfo:nil];
 
 //獲取所在地城市名
        CLGeocoder *geocoder=[[CLGeocoder alloc]init];
        [geocoder reverseGeocodeLocation:_currentLocation completionHandler:^(NSArray *placemarks,NSError *error)
         {
             for(CLPlacemark *placemark in placemarks)
             {
                 self.currentCity = [placemark.addressDictionary objectForKey:@"City"];
                 debugLog(@"str%@",_currentCity);
                 [[NSNotificationCenter defaultCenter] postNotificationName:@"locationCitySucess" object:nil userInfo:nil];
 
             }
         }];
    }
 
}
 
二、在Info.plist文件中添加以下配置:
(1)NSLocationAlwaysUsageDescription
(2)NSLocationWhenInUseUsageDescription
 
 
正則 判斷手機號
+ (BOOL)validatePhoneNum:(NSString *)phoneNum
 
{
 
    NSString *mobileRegex = @"^((13[0-9])|(147)|(170)|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
 
    NSPredicate *mobileTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",mobileRegex];
 
    BOOL n = [mobileTest evaluateWithObject:phoneNum];
 
    return n;
}
 
UITabbar
  // 去除tabBar頂部默認陰影線
 
    [self.tabBar setClipsToBounds:YES];
    [[UITabBar appearance] setShadowImage:[[UIImage alloc]init]];
 
 // 解決iOS8 默認藍色高亮的問題。
        tabImage = [tabImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
 
網絡圖片保存到相冊
NSURLCache *cache =[NSURLCache sharedURLCache];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:src]];
NSData *imgData = [cache cachedResponseForRequest:request].data;
UIImage *image = [UIImage imageWithData:imgData];
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
 
 關於UISearchDisplayController
 
tableView視圖下拉拉伸效果
 
3D touch
 
倒計時
 
獲取TableViewCell上button所在的行數
在自定義的 cell 上面放了一個 button, 除了經過 cell.btn.tag 值獲取cell的行數以外,另外一種方即可行的方式。
 
[cell.btn addTarget:self action:@selector(cellBtnClicked:event:) forControlEvents:UIControlEventTouchUpInside];
-(void)cellBtnClicked:(id)sender event:(id)event {
    NSSet *touches =[event allTouches];
    UITouch *touch =[touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:_tableView];
    NSIndexPath * indexPath = [_tableView indexPathForRowAtPoint:currentTouchPosition];
    (indexPath!= ) {
        // do something
    }
}
 
po [view recursiveDescription]   顯示視圖中的層級關係。
 
在不改變按鈕尺寸的前提下,擴大按鈕的點擊範圍
 
textfield 的輸入字數/不限制光標字數
 
 
絕對值:int abs(int i); // 處理int類型的取絕對值 double fabs(double i); //...float fabsf(float i); /
 
__FUNCTION__ 打印方法名
 
keyChain and TouchID
一般狀況下,咱們用NSUserDefaults存儲數據信息,可是對於一些私密信息,好比密碼、證書等等,就須要使用更爲安全的keychain了。keychain裏保存的信息不會因App被刪除而丟失,在用戶從新安裝App後依然有效,數據還在。
 
 
 
 
navigation 設置leftBarButtonItem 後,左滑返回失效:
  self.navigationItem.leftBarButtonItem = deleteItem;
     self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
 
社會化分享對比
Social :
SLServiceTypeTwitter
SLServiceTypeFacebook
SLServiceTypeSinaWeibo
SLServiceTypeTencentWeibo
SLServiceTypeLinkedIn
 
UIActivityViewController:
 
判斷網絡狀態是2G/3G/4G
 
獲取系統back 按鈕事件
 
 
新版pod 須要設置target
platform :ios, ‘7.0‘
 
 
target "RWTFlickrSearch" do
 
pod ‘ReactiveCocoa‘, ‘2.1.8‘
 
pod ‘objectiveflickr‘, ‘2.0.4‘
 
pod ‘LinqToObjectiveC‘, ‘2.0.0‘
 
pod ‘SDWebImage‘, ‘3.6‘
 
end
 
 
 storyboard textview 若是默認是中文,載入的時候會卡頓。
在視圖哪裏的時候別設置textview 中文
 
 
Xcode關於警告AutomaticPreferredMaxLayoutWidth的消除方法
相關文章
相關標籤/搜索