首先聲明,這篇文章大部分是我從cocoaChina上面看的一篇文章www.cocoachina.com/ios/20170221/18735.html?這是我看文章的連接,感覺作者遇到的問題和我的有很多類似,(圖片也是盜用的??)由于我不善于總結, 只好將別人的搬過來,以防自己在遇見這樣的坑
那些遇到的問題和踩過的坑
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組函數
然而問題來了,
[[IBOsser 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];
9 嵌套在scrollView里面的tableView實現左滑刪除功能
首先在tableView里面實現cell的左滑刪除功能是挺簡單的,相信大家都懂得怎么做。但是,當有多個tableView放在一個scrollView里面的時候,會產生一系列的問題。
問題1:
scrollView在滑倒最邊上(左或右)的時候,為了提醒用戶已經滑到最邊上了(左或右),再繼續向左(右)滾動的話會有一個反彈的效果,這就造成左滑刪除的時候,整個tableView會出現一個我們不想看到的反彈效果。
解決方法:
會出現這種效果,是因為蘋果為了讓用戶知道scrollView已經滑到了最邊上了,而不是程序卡了或者出現問題了而不能滑動。所以,scrollView對象里面有三個屬性,分別是bounces,bounceHorizontally與bounceVertically三個屬性,通過 self.scrollView.bounces = NO;這行代碼就可以讓scrollView滑倒邊上的時候不會出現反彈效果。
問題2:
當你把scrollView滑到最邊上(左或右)的時候,當你繼續做滑想要讓cell接收左滑手勢的時候,這時滑動刪除的事件被底部的UIScrollview給響應了,cell根本拿不到這個滑動手勢。tableView是UIScrollview 的子類,cell里面的ContentView好像在iOS7.0之后也是UIScrollview ,再加底部一個UIScrollview,這滑動手勢事件該怎么傳遞好呢,給誰都不行啊。 給了底部,那么就沒法滑動刪除,給了cell那么正常的左右滑動又不行了。
解決方法:
首先,新建一個MyScrollView類,讓其繼承于UIScrollView,并且遵循UIGestureRecognizerDelegate協議。
@interface MyScrollview : UIScrollView
iOS的UIGestureRecognizer基類內包含 Tap(點擊)、Pinch(捏合)、Rotation(旋轉)、Swipe(滑動)、Pan(拖移)、LongPress(長按)這幾種常用手勢動作,又細分單擊、雙擊、左滑、右滑等操作。
然后重寫下類方法:
別的代碼還按照你原來的思路走就好了
結束: 以后有什么問題我都會更新的 一時也想不起那么多了