1. 程式人生 > >iOS 小技巧集結號

iOS 小技巧集結號

小知識點

 iOS 9 中 navgationBar 自動將 self,view 推到底下

也就是 說 self.view.frame.origin.y = 0 的位置 就是 navigationBar.maxY 的位置

tapGestureRecognizer.cancelsTouchesInView = NO; 

在手勢初始化的時候加上這句就行了。

手勢和 button 同時存在,會優先識別手勢

// 學習小型控制元件的 使用

http://ios.9tech.cn/news/2013/0930/29208.html

  一、UIActionSheet 行動表

二、UIAlertView 警告

三、UISlider 滑塊

四、UIProgressView 進度條

五、UISwitch開關

六、UISegmentedControl 分段控制

tableView 的 cell 這塊 view 的寬高是 320 * 44 ;

cell.contentView 這塊View 320 * 44 

只是初始位置不一樣, 兩塊疊加

從下往上 預設有 8 的底部高度

不讓 cell 被選中

[tableView setselectionStyle:UItableViewSelectionStyleNone];

alertView 的textFieldAtIndex 可以取到當行的 textfield

UIAlertView *alertView = [[

UIAlertViewalloc] initWithTitle:title message:message delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"確定", nil];

    alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

    alertView.tag = viewTag;

    alertView.delegate = self;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

UIPickView 三級聯動

圖片輪播器 刪除一張,立即按返回按鈕 , 控制器不會呼叫 dealloc 方法 

即在控制器有操作的情況下,點選返回是不會觸發 dealloc 方法

如果只是

preferredMaxLayoutWidth

支援多行文字分行屬性

UITextfield 可以選擇是否可以選中

定製 searchBar 的兩個屬性

_searchBar.autocorrectionType = UITextAutocorrectionTypeNo;

      _searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;

  [self.tabBarController.tabBar hideBadgeOnItemIndex:UserNormalControllerTalk];

<key>LSApplicationQueriesSchemes</key>

    <array>

        <string>alipay</string>

        <string>wechat</string>

        <string>weixin</string>

    </array>

URL Sceme URL 白名單

設定在深色背景下狀態列白字

設定在淺色背景下狀態列黑色

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];

JSBadgeView  badgeView 的功能

JSBadgeView 可以直接浮現在 parentView 的一個位置上

JSBadgeView *badgeView = [[JSBadgeView alloc] initWithParentView:imageViewLeft alignment:JSBadgeViewAlignmentTopRight];

自定義導航欄背景和標題的顏色

[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:20/255.0 green:155/255.0 blue:213/255.0 alpha:1.0]];  

[self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]];  

用 TitleTextAttributes 這個方法;

兩個控制器之間的轉換

 [self transitionFromViewController:_messageList toViewController:_friendsList duration:0.2 options:UIViewAnimationOptionAllowAnimatedContent animations:nil completion:nil];

最簡單的新增四邊約束

 [_webViewmas_makeConstraints:^(MASConstraintMaker *make) {

        make.edges.equalTo(self.view);

    }];

UIControl 中控制水平和居中的方式

@property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment;     // how to position content vertically inside control. default is center

@property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment; // how to position content hozontally inside control. default is center

iOS 7 新特性

在iOS 7中,蘋果引入了一個新的屬性,叫做[UIViewController setEdgesForExtendedLayout:],它的預設值為UIRectEdgeAll。當你的容器是navigation controller時,預設的佈局將從navigation bar的頂部開始。這就是為什麼所有的UI元素都往上漂移了44pt。

  self.translatesAutoresizingMaskIntoConstraints = NO; 

AutoresizingMask  自動轉化為 約束 Constraints  預設為 yes ;

IB  會把他調整為 NO  ,為此,需要在 IB 裡面勾選 SizeClass

MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];

constraintMaker  會追蹤到當前那一塊 View

//系統給的不帶引數的回撥

@property(nonatomic,strong) dispatch_block_t buttonOneBlock;

通過控制分割線樣式來控制 _tableView.separatorInset

 UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)

//判斷攝像頭是否能用

