iOS開發中遇到過的坑

前言

做iOS開發這麼長時間以來,遇到過不少難題,也踩過不少坑,本來沒想過要寫這篇文章,但是鑑於以下三點,筆者決定對遇到過的並且還能回憶起來的問題做個記錄。

  • 每次問題解決後,滿滿的成就感,但是當下一次再遇到時,又是一臉懵逼。這個問題我好像見過,但就是不記得怎麼解決,記錄下來方便以後查閱。

  • 每次面試的時候,面試官總會問我,你在開發中遇到過哪些問題,怎麼解決的?問題嘛,挺多的,但是你要我敘述嘛,我......我......我居然一時想不起來,迷之尷尬????(面試官當時想法:一看就是個沒工作經驗僞造簡歷的),冤枉啊。

  • 爲遇到同樣問題的開發者提供一個參考

那些遇到過的問題與踩過的坑

1.手機錄音或通話時,app界面整體下移

當你的iphone在錄音或者通話時,打開app你會發現,整個界面都下移了20像素,這個問題對於scrollView、tableView等可以垂直滾動的視圖可能沒有太大影響,但是對於那些不能滾動的視圖,就有可能底部被遮蓋20像素

筆者在網上查閱了資料,也試過多種方法,這個問題依然存在,最後筆者不得不使用大絕招來解決,何爲大絕招?很簡單,位置尺寸寫死。項目中導航控制器是自定義的,在自定義的類中添加如下代碼就OK了。

2.點擊導航欄下方也會觸發導航欄按鈕的點擊事件

如圖所示,每次想選中右上角的圖片,結果總是觸發“取消”事件,明明沒有點到導航欄上面去,問題的原因不清楚,解決方法創建一個UINavigationBar的分類,重寫hitTest方法

如果觸摸點不在它上面,就不讓它接收用戶交互,然後使用系統的事件處理方法去處理

3.輸入中文時限制字符長度

限制字母、數字、符號等其他非中文字符的長度大家應該都知道咋整,但如果是中文輸入法,這就比較蛋疼了。舉個例子,限制長度爲5,輸入“我愛寫代碼”,當已經輸入“我愛寫”兩字,然後輸入“代碼”時就會出現如下情況

根本寫不進去啊,這是爲什麼呢?因爲輸入的拼音也被計算在了字符串長度之內,導致輸入“da”以後就不能繼續輸入了,可通過下面的辦法解決

4.修改導航欄顏色

這個問題對有經驗的開發者來說不是問題,但是當年筆者剛入行時,確實被這個問題折騰了好久。比如想設置導航欄的顏色爲藍色

self.navigationController.navigationBar.backgroundColor = [UIColor blueColor];

運行,然後......這特麼是藍色?筆者確定自己不是色盲

後來才知道,設置導航欄的背景色,需要設置barTintColor而不是backgroundColor

self.navigationController.navigationBar.barTintColor = [UIColor blueColor];

5.界面莫名其妙下移

這個問題跟上面的問題一樣,都是比較基礎的問題,有經驗的人都知道如何解決,但是筆者曾經也被折磨過

爲什麼下面textView的內容不是從最上面開始的,而且還不能滾上去,當初真的被這種情況折騰的死去活來的,改frame,改約束,都沒效果。後來才知道,當有導航控制器時,系統會默認將第一個添加的scrollView或其子類視圖的內容下移64個像素,下面的textView是先添加的,所以其內容被下移了,而上面的卻沒有,解決方法是在控制器里加上下面這句代碼

self.automaticallyAdjustsScrollViewInsets = NO;

6.GCD組函數

筆者在開發中遇到過這樣一個功能,某個界面列表上面是企業,下面是聯繫人,而且獲取企業列表與聯繫人列表的接口不是同一個,必須等企業跟聯繫人列表數據都獲取完畢後才能刷新,於是就用到了GCD組函數

然而問題來了,[[IBOSServer shared]...]這玩意兒是封裝好的,並且是個異步函數,大家應該都知道,異步函數不會阻塞線程,不用等裏面的內容執行完就返回了,這就導致數據還沒拿到,就開始執行notify裏面的代碼了。後來筆者發現,原來GCD組函數還有一種用法,完美解決問題

7.UISearchController

iOS8纔出來的,用來替換UISearchBar + UISearchDisplayController的組合方式,項目中有用到搜索功能,於是筆者就嘗試着用了一下UISearchController,將搜索框添加到了tableView的tableHeaderView上。然而當點擊搜索框準備搜索時,神奇的事情發生了

搜索框居然飛到九霄雲外去了,好難過,這不是我要的那種結果,結果.....
怎麼解決呢?在控制器里加上下面這句代碼就OK了,至於爲什麼,呵呵,不知道

self.definesPresentationContext = YES;

8.自定義相機照片截取

這個問題說難不難,說簡單也不簡單,筆者當時確實花了很長一段時間才弄清楚,但是當問題解決後,感覺這特麼也不復雜啊,之前怎麼就沒整明白呢

問題是這樣的,在使用自定義相機拍完照後,需要對圖片的指定區域(藍色方框內的區域)進行截取然後上傳,這裏存在兩個問題。

拍攝時你所看到的區域,跟實際拍出來的區域是不一樣的

上圖就是實際拍出來的圖片,明顯比拍攝時看到的圖片要長,不過寬度是一樣的

照片的座標系與我們平時開發所使用的座標系是不一樣的,開發中所使用的視圖座標系是以左上角爲原點的,橫向爲x軸,縱向爲y軸,而拍攝出來的照片是以右上角爲原點的,橫向爲y軸,縱向爲x軸。

我們先來看一幅圖

由於拍攝時所看到視圖寬高比與實際拍攝出來的圖片的寬高比並不一致,所以導致圖片經過等比例縮放到寬度一樣時,高度有一部分超出了我們的可視範圍,首先,我們要計算出超出部分的高度

//_cameraView爲相機視圖,即拍攝時看到圖片的區域

CGFloat scale = image.size.width / _cameraView.width;//計算出縮放的比例

CGFloat showImageH = image.size.height / scale;//縮放後圖片的高度

CGFloat offsetY = (showImageH - _cameraView.height) * 0.5;//上下超出的部分是相等的,所以*0.5得出上面超過的部分

超出部分的高度計算完後,我們就要來計算藍色方框(_circleView,_cameraView的子控件)的座標了

x:(offsetY+_circleView.y) * scale,別忘了乘以縮放比例

y:_circleView.x * scale,因爲circleView在父控件中水平居中,所以_circleView在父控件中的x值乘以縮放比就是在圖片座標系中的y值

width:_circleView.height scale

height:_circleView.width scale

然後根據計算好的frame截取圖片就ok了

CGRect rect = CGRectMake(x, y, width,height);

CGImageRef tailorImageRef = CGImageCreateWithImageInRect(photo.CGImage, rect);

UIImage *tailorImage = [UIImage imageWithCGImage:tailorImageRef];

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章