前言(轉(zhuǎn))
做iOS開發(fā)這么長時間以來,遇到過不少難題等恐,也踩過不少坑洲劣,本來沒想過要寫這篇文章,但是鑒于以下三點课蔬,筆者決定對遇到過的并且還能回憶起來的問題做個記錄闪檬。
每次問題解決后,滿滿的成就感购笆,但是當下一次再遇到時,又是一臉懵逼虚循。這個問題我好像見過同欠,但就是不記得怎么解決,記錄下來方便以后查閱横缔。
每次面試的時候铺遂,面試官總會問我,你在開發(fā)中遇到過哪些問題茎刚,怎么解決的襟锐?問題嘛,挺多的膛锭,但是你要我敘述嘛粮坞,我......我......我居然一時想不起來,迷之尷尬????(面試官當時想法:一看就是個沒工作經(jīng)驗偽造簡歷的)初狰,冤枉啊莫杈。
為遇到同樣問題的開發(fā)者提供一個參考
那些遇到過的問題與踩過的坑
1.手機錄音或通話時,app界面整體下移
當你的iphone在錄音或者通話時奢入,打開app你會發(fā)現(xiàn)筝闹,整個界面都下移了20像素,這個問題對于scrollView腥光、tableView等可以垂直滾動的視圖可能沒有太大影響关顷,但是對于那些不能滾動的視圖,就有可能底部被遮蓋20像素
筆者在網(wǎng)上查閱了資料武福,也試過多種方法议双,這個問題依然存在,最后筆者不得不使用大絕招來解決艘儒,何為大絕招聋伦?很簡單夫偶,位置尺寸寫死。項目中導航控制器是自定義的觉增,在自定義的類中添加如下代碼就OK了
2.點擊導航欄下方也會觸發(fā)導航欄按鈕的點擊事件
如圖所示兵拢,每次想選中右上角的圖片,結(jié)果總是觸發(fā)“取消”事件逾礁,明明沒有點到導航欄上面去说铃,問題的原因不清楚,解決方法創(chuàng)建一個UINavigationBar的分類嘹履,重寫hitTest方法
如果觸摸點不在它上面腻扇,就不讓它接收用戶交互,然后使用系統(tǒng)的事件處理方法去處理
3.輸入中文時限制字符長度
限制字母砾嫉、數(shù)字幼苛、符號等其他非中文字符的長度大家應該都知道咋整,但如果是中文輸入法焕刮,這就比較蛋疼了舶沿。舉個例子,限制長度為5配并,輸入“我愛寫代碼”括荡,當已經(jīng)輸入“我愛寫”兩字,然后輸入“代碼”時就會出現(xiàn)如下情況
根本寫不進去啊溉旋,這是為什么呢畸冲?因為輸入的拼音也被計算在了字符串長度之內(nèi),導致輸入“da”以后就不能繼續(xù)輸入了观腊,可通過下面的辦法解決
4.修改導航欄顏色
這個問題對有經(jīng)驗的開發(fā)者來說不是問題邑闲,但是當年筆者剛?cè)胄袝r,確實被這個問題折騰了好久梧油。比如想設(shè)置導航欄的顏色為藍色
self.navigationController.navigationBar.backgroundColor = [UIColor blueColor];
運行监憎,然后......????這特么是藍色?筆者確定自己不是色盲
后來才知道婶溯,設(shè)置導航欄的背景色鲸阔,需要設(shè)置barTintColor而不是backgroundColor
self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
5.界面莫名其妙下移
這個問題跟上面的問題一樣,都是比較基礎(chǔ)的問題迄委,有經(jīng)驗的人都知道如何解決褐筛,但是筆者曾經(jīng)也被折磨過
為什么下面textView的內(nèi)容不是從最上面開始的,而且還不能滾上去叙身,當初真的被這種情況折騰的死去活來的渔扎,改frame,改約束信轿,都沒效果晃痴。后來才知道残吩,當有導航控制器時,系統(tǒng)會默認將第一個添加的scrollView或其子類視圖的內(nèi)容下移64個像素倘核,下面的textView是先添加的泣侮,所以其內(nèi)容被下移了,而上面的卻沒有紧唱,解決方法是在控制器里加上下面這句代碼
self.automaticallyAdjustsScrollViewInsets = NO;
6.GCD組函數(shù)
筆者在開發(fā)中遇到過這樣一個功能活尊,某個界面列表上面是企業(yè),下面是聯(lián)系人漏益,而且獲取企業(yè)列表與聯(lián)系人列表的接口不是同一個蛹锰,必須等企業(yè)跟聯(lián)系人列表數(shù)據(jù)都獲取完畢后才能刷新,于是就用到了GCD組函數(shù)
然而問題來了绰疤,[[IBOSServer shared]...]這玩意兒是封裝好的铜犬,并且是個異步函數(shù),大家應該都知道轻庆,異步函數(shù)不會阻塞線程翎苫,不用等里面的內(nèi)容執(zhí)行完就返回了,這就導致數(shù)據(jù)還沒拿到榨了,就開始執(zhí)行notify里面的代碼了。后來筆者發(fā)現(xiàn)攘蔽,原來GCD組函數(shù)還有一種用法龙屉,完美解決問題
7.UISearchController
iOS8才出來的,用來替換UISearchBar + UISearchDisplayController的組合方式满俗,項目中有用到搜索功能转捕,于是筆者就嘗試著用了一下UISearchController,將搜索框添加到了tableView的tableHeaderView上唆垃。然而當點擊搜索框準備搜索時五芝,神奇的事情發(fā)生了
搜索框居然飛到九霄云外去了,好難過辕万,這不是我要的那種結(jié)果枢步,結(jié)果.....
怎么解決呢?在控制器里加上下面這句代碼就OK了渐尿,至于為什么醉途,呵呵????,不知道
self.definesPresentationContext = YES;
8.自定義相機照片截取
這個問題說難不難砖茸,說簡單也不簡單隘擎,筆者當時確實花了很長一段時間才弄清楚,但是當問題解決后凉夯,感覺這特么也不復雜啊货葬,之前怎么就沒整明白呢
問題是這樣的采幌,在使用自定義相機拍完照后,需要對圖片的指定區(qū)域(藍色方框內(nèi)的區(qū)域)進行截取然后上傳震桶,這里存在兩個問題
拍攝時你所看到的區(qū)域休傍,跟實際拍出來的區(qū)域是不一樣的
上圖就是實際拍出來的圖片,明顯比拍攝時看到的圖片要長尼夺,不過寬度是一樣的
照片的坐標系與我們平時開發(fā)所使用的坐標系是不一樣的
開發(fā)中所使用的視圖坐標系是以左上角為原點的尊残,橫向為x軸,縱向為y軸淤堵,而拍攝出來的照片是以右上角為原點的寝衫,橫向為y軸,縱向為x軸
我們先來看一幅圖
由于拍攝時所看到視圖寬高比與實際拍攝出來的圖片的寬高比并不一致拐邪,所以導致圖片經(jīng)過等比例縮放到寬度一樣時慰毅,高度有一部分超出了我們的可視范圍,首先扎阶,我們要計算出超出部分的高度
//_cameraView為相機視圖汹胃,即拍攝時看到圖片的區(qū)域
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
然后根據(jù)計算好的frame截取圖片就ok了
CGRect rect = CGRectMake(x, y, width,height);
CGImageRef tailorImageRef = CGImageCreateWithImageInRect(photo.CGImage, rect);
UIImage *tailorImage = [UIImage imageWithCGImage:tailorImageRef];
結(jié)束語
遇到過的坑,遠遠不止上面這些赁濒,不過有些不記得了轨奄,以后遇到了再補上吧!