BOOL Custom= [UIImagePickerController

                  isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

其中只有在程式強制退出或者來電時,取消點選事件才會呼叫。

touchCancelled: withEvent:(UIEvent *)event

分別有多點觸控、搖一搖以及遠端操作(在iOS之後新增了3DTouch事件型別)

在view新增單擊手勢之後,原來的touchesEnded方法就無效了。最開始我一直認為view新增手勢之後,原有的touches系列方法全部無 效。但是在測試demo中,發現view新增手勢之後,touchesBegan方法是有進行回撥的,但是moved跟ended就沒有進行回撥

[UIFont fontWithName:button.titleLabel.font.fontName size:titleSize]方法會佔用極大的記憶體(已反覆試驗),每次都需要對Label進行處理。在此處請謹慎使用此方法,此變換效果也是其中一種可根據自行需求進行修改。有更好的方法可告知。

所以在UI 字型, button 等部分 能用 system 就用 system 節省記憶體

__WEAK_SELF_YLSLIDE

// slideTitleView 欄目button 點選的監聽

// 滾動到指定的欄目下

_slideTitleView.slideTitleViewClickButtonBlock = ^(NSUInteger index){

if (weakSelf) {

__STRONG_SELF_YLSLIDE

CGRect frame   = strongSelf.mainScrollview.bounds;

            frame.origin.x = CGRectGetWidth(strongSelf.frame) * index;

            [strongSelf.mainScrollviewscrollRectToVisible:frame animated:NO];

            [strongSelf visibleViewDelegateForIndex:index];

        }

    };

滾動至指定欄目下

[NSSet set] set 可以實現雜湊之間的相加相減

合理管理無序陣列

Model 裡面做判斷 ; 做部分業務處理 ;

在 model 裡面調介面有挑戰

定義個性的時候 , 可以採用列舉 

cellType 

在 .m 檔案中定義一個

setCellType {

   switch(cellType){

}

}

先需要 registerClass  或者 registerNib 就可以了

tableView 定製 cell 的另一種方法

[tableView dequeueReusableCellWithIdentifier:<#(nonnull NSString *)#> forIndexPath:<#(nonnull NSIndexPath *)#>]

如果需要使用這個方法,你必須使用配套的方法來一起用,下面兩個配套方法選其一:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0); 

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

3  比如你已經用NIB做了一個Cell,或者自定義了一個Cell。我們在你建立UITableView的時候,就可以順帶 

self.tableView.backgroundColor = xxxx; 

[self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"CustomCell"];

這樣你在

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath這個方法裡,

你就可以省下這些程式碼: 

    static NSString *CellIdentifier = @"Cell"; 

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

 if (cell == nil) {         

  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 

        reuseIdentifier:CellIdentifier];       

  //設定你的cell 

  }

而只需要 

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

那個可自動響應鍵盤的 ScrollView

TPKeyboardAvoidingScrollView

TPKeyboardAvoidingTableView

在cellForRowAtIndexPath中使用dequeueReuseableCellWithIdentifier:forIndexPath:獲取重用的cell,若無重用的cell,將自動使用所提供的class類建立cell並返回 

// 試一下這個巨集

#define PROPERTY_NAME(property) [[(@""#property) componentsSeparatedByString:@"."] lastObject]

本地驗證和 model 都放在使用者裡面

UIpickerView

UIdatepicker

MPMoviePlayerController 可以定製位置

 MPMoviePlayerViewController 全屏

AVPlayer  自定義

但是 只能定義 MP4 蘋果的視訊;

需要些解碼器

C/C ++ 跨平臺的

解碼器 

FFmpeg 開源免費跨平臺的視訊 和 音訊流方案

vlc 

ffmpeg

強大的媒體播放器

textfield 上面的輸入框為 ToolBar

在 ToolBar  上面扔 UIBarbuttonItem 就行了

pickerView 可以作為 textfield 的 inputView

NSNumber  有值 轉化為字串 

ZPosition

zPosition就是cocos2d中我們常寫的z吧。就是各個layer顯示的次序。 

