首先聲明,這篇文章大部分是我從cocoaChina上面看的一篇文章www.cocoachina.com/ios/20170221/18735.html?這是我看文章的連接,感覺作者遇到的問題和我的有很多類似,(圖片也是盜用的??)由于我不善于總結, 只好將別人的搬過來,以防自己在遇見這樣的坑
那些遇到的問題和踩過的坑
1 手機錄音或通話時,app界面整體下移
當你的iphone字啊錄音或通話時,打開app你會發(fā)現,整個界面都移了20個像素,這個問題對于scrollview,tableview等可以垂直滾動的視圖可能沒有太大影響,但對于那些不能滾動的視圖,就有可能底部被遮蓋20像素
筆者在網上查閱了資料,也試過多種方法漆际,這個問題依然存在擅笔,最后筆者不得不使用大絕招來解決跛十,何為大絕招油猫?很簡單隆夯,位置尺寸寫死噪沙。項目中導航控制器是自定義的插爹,在自定義的類中添加如下代碼就OK了
2 點擊導航欄下方也會出發(fā)導航欄按鈕的點擊事件
如圖所示哄辣,每次想選中右上角的圖片请梢,結果總是觸發(fā)“取消”事件,明明沒有點到導航欄上面去力穗,問題的原因不清楚毅弧,解決方法創(chuàng)建一個UINavigationBar的分類,重寫hitTest方法
如果模糊點不在它上面,就不讓它接受用戶交互,然后使用系統(tǒng)的事件處理方法去處理
3 輸入中文時限制字符串長度
限制字母当窗、數字够坐、符號等其他非中文字符的長度大家應該都知道咋整,但如果是中文輸入法超全,這就比較惡心了咆霜。舉個例子,限制長度為5嘶朱,輸入“我愛寫代碼”蛾坯,當已經輸入“我愛寫”兩字,然后輸入“代碼”時就會出現如下情況
根本寫不進去啊疏遏,這是為什么呢脉课?因為輸入的拼音也被計算在了字符串長度之內,導致輸入“da”以后就不能繼續(xù)輸入了财异,可通過下面的辦法解決
4 修改導航欄顏色
這個問題對有經驗的開發(fā)者來說不是問題倘零,但是當年筆者剛入行時,確實被這個問題折騰了好久戳寸。比如想設置導航欄的顏色為藍色
self.navigationController.navigationBar.backgroundColor?=?[UIColor?blueColor];
運行呈驶,然后......????這特么是藍色?筆者確定自己不是色盲
后來才知道疫鹊,設置導航欄的背景色袖瞻,需要設置barTintColor而不是backgroundColor
self.navigationController.navigationBar.barTintColor?=?[UIColor?blueColor];
5 界面莫名其妙下移
這個問題跟上面的問題一樣,都是比較基礎的問題拆吆,有經驗的人都知道如何解決聋迎,但是筆者曾經也被折磨過
為什么下面textView的內容不是從最上面開始的,而且還不能滾上去枣耀,當初真的被這種情況折騰的死去活來的霉晕,改frame,改約束捞奕,都沒效果牺堰。后來才知道,當有導航控制器時颅围,系統(tǒng)會默認將第一個添加的scrollView或其子類視圖的內容下移64個像素萌焰,下面的textView是先添加的,所以其內容被下移了谷浅,而上面的卻沒有,解決方法是在控制器里加上下面這句代碼
self.automaticallyAdjustsScrollViewInsets?=?NO;
6.GCD組函數
筆者在開發(fā)中遇到過這樣一個功能,某個界面列表上面是企業(yè)一疯,下面是聯系人撼玄,而且獲取企業(yè)列表與聯系人列表的接口不是同一個,必須等企業(yè)跟聯系人列表數據都獲取完畢后才能刷新墩邀,于是就用到了GCD組函數
然而問題來了掌猛,
[[IBOsser shared]...]這玩意兒是封裝好的,并且是個異步函數眉睹,大家應該都知道荔茬,異步函數不會阻塞線程,不用等里面的內容執(zhí)行完就返回了竹海,這就導致數據還沒拿到慕蔚,就開始執(zhí)行notify里面的代碼了。后來筆者發(fā)現斋配,原來GCD組函數還有一種用法孔飒,完美解決問題
7.UISearchController
iOS8才出來的,用來替換UISearchBar +UISearchDisplayController的組合方式艰争,項目中有用到搜索功能坏瞄,于是筆者就嘗試著用了一下UISearchController,將搜索框添加到了tableView的tableHeaderView上甩卓。然而當點擊搜索框準備搜索時鸠匀,神奇的事情發(fā)生了
搜索框居然飛到九霄云外去了,好難過逾柿,這不是我要的那種結果缀棍,結果.....
怎么解決呢?在控制器里加上下面這句代碼就OK了鹿寻,至于為什么睦柴,呵呵????,不知道
self.definesPresentationContext = YES;
8.自定義相機照片截取
這個問題說難不難毡熏,說簡單也不簡單坦敌,筆者當時確實花了很長一段時間才弄清楚,但是當問題解決后痢法,感覺這特么也不復雜啊狱窘,之前怎么就沒整明白呢
問題是這樣的,在使用自定義相機拍完照后财搁,需要對圖片的指定區(qū)域(藍色方框內的區(qū)域)進行截取然后上傳蘸炸,這里存在兩個問題
拍攝時你所看到的區(qū)域,跟實際拍出來的區(qū)域是不一樣的
上圖就是實際拍出來的圖片尖奔,明顯比拍攝時看到的圖片要長搭儒,不過寬度是一樣的
照片的坐標系與我們平時開發(fā)所使用的坐標系是不一樣的
開發(fā)中所使用的視圖坐標系是以左上角為原點的穷当,橫向為x軸,縱向為y軸淹禾,而拍攝出來的照片是以右上角為原點的馁菜,橫向為y軸,縱向為x軸
我們先來看一幅圖
由于拍攝時所看到視圖寬高比與實際拍攝出來的圖片的寬高比并不一致铃岔,所以導致圖片經過等比例縮放到寬度一樣時汪疮,高度有一部分超出了我們的可視范圍,首先毁习,我們要計算出超出部分的高度
//_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
然后根據計算好的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在滑倒最邊上(左或右)的時候腕让,為了提醒用戶已經滑到最邊上了(左或右),再繼續(xù)向左(右)滾動的話會有一個反彈的效果歧斟,這就造成左滑刪除的時候纯丸,整個tableView會出現一個我們不想看到的反彈效果。
解決方法:
會出現這種效果静袖,是因為蘋果為了讓用戶知道scrollView已經滑到了最邊上了觉鼻,而不是程序卡了或者出現問題了而不能滑動。所以队橙,scrollView對象里面有三個屬性坠陈,分別是bounces,bounceHorizontally與bounceVertically三個屬性捐康,通過 self.scrollView.bounces = NO仇矾;這行代碼就可以讓scrollView滑倒邊上的時候不會出現反彈效果。
問題2:
當你把scrollView滑到最邊上(左或右)的時候解总,當你繼續(xù)做滑想要讓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(長按)這幾種常用手勢動作邻吞,又細分單擊组题、雙擊、左滑抱冷、右滑等操作崔列。
然后重寫下類方法:
別的代碼還按照你原來的思路走就好了
結束: 以后有什么問題我都會更新的 一時也想不起那么多了