有時候一點小知識可能要花很多時間才能搞明白,很小的東西就是一直卡在那里,下面介紹一下我在項目中遇到的問題,供大家參考
1.監聽UITextField的獲得焦點和失去焦點事件
- addTarget(繼承自UIControl)
[self addTarget:self action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin];
[self addTarget:self action:@selector(editingDidEnd) forControlEvents:UIControlEventEditingDidEnd];
UIControlEventEditingDidBegin
1.開始聚焦
2.獲得焦點
3.彈出鍵盤
UIControlEventEditingDidEnd
1.結束編輯
2.失去焦點
3.滾下鍵盤
- 代理
- 通知
- 利用內部的某些機制
/** 調用時刻:成為第一響應者(開始編輯\彈出鍵盤\獲得焦點) */
- (BOOL)becomeFirstResponder{
[self setValue:[UIColor whiteColor] forKeyPath:FRPlaceholderColorKeyPath];
return [super becomeFirstResponder];
}
/** 調用時刻:不做第一響應者(結束編輯\退出鍵盤\失去焦點) */
- (BOOL)resignFirstResponder{
[self setValue:[UIColor grayColor] forKeyPath:FRPlaceholderColorKeyPath];
return [super resignFirstResponder];
}
2.枚舉類型遇到<<
說明是可以組合使用的,如a = 1 << 0;b = 1 << 1;
3.tableView的間距
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
// 代理方法
4.cell創建的時候沒有調用initWithFrame
而是調用initWithStyle
方法
5.UITableViewCell的使用問題
- 循環使用
只要有其他的cell設置過imageView.image,其他不需要顯示圖片的cell都要設置imageView.image = nil,這是防止循環利用時出現bug,即不需要圖片的cell也會出現圖片
- 自定義右邊箭頭圖片
// cell右邊的箭頭
self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// 自定義圖片
self.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow"]];
6.設置圖片的拉伸
在右邊的Sllcing中的Sllces中選擇 水平拉伸 或者 垂直拉伸 或者 水平和垂直 都進行拉伸
7.Cocoapods
- Podfile.lock文件
- 描述最后一次更新Pods時,所有第三方框架的版本號
- 常用指令的區別
- pod install
- 根據Podfile文件安裝第三方框架
- 會根據Podfile.lock文件中的版本號來安裝第三方框架
- 如果一開始Podfile.lock文件不存在,就會按照Podfile文件中的版本號來安裝第三方框架
- pod update
- 根據Podfile文件安裝第三方框架
- 將所有第三方框架更新到最新版本,并且創建一個新的Podfile.lock文件
- 安裝框架之前,默認會執行pod repo update指令
- pod update --no-repo-update
- 根據Podfile文件安裝第三方框架
- 安裝框架之前,不會執行pod repo update指令
- pod install
8. 將解析出來的字典弄成plist文件保存在本地
[responseObject writeToFile:@"/Users/free/Desktop/me.plist" atomically:YES];
9.解決tableView設置tableFooterView的contentSize不正確的問題
tableView.tableFooterView = footerView;
// 重新刷新數據(其實也會重新計算contentSize)
[tableView reloadData];
10.沙盒目錄路徑
NSLog(@"%@",NSHomeDirectory());
11.緩存相關
- 不能下載東西到Documents,否則蘋果不允許上傳
- 一般緩存的東西放在沙盒中Library目錄下的Caches文件夾中
12.控制器如果檢測到自己的subView中的第一個子View是scrollView,會自動將其Y值設為64,控制器本身的Y值默認是20
13.
// 不允許自動調整scrollView的內邊距
self.automaticallyAdjustsScrollViewInsets = NO;
14.穿透效果
以iphone7為例:
在scrollView上添加tableView,
scrollView的高度設置為667,tableview的內邊距設置為(64,0,49,0);
15.觸發UIScrollViewDelegate
的停止滑動方法
/**
在scrollView滾動動畫結束時,就會調用這個方法
前提:認為拖拽scrollView產生的滾動動畫
*/
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
FRLogFunc;
}
/**
在動畫結束時,就會調用該方法
前提:當使用setContentOffset:animated:或者scrollRectVisible:animated:方法讓scrollView產生了滾動動畫
*/
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
FRLogFunc;
}
16.viewWithTag實現的大致思路
- (UIView *)viewWithTag:(NSInteger)tag{
if (self.tag == tag) return self;
for (UIView *subView in self.subViews) {
return [subView viewWithTag:tag];
}
}
17.默認情況下,所有控件的tag都是0。
18.一個請求任務被取消了(cancel),會自動調用AFN請求的failure這個block。
19.用AFN請求出錯的問題
if (error.code == NSURLErrorCancelled) { // error:取消請求
// 取消了任務
FRLog(@"取消了任務");
}else {
// 其他錯誤
FRLog(@"all請求失敗 - %ld",error.code);
}
20.設置tableViewCell之間的間距問題
- 重寫cell的setFrame方法
/** 重寫這個方法的目的:能攔截所有設置cell frame的操作 */
- (void)setFrame:(CGRect)frame{
// 先修改再調用super,這樣每個cell的間距都會留下5的間距
frame.size.height -= 5;
// 需要改左右邊距也可以在這里修改
frame.origin.x += 5;
frame.size.width -= 2 * 5;
[super setFrame:frame];
}
21.自動拉伸問題
-
從xib中加載進來的控件
autoresizingMask
屬性默認值是UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
如果一個控件顯示出來的大小和當初設置的frame大小不一致,有可能是因為
autoresizingMask
屬性值包含了UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
,解決方案:
self.autoresizingMask = UIViewAutoresizingNone;
22.父類中的某個內容,只允許子類來修改\提供,不能由外界來修改\提供
只提供get方法就行
//如:
- (NSString *)conString;
23.關于readonly屬性
// 這個屬性會生成count的get方法 和 _type成員變量
@propertr (nonatomic, assign, readonly) NSInteger count;
24.關于ios 10之后訪問相冊崩潰的問題
在info.plist里面配置下面兩個參數就可以了
25.AFN中取消網絡請求方法
[manager invalidateSessionCancelingTasks:YES];
// 或者
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
26.在AFN的網絡請求block中使用weakSelf,這是為了防止控制器銷毀了但是網絡仍在請求數據
__weak typeof(self) weakSelf = self;
27.利用圖形上下文做圓形圖片(設置太多的layer.cornerRadius會導致應用程序卡頓)
// 開啟圖形上下文
UIGraphicsBeginImageContext(image.size);
// 上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 添加一個圓
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 繪制圖片
[image drawInRect:rect];
// 獲得圖片
self.imageListView.image = UIGraphicsGetImageFromCurrentImageContext();
// 關閉圖形上下文
UIGraphicsEndImageContext();
28.對象屬性名不能以new
開頭
29. 判斷當前控制器的view是否在window上
// 如果當前控制器的view不在window上,就直接返回
if (self.view.window == nil) return ;
30.異常的捕獲
// 在異常的前面加上這個
@throw [NSException exceptionWithName:@"異常的名字" reason:@"異常的原因" userInfo:nil];
31.添加找不到的頭文件
在Build Setting中搜header se,在Header Search Paths中添加$(SRCTOOT)
(表示這個項目的路徑)
32.根據collectionview的偏移量來判斷是左滑還是優化,變大為左滑,變小為右滑
33.測試網絡:http://httpbin.org/
34.CGPoint轉成NSValue,然后通過NSValue的CGPointValue轉回去
35.ios下dyld:Library not load解決方案
一頓搜索之后發現這個問題得產生是因為引用得一些framework只能存在于高版本得sdk中,但是,如果編譯到低版本的ios就會發生這樣的問題,我的真機是iOS6的版本的,GameController.framework可能高于這個版本,這里只需要在對應的target下的Build Phases標簽里,找到Link Binary With Libraries,在里面找到GameController.framework,把status由Required 修改成Optional,然后再運行就OK了。其他的framework報錯也適用,只需要修改對應的framework的status就行了。