zPosition不是放大縮小吧,是配置遮擋屬性,比如layer1和layer2在同一個父layer上,layer1的zPosition=1,layer2的zPosition=0,layer1就會擋住layer2

發起 NSSession

NSDictionary *headers = @{ @"accept": @"application/json",

                           @"content-type": @"application/json",

                           @"apix-key": @"您的apix-key" };

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://a.apix.cn/apixlife/movie/movie?name=your_value&page=your_value&num=your_value"]

                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy

                                                   timeoutInterval:10.0];

[request setHTTPMethod:@"GET"];

[request setAllHTTPHeaderFields:headers];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request

                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

                                                if (error) {

                                                    NSLog(@"%@", error);

                                                } else {

                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;

                                                    NSLog(@"%@", httpResponse);

                                                }

                                            }];

[dataTask resume];

NSArrau 需要的容器 用 json 轉模型

把 jsonStr 裡面的值轉化為 NSString 就可以是 json 轉化了

即使 jsonStr 裡面的值對應是 NSArray, NSDictionary 也可以這麼操作

NSMutableArray *imageArray = [NSMutableArrayarrayWithCapacity:0];

for(NSInteger i = 0; i<_imageArr.count - 1; i++){

            [imageArray addObject:_imageArr[i + 1]];

        }

        [BillApisendBillUploadBillRequestWithImagesArray:imageArray parameterOfimages:@"request"parametersDict:nilcompressionRatio:0.6succeedBlock:^(id operation, id responseObject) {

if ([responseObject[@"status"] integerValue] == 200 ) {

                [selfaddBillCheckListWithDataDict:responseObject[@"data"]];

            }

NSLog(@"=image==resonse%@",[NSStringjsonStrWithData:responseObject]);

        } failedBlock:^(id operation, NSError *error) {

            [MBProgressHUDshowError:@"網路正忙"];

NSLog(@"=image==error%@",error);

        } uploadProgressBlock:^(float uploadPercent, longlong totalBytesWritten, longlong totalBytesExpectedToWrite) {

NSLog(@"=image====%f,==%lld,=%lld",uploadPercent,totalBytesWritten,totalBytesExpectedToWrite);

        }];

iOS 9 多工分屏功能

    iOS 9的分屏操作是建立在多工之下的,所以這一點我們沒有必要分開來說。實現這個操作十分簡單,首先執行某個應用程式,然後從螢幕右側向中間滑動便會彈出多工程式卡,點選其中一個便會在右側螢幕三分之一的位置開啟。

  蘋果為iOS9增加了多工分屏功能,不過蘋果此次推出的分屏多工處理功能只能夠在iPad Air2上實現。

蘋果為多工操作共優化了三個功能;

      蘋果的多工 , slide over 功能

調出多工欄的功能;

1、Slide Over功能,可以讓使用者在兩個應用之間做到快速切換,該功能可在iPad Air、iPad Air2、iPad mini2、iPad mini3上實現。

Split View 功能:

2、 分屏顯示功能;

Split View功能,可將螢幕分成兩部分,同時執行兩個應用。兩個應用可以五五對半分屏,或者是三七分屏,兩個app能在同一螢幕上同時並行運作。也支援同一款應用的多介面,比如Safari瀏覽器中可並排擺放兩個標籤頁。此功能目前只能在iPad Air2上實現。

  1. 畫中畫

Picture in Picture功能,使用者在看視訊過程中如果想看或回郵件,視訊將以懸浮視窗的形式保留在螢幕上,大小和位置可任意調整。該功能在iPad Air、iPad mini上均可實現。

GCD 的資料型別, 各種函式名中帶有 create\copy\new\retain 等字眼 , 都不需要使用這個資料的時候進行 release

CF(core Foundation)的資料型別在 ARC 環境下 還是需要做 release .

增加或者減少引用計數

serial queues通過dispatch_queue_create建立,可以使用函式dispatch_retain和dispatch_release去增加或者減少引用計數。

用快速開啟搜尋一個方法或者屬性可能會比較慢; 因為需要對整個專案進行索引或者搜尋

工程越大, 這會變得越糟糕;

聰明的開發者 使用 xcode 使用技巧

