在iOS8.X上一個(gè)視圖調(diào)用 [self layoutIfNeeded] 方法后庶骄,第一個(gè)子視圖y值發(fā)生改變
ps:也有可能是我的xib拖的有問題劫狠,等后面有心情了栅干,就驗(yàn)證下新锈,到時(shí)再更新。
1治力、近日有同事反饋一個(gè) bug 蒙秒,一個(gè)詳情頁內(nèi)容只顯示一部分,我第一反應(yīng)感覺不可能宵统,眼見為實(shí)税肪,在他的手機(jī)上確實(shí)發(fā)現(xiàn)了這個(gè)問題。經(jīng)過多個(gè)機(jī)型版本的比對發(fā)現(xiàn)榜田,盡在 8.X 的系統(tǒng)發(fā)現(xiàn)這個(gè)問題益兄。
2、介紹下這個(gè)頁面的大概情況箭券,用 xib 拖動(dòng)的頁面净捅,有一些 label 顯示文本信息,文本高度不確定辩块,詳情頁高度沒有添加相關(guān)約束蛔六。模型文本信息賦值給相應(yīng) label 后調(diào)用 [self setNeedsLayout]、[self layoutIfNeeded] 再獲取詳情頁的最后一個(gè)子視圖調(diào)用 CGRectGetMaxY(X.frame)方法獲取最大的y值废亭,作為視圖的高度国章。
3、打斷點(diǎn)調(diào)試發(fā)現(xiàn)豆村,在iOS8.X系統(tǒng)上詳情頁調(diào)用 [self layoutIfNeeded] 方法后液兽,第一個(gè)子視圖的y值為-400,倒數(shù)第二個(gè)視圖的y值為0掌动,百思不得其解四啰。
4、我自己沒有找到很好的計(jì)算方法粗恢。用了一個(gè)在我看來比較笨的方式柑晒,用最后一個(gè)子視圖的最大的y值減去第一個(gè)子視圖的最小的y值的差值最為詳情頁的高度。
請求相冊權(quán)限一個(gè)子線程崩潰
時(shí)間比較遠(yuǎn)了眷射,就直接說BUG和處理方法了
在鍵盤彈起時(shí)匙赞,點(diǎn)擊跳轉(zhuǎn)圖片選擇(重點(diǎn):點(diǎn)擊事件我沒有寫收鍵盤事件,跳轉(zhuǎn)新的controller妖碉,鍵盤自己收起)涌庭,請求圖片訪問權(quán)限狀態(tài),如果是第一次使用嗅绸,請求相關(guān)權(quán)限時(shí)脾猛, completionHandler 回調(diào)事件不在主線程撕彤,這個(gè)地方要加線程判斷鱼鸠。
+ (void)requestAccessForMediaType:(NSString *)mediaType completionHandler:(void (^)(BOOL granted))handler
文本高度計(jì)算結(jié)果不對
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context
計(jì)算一段文字猛拴,一般都用的是上述方法。但又一次蚀狰,有客戶想我反饋愉昆,有一處的文本信息沒有顯示完整。我拿到了這串文本多次嘗試麻蹋,重現(xiàn)了過程跛溉。
textview 輸入一些文字后,一直輸入空格扮授,直到換行芳室,繼續(xù)輸入文本信息,點(diǎn)擊發(fā)送刹勃。用上述方法計(jì)算出來的高度堪侯,不夠顯示全部文本,我換了網(wǎng)上找到的方法
// CGMutablePathRef Path = CGPathCreateMutable();
//
// //坐標(biāo)點(diǎn)在左下角
// CGPathAddRect(Path, NULL ,CGRectMake(0 , 0 ,size.width, size.height));
//
// CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL);
// int total_height = 0;
//
// CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrStr); //string 為要計(jì)算高度的NSAttributedString
// CGRect drawingRect = CGRectMake(0, 0, size.width, 10000); //這里的高要設(shè)置足夠大
// CGMutablePathRef path = CGPathCreateMutable();
// CGPathAddRect(path, NULL, drawingRect);
// CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);
// CGPathRelease(path);
// CFRelease(framesetter);
//
// NSArray *linesArray = (NSArray *) CTFrameGetLines(textFrame);
//
// CGPoint origins[[linesArray count]];
// CTFrameGetLineOrigins(textFrame, CFRangeMake(0, 0), origins);
//
// int line_y = (int) origins[[linesArray count] -1].y; //最后一行l(wèi)ine的原點(diǎn)y坐標(biāo)
//
// CGFloat ascent;
// CGFloat descent;
// CGFloat leading;
//
// CTLineRef line = (__bridge CTLineRef) [linesArray objectAtIndex:[linesArray count]-1];
// CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
//
// total_height = 10000 - line_y + (int) descent +1 +linesArray.count * ascent; //+1為了糾正descent轉(zhuǎn)換成int小數(shù)點(diǎn)后舍去的值
//
// CFRelease(textFrame);
//
// return CGSizeMake(size.width, total_height) ;
計(jì)算出來的高度還是不夠顯示文本荔仁。
解決方法:用 YYLabel 顯示文本信息伍宦,用 YYTextLayout 布局要顯示的文本信息,獲取文本高度乏梁。
最后次洼,只是個(gè)人的解決方法,原因沒有找到遇骑,就是不知其所以然卖毁。望指點(diǎn),不吝感謝落萎!