小知識點
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 = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"取消" 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];
URL Sceme URL 白名單
設置在深色背景下狀態欄白字
設置在淺色背景下狀態欄黑色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
JSBadgeView badgeView 的功能
JSBadgeView 可以直接浮現在 parentView 的一個位置上
JSBadgeView *badgeView = [[JSBadgeView alloc] initWithParentView:imageViewLeft alignment:JSBadgeViewAlignmentTopRight];
自定義導航欄背景和標題的顏色
[self.navigationController.navigationBarsetBarTintColor:[UIColorcolorWithRed:20/255.0green:155/255.0blue:213/255.0alpha:1.0]];
[self.navigationController.navigationBarsetTitleTextAttributes:[NSDictionarydictionaryWithObjectsAndKeys:[UIColorwhiteColor],UITextAttributeTextColor,nil]];
用 TitleTextAttributes 這個方法;
兩個控制器之間的轉換
[self transitionFromViewController:_messageList toViewController:_friendsList duration:0.2 options:UIViewAnimationOptionAllowAnimatedContent animations:nil completion:nil];
最簡單的添加四邊約束
[_webView mas_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.mainScrollview scrollRectToVisible: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*)nibforCellReuseIdentifier:(NSString*)identifierNS_AVAILABLE_IOS(5_0);
-(void)registerClass:(Class)cellClassforCellReuseIdentifier:(NSString*)identifierNS_AVAILABLE_IOS(6_0);
3 比如你已經用NIB做了一個Cell,或者自定義了一個Cell。我們在你創建UITableView的時候,就可以順帶
self.tableView.backgroundColor=xxxx;
[self.tableViewregisterClass:[CustomCellclass]forCellReuseIdentifier:@"CustomCell"];
這樣你在
-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath這個方法裡,
你就可以省下這些代碼:
staticNSString*CellIdentifier=@"Cell";
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"Cell"];
if(cell==nil){
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
//設置你的cell
}
而只需要
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"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 = [NSMutableArray arrayWithCapacity:0];
for(NSInteger i = 0; i<_imageArr.count - 1; i++){
[imageArray addObject:_imageArr[i + 1]];
}
[BillApi sendBillUploadBillRequestWithImagesArray:imageArray parameterOfimages:@"request" parametersDict:nil compressionRatio:0.6 succeedBlock:^(id operation, id responseObject) {
if ([responseObject[@"status"] integerValue] == 200 ) {
[self addBillCheckListWithDataDict:responseObject[@"data"]];
}
NSLog(@"=image==resonse%@",[NSString jsonStrWithData:responseObject]);
} failedBlock:^(id operation, NSError *error) {
[MBProgressHUD showError:@"網路正忙"];
NSLog(@"=image==error%@",error);
} uploadProgressBlock:^(float uploadPercent, long long totalBytesWritten, long long 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 畫圖
size_t 類型
%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_tsize_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 的背景色
自定義動畫程式
[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);