[程序員日記]iOS 開發中遇到的問題(客戶端篇)

在項目開發中,自己遇到一些問題及解決方法,不斷更新中。

(1)UINavigationBarUITabBar上有一條橫線,是ShadowImage,默認是黑色的。在項目開發中,可以改變其圖片和顏色。在下圖個人熱點圖中可以看到導航欄下面的黑線。

[self.navigationController.navigationBar  setShadowImage:[UIImage imageWithColor:MyColor]];

(2) statusBar默認的高度是20.0f,在使用微信或者QQ通話,熱點等功能進入后臺時,statusBar的高度會變為40.0f,下方的布局也會發生變化,在此要根據statusBar的變化調整布局,設置監聽監聽其變化。

打開熱點時`statusBar`高度變化

監聽對象為UIApplicationDidChangeStatusBarFrameNotification

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];//添加監聽

[[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarFrameNotification object:nil];//移除監聽

當前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開發時,使用iOS 9系統會出現tableviewCell的位置變化,在開發中默認與右側是15個像素,可是現在明顯大的多,這是因為在iOS 9后tableview的一個屬性發生了變化。

tableviewCell位置變化

需要調整

tableView.cellLayoutMarginsFollowReadableWidth = NO;

補充,因為方法是iOS9之后出現的,因此在調用時需要判斷系統是否大于9.0

if([UIDevice currentDevice].systemVersion.floatValue >= 9.0){
    tableView.cellLayoutMarginsFollowReadableWidth = NO;
}

(4)在做直播功能模塊,使用到 彈幕 的功能(彈幕使用第三方庫BarrageRenderer),彈幕為橫屏自動開啟,豎屏時關閉。在測試用發現彈幕有時開有時關,最終發現在屏幕橫放時無法顯示。原因是設置方法出現錯誤。

通過[UIDevice currentDevice].orientation 的狀態判斷橫豎屏會出現錯誤,因為其枚舉類型是UIDeviceOrientation,在查看其枚舉類型時會發現其除了Portrait LandscapeLeft LandscapeRight PortraitUpsideDown外還有FaceUp FaceDown兩個狀態,忽略對其的設置會產生影響。

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;

在對其使用時還可以將其轉換成UIInterfaceOrientation,因為后者只有常見的幾種類型。

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;

另外在橫豎屏切換時我們會對屏幕的狀態做監聽,通常監聽的是UIDeviceOrientationDidChangeNotification,監聽得到的結果是UIDeviceOrientation,也可以監聽UIApplicationDidChangeStatusBarFrameNotification,得到UIInterfaceOrientation。當然UIApplicationDidChangeStatusBarFrameNotification也可以監聽熱點等事件中出現的問題,如問題2.

(5)引入sdk報錯(非pod)

_res_9_ninit", referenced from: _setup_dns_server in QNResolver.o 
  1. 項目中需導入 libresolv.dylib或libresolv.9.dylib。(Build Phases --- Link Binary With Libraries);
  2. 或 (Build Settings --- Linking --- Other Linker Flags) 添加 -lresolv 選項

(6)在使用tableView時,使用footerView在最后一行默認不顯示最后一條橫線。簡單粗暴的方法,在cell中重寫layoutSubviews方法。

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
              subview.hidden = NO;
        }
    }
}
顯示tableView最后一行橫線

(7)項目中有視頻緩存,使用騰訊云下載完成下載功能,于是問題就來了,相信在做視頻緩存、下載功能的同行可能也會遇到這種問題。

視頻下載完成后,在 我的緩存中 查看,沒有問題,但當軟件更新或重新安裝,視頻列表還在,但視頻打不開了。

查看騰訊云視頻成功回調,發現在返回的字典中,緩存文件的路徑是完整的。如圖。

查看文件路徑

查看文件路徑并重新安裝后會發現文件內容沒變,但文件名變了。

重新安裝前
重新安裝后

這說明,app在重新安裝或升級后,會重新建一個文件,并將原來的文件全部copy過去,然后將原文件刪除。

知道原因之后就要解決了,當然解決的方法簡單粗暴,既然是文件名,那就進行拼接和裁剪了。在plist文件中存儲的是裁剪后的后半段路徑,而讀取文件路徑后再拼接上Caches地址。

獲取Caches目錄路徑的方法:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];

(8)iOS給好評時一般會直接打開app store應用詳情界面,其實也可以直接跳轉到評論頁面,更有利于引導用戶打分和評論。(將下面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"]];

直接跳轉到詳情

https://itunes.apple.com/cn/app/jia-zhang-mu-ke/id1128294199?mt=8

(9)鍵盤操作
測試發現一個問題,切換輸入法的時候鍵盤高度會上移,查找發現,UIKeyboardWillShowNotification監聽會調用多次,每次輸入法(如中英文)切換時會調用,從而調用相關修改布局的方法。

多次調用監聽

初始時textField所在的view不顯示在視圖中,通過button的觸發才顯示,因此原監聽后的調用方法:

  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;
  }];

嘗試用值紀錄調用次數,只記錄第一次調用發現也不可行,故將其view隱藏,通過按鈕的觸發顯示。

self.bottomView.hidden = NO;
rect.origin.y -= (beginRect.origin.y - endRect.origin.y);

[補充]
后來發現鍵盤高度會變化是由于IQKeybord惹的禍,將其禁用后使用原方法可以。

(10)UITextView回車發送
UITextField中有這樣一個代理函數,可以實現鍵盤回車鍵發送的功能

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

但是UITextView中并沒有這個方法,所以需要判斷當前輸入的字符是否是回車,然后做出響應的處理。在這個函數的最后一個參數text代表你每次輸入的的那個字,所以:

- (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;

更多問題后續補充,歡迎探討指正

文章優先發表于:http://keyliu.com
轉載請注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • 概述在iOS開發中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,080評論 3 38
  • 作業一 作業二
  • 最近陸續看了「次第花開」,「透過佛法看世界」以及「正念的奇跡」,獲益匪淺,被佛法的廣闊無邊和博大精深深深吸引。我做...
    寂顏慕菲閱讀 778評論 0 1
  • 時間,太多說不清與道不明。 曾經扒著不放的等回頭,如今面對回頭,心情或許是那時候換位的一種體驗,只是在換位中不公平...
    半顆西柚閱讀 331評論 0 0