http://www.wtoutiao.com/p/18dpJzv.html

xcode  基本操作

http://www.360doc.com/content/14/1128/13/110467_428727981.shtml

trick : 編輯斷點

       Condition : 設定斷點的觸發條件, 例如 i == 3

Ignore: 設定斷點需要被忽略多少次才會中斷

      action  設定 action po 檢視等

siblings  姐妹;

Touches系列方法會遮蔽button的點選。

itunes 可以 google 瀏覽器 看蘋果中文的官方文件

release 版本  和 debug 版本, 版本上線時一定是 release 版本

iOS 版本更新 , 1.獲取 itunes 上面的版本更新 

獲取app store上架版本號檢查

與本地版本對照更新

NSNumber  和 keyNote 畫圖

%zd  格式符 z 和 d 連用 轉換成 size_t 型別;

size _t 為了增強程式的可移植性,便有了size_t ,不同系統上,定義size_t可能不一樣。

經測試發現,在32位系統中size_t是4位元組的,在64位系統中,size_t是8位元組的,這樣利用該型別可以增加程式移植性。

size_t的定義 

它的定義在/usr/include/linux/types.h

                    typedef _kernel_size_t size_t;

跟體系結構相關                           

而__kernel_size_t 定義在 /usr/include/asm/posix_types.h                          

安裝的是核心的原始碼

asm-i386/posix_types.h

              typedef unsigned int __kernel_size_t;

asm-1a64/posix_types.h

              typedef unsigned long kernel_size_t;

size_t一般用來表示一種計數,比如有多少東西被拷貝等。例如:sizeof操作符的結果型別是size_t,該型別保證能容納實現所建立的最 大物件的位元組大小。 它的意義大致是“適於計量記憶體中可容納的資料專案個數的無符號整數型別”。所以,它在陣列下標和記憶體管理函式之類的地方廣泛使用。

// 寫外部宣告的字串

UIKIT_EXTERN NSString *const MJRefreshHeaderLastUpdatedTimeKey;

runtime 機制簡答:

首先說一下什麼是runtime:

RunTime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於C語言,函式的呼叫 在編譯的時候會決定呼叫哪個函式( C語言的函式呼叫請看這裡 )。編譯完成之後直接順序執行,無任何二義性。OC的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式(事實證明,在編 譯階段,OC可以呼叫任何函式,即使這個函式並未實現,只要申明過就不會報錯。而C語言在編譯階段就會報錯)。只有在真正執行的時候才會根據函式的名稱找 到對應的函式來呼叫。

舉例說明:

比如你[obj makeText];

則執行時就這樣的:

首先,編譯器將程式碼[obj makeText];轉化為objc_msgSend(obj, @selector (makeText));,在objc_msgSend函式中。首先通過obj的isa指標找到obj對應的class。在Class中先去cache中 通過SEL查詢對應函式method(猜測cache中method列表是以SEL為key通過hash表來儲存的,這樣能提高函式查詢速度),若 cache中未找到。再去methodList中查詢,若methodlist中未找到,則取superClass中查詢。若能找到,則將method加 入到cache中,以方便下次查詢,並通過method中的函式指標IMP跳轉到對應的函式中去執行。

類物件 中儲存都是減號 方法, 元類物件中儲存的都是加號方法;

設定 tableView 的背景色

  1. tableView.backgroundColor =[UIColor blueColor];  
  2. tableView.backgroundView =nil;  

自定義動畫程式  

[self transitionFromViewController:_friendsList toViewController:_messageList duration:0.2 options:UIViewAnimationOptionAllowAnimatedContent animations:nil completion:nil];

拿到 navigation appearance 的控制權 設定字串的顏色 :setTitleTextAttributes

星星 的渲染模式

UIImageRenderingModeAlwaysTemplate

設定 去除 navigationBar 上 的邊框  ;

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];  

  [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

UI座標系的 翻轉;

CGContextRotateCTM(currentContext, M_PI);

CGContextScaleCTM(currentContext, -1, 1);

    CGContextTranslateCTM(currentContext,0, -image.size.height);