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 = [[
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上實現。
- 畫中畫
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 的背景色
- tableView.backgroundColor =[UIColor blueColor];
- 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);