在項(xiàng)目開(kāi)發(fā)中荸镊,自己遇到一些問(wèn)題及解決方法,不斷更新中堪置。
(1)UINavigationBar
和UITabBar
上有一條橫線躬存,是ShadowImage
,默認(rèn)是黑色的舀锨。在項(xiàng)目開(kāi)發(fā)中岭洲,可以改變其圖片和顏色。在下圖個(gè)人熱點(diǎn)圖中可以看到導(dǎo)航欄下面的黑線坎匿。
[self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:MyColor]];
(2) statusBar
默認(rèn)的高度是20.0f盾剩,在使用微信或者QQ通話雷激,熱點(diǎn)等功能進(jìn)入后臺(tái)時(shí),statusBar
的高度會(huì)變?yōu)?0.0f告私,下方的布局也會(huì)發(fā)生變化屎暇,在此要根據(jù)statusBar
的變化調(diào)整布局,設(shè)置監(jiān)聽(tīng)監(jiān)聽(tīng)其變化驻粟。
監(jiān)聽(tīng)對(duì)象為UIApplicationDidChangeStatusBarFrameNotification
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];//添加監(jiān)聽(tīng)
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarFrameNotification object:nil];//移除監(jiān)聽(tīng)
當(dāng)前statusBar的高度也是可以獲取的:
NSValue *rectValue = [notification.userInfo objectForKey:UIApplicationStatusBarFrameUserInfoKey];
CGRect statusRect = [rectValue CGRectValue];
CGRect statusFrame = [self.view convertRect:statusRect fromView:[[UIApplication sharedApplication]keyWindow]];
CGFloat statusHeight = statusFrame.size.height;
(3)在iPad開(kāi)發(fā)時(shí)根悼,使用iOS 9系統(tǒng)會(huì)出現(xiàn)tableviewCell
的位置變化,在開(kāi)發(fā)中默認(rèn)與右側(cè)是15個(gè)像素格嗅,可是現(xiàn)在明顯大的多番挺,這是因?yàn)樵趇OS 9后tableview
的一個(gè)屬性發(fā)生了變化。
需要調(diào)整
tableView.cellLayoutMarginsFollowReadableWidth = NO;
補(bǔ)充屯掖,因?yàn)榉椒ㄊ莍OS9之后出現(xiàn)的玄柏,因此在調(diào)用時(shí)需要判斷系統(tǒng)是否大于9.0
if([UIDevice currentDevice].systemVersion.floatValue >= 9.0){
tableView.cellLayoutMarginsFollowReadableWidth = NO;
}
(4)在做直播功能模塊,使用到 彈幕 的功能(彈幕使用第三方庫(kù)BarrageRenderer
)贴铜,彈幕為橫屏自動(dòng)開(kāi)啟粪摘,豎屏?xí)r關(guān)閉。在測(cè)試用發(fā)現(xiàn)彈幕有時(shí)開(kāi)有時(shí)關(guān)绍坝,最終發(fā)現(xiàn)在屏幕橫放時(shí)無(wú)法顯示徘意。原因是設(shè)置方法出現(xiàn)錯(cuò)誤。
通過(guò)[UIDevice currentDevice].orientation
的狀態(tài)判斷橫豎屏?xí)霈F(xiàn)錯(cuò)誤轩褐,因?yàn)槠涿杜e類型是UIDeviceOrientation
椎咧,在查看其枚舉類型時(shí)會(huì)發(fā)現(xiàn)其除了Portrait
LandscapeLeft
LandscapeRight
PortraitUpsideDown
外還有FaceUp
FaceDown
兩個(gè)狀態(tài),忽略對(duì)其的設(shè)置會(huì)產(chǎn)生影響把介。
UIDeviceOrientation
枚舉
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom
UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top
UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the right
UIDeviceOrientationLandscapeRight, // Device oriented horizontally, home button on the left
UIDeviceOrientationFaceUp, // Device oriented flat, face up
UIDeviceOrientationFaceDown // Device oriented flat, face down
} __TVOS_PROHIBITED;
在對(duì)其使用時(shí)還可以將其轉(zhuǎn)換成UIInterfaceOrientation
勤讽,因?yàn)楹笳咧挥谐R?jiàn)的幾種類型。
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
UIInterfaceOrientation interfaceOrientation = (UIInterfaceOrientation)orientation;
UIInterfaceOrientation
枚舉
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown,
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
} __TVOS_PROHIBITED;
另外在橫豎屏切換時(shí)我們會(huì)對(duì)屏幕的狀態(tài)做監(jiān)聽(tīng)拗踢,通常監(jiān)聽(tīng)的是UIDeviceOrientationDidChangeNotification
,監(jiān)聽(tīng)得到的結(jié)果是UIDeviceOrientation
脚牍,也可以監(jiān)聽(tīng)UIApplicationDidChangeStatusBarFrameNotification
,得到UIInterfaceOrientation
巢墅。當(dāng)然UIApplicationDidChangeStatusBarFrameNotification
也可以監(jiān)聽(tīng)熱點(diǎn)等事件中出現(xiàn)的問(wèn)題诸狭,如問(wèn)題2.
(5)引入sdk報(bào)錯(cuò)(非pod)
_res_9_ninit", referenced from: _setup_dns_server in QNResolver.o
- 項(xiàng)目中需導(dǎo)入 libresolv.dylib或libresolv.9.dylib。(Build Phases --- Link Binary With Libraries)君纫;
- 或 (Build Settings --- Linking --- Other Linker Flags) 添加 -lresolv 選項(xiàng)
(6)在使用tableView
時(shí)驯遇,使用footerView
在最后一行默認(rèn)不顯示最后一條橫線。簡(jiǎn)單粗暴的方法蓄髓,在cell中重寫layoutSubviews
方法妹懒。
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *subview in self.contentView.superview.subviews) {
if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
subview.hidden = NO;
}
}
}
(7)項(xiàng)目中有視頻緩存,使用騰訊云下載完成下載功能双吆,于是問(wèn)題就來(lái)了眨唬,相信在做視頻緩存会前、下載功能的同行可能也會(huì)遇到這種問(wèn)題。
視頻下載完成后匾竿,在 我的緩存中 查看瓦宜,沒(méi)有問(wèn)題,但當(dāng)軟件更新或重新安裝岭妖,視頻列表還在临庇,但視頻打不開(kāi)了。
查看騰訊云視頻成功回調(diào)昵慌,發(fā)現(xiàn)在返回的字典中假夺,緩存文件的路徑是完整的。如圖斋攀。
查看文件路徑并重新安裝后會(huì)發(fā)現(xiàn)文件內(nèi)容沒(méi)變已卷,但文件名變了。
這說(shuō)明淳蔼,app在重新安裝或升級(jí)后侧蘸,會(huì)重新建一個(gè)文件,并將原來(lái)的文件全部copy過(guò)去鹉梨,然后將原文件刪除讳癌。
知道原因之后就要解決了,當(dāng)然解決的方法簡(jiǎn)單粗暴存皂,既然是文件名晌坤,那就進(jìn)行拼接和裁剪了。在plist
文件中存儲(chǔ)的是裁剪后的后半段路徑旦袋,而讀取文件路徑后再拼接上Caches
地址骤菠。
獲取Caches
目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
(8)iOS給好評(píng)時(shí)一般會(huì)直接打開(kāi)app store應(yīng)用詳情界面,其實(shí)也可以直接跳轉(zhuǎn)到評(píng)論頁(yè)面猜憎,更有利于引導(dǎo)用戶打分和評(píng)論娩怎。(將下面id改成自己的app id即可)
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=id1128294199&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8"]];
直接跳轉(zhuǎn)到詳情
https://itunes.apple.com/cn/app/jia-zhang-mu-ke/id1128294199?mt=8
(9)鍵盤操作
測(cè)試發(fā)現(xiàn)一個(gè)問(wèn)題搔课,切換輸入法的時(shí)候鍵盤高度會(huì)上移胰柑,查找發(fā)現(xiàn),UIKeyboardWillShowNotification
監(jiān)聽(tīng)會(huì)調(diào)用多次爬泥,每次輸入法(如中英文)切換時(shí)會(huì)調(diào)用柬讨,從而調(diào)用相關(guān)修改布局的方法。
初始時(shí)textField
所在的view
不顯示在視圖中袍啡,通過(guò)button
的觸發(fā)才顯示踩官,因此原監(jiān)聽(tīng)后的調(diào)用方法:
float time = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGRect beginRect = [dic[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGRect endRect = [dic[UIKeyboardFrameEndUserInfoKey] CGRectValue];
[UIView animateWithDuration:time animations:^{
self.bottomView.hidden = NO;
CGRect rect = self.bottomView.frame;
rect.origin.y -= (beginRect.origin.y - endRect.origin.y+50);
self.bottomView.frame = rect;
}];
嘗試用值紀(jì)錄調(diào)用次數(shù),只記錄第一次調(diào)用發(fā)現(xiàn)也不可行境输,故將其view隱藏蔗牡,通過(guò)按鈕的觸發(fā)顯示颖系。
self.bottomView.hidden = NO;
rect.origin.y -= (beginRect.origin.y - endRect.origin.y);
[補(bǔ)充]
后來(lái)發(fā)現(xiàn)鍵盤高度會(huì)變化是由于IQKeybord惹的禍,將其禁用后使用原方法可以辩越。
(10)UITextView
回車發(fā)送
在UITextField
中有這樣一個(gè)代理函數(shù)嘁扼,可以實(shí)現(xiàn)鍵盤回車鍵發(fā)送的功能
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
但是UITextView
中并沒(méi)有這個(gè)方法,所以需要判斷當(dāng)前輸入的字符是否是回車黔攒,然后做出響應(yīng)的處理趁啸。在這個(gè)函數(shù)的最后一個(gè)參數(shù)text
代表你每次輸入的的那個(gè)字,所以:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange: (NSRange)range replacementText:(NSString *)text{
if ([text isEqualToString:@"\n"]){
return NO;
}
return YES;
}
(11)TableView如何在初始化就選中某一行督惰?
[self.tableView selectRowAtIndexPath:indexpath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; //選中第5行
(12)UISwitch顏色的改變
switchView.onTintColor = [UIColor colorWithRed:225/256.0 green:225/256.0 blue:225/256.0 alpha:1];
switchView.thumbTintColor = DEF_LightBlueColor;
更多問(wèn)題后續(xù)補(bǔ)充不傅,歡迎探討指正
文章優(yōu)先發(fā)表于:http://keyliu.com
轉(zhuǎn)載請(qǐng)注明出處恃锉。