闡述:
這幾天在忙著一個項目,好幾天都是加班到凌晨,實在是沒有時間來更新博客,今天忙里偷閑來總結一個使用bounds的時候出現的小bug;
確實是比較小的一個bug,也很好解決, 當時遇到的時候, 也是愣了1分鐘,后面仔細考慮了一下,解決的思路也就出來了;
bug描述:
我們都知道,一般情況下,當我們需要使用一個控件的bounds的x,y值的時候, 都是會使用系統規定的,也就是(0,0);
但是這次我遇到一個情況,卻發現,bounds的x和y值,并不是所有情況下都是(0,0), 我的需求是,給一個表示"原價"的label上劃上一條中劃線, 讓用戶看到價格是折扣過的(這個功能,我相信做電商類應用的小伙伴們經常使用,以前我也做過類似的,不過這個bug之前沒有遇到, 這次很巧,遇到了) ;
在給label劃一條中劃線的時候,我這里使用的是CG框架下面的drawRect:方法, 也就是我們常用的Quartz2D繪圖功能, 然而因為這次我對label是使用的自動布局, 只設定了label的高度,其他label屬性都是自動布局生成的, 所以這里劃線的時候 bounds的值出現了偏移;
代碼:
- (void)drawLine:(CGRect)rect
{
// 獲得上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 起點
CGFloat startX = 0;
CGFloat startY = rect.size.height * 0.5;
CGContextMoveToPoint(ctx, startX, startY);
// 終點
CGFloat endX = rect.size.width;
CGFloat endY = startY;
CGContextAddLineToPoint(ctx, endX, endY);
// 繪圖渲染
CGContextStrokePath(cox);
// 輸出查看:
NSLog(@"%@",NSStringFromCGRect(rect));
}
輸出結果:
輸出bounds的值為:
通過輸出結果,我們可以很明顯的看出,bounds的x和y值,確實是由偏移的, 所以才導致,我們劃的中劃線并不是在中間部分,
那么bug產生的原因是什么呢:
分析: 因為bounds的值是系統自動給定的, 而在屏幕自動布局的適配過程中, 系統會根據不同屏幕的情況來自動的把這個bounds的值進行調整,從而產生了偏移,這就是問題產生的根源;
那么怎樣解決這個問題呢:
解決思路: 其實這個解決的思路也很簡單, 那就是"系統挪動了多少,我們就挪動多少回去!"
所以,我們可以這樣來解決:
解決方法1: 用CG框架解決
- (void)drawLine:(CGRect)rect
{
HMLog(@"%@",NSStringFromCGRect(rect));
// 獲得上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 起點 將系統有可能產生的偏移,我們將它給挪回去,如下: +rect.origin.x; 和 + rect.origin.y;
CGFloat startX = 0 + rect.origin.x;
CGFloat startY = rect.size.height * 0.5 + rect.origin.y;
CGContextMoveToPoint(ctx, startX, startY);
// 終點
CGFloat endX = rect.size.width + rect.origin.x;
CGFloat endY = startY;
CGContextAddLineToPoint(ctx, endX, endY);
// 繪圖渲染
CGContextStrokePath(cox);
// 再次輸出查看
NSLog(@"%@",NSStringFromCGRect(rect));
}
輸出結果:
通過結果,我們可以看出,已經達到我們的效果了, 中劃線已經非常好的位于中間位置了;
解決方法2: 用UI框架解決
- (void)drawRect:(CGRect)rect {
// 調用super的目的, 保留之前繪制的文字
[super drawRect:rect];
CGFloat x = 0 + rect.origin.x;
CGFloat y = rect.size.height * 0.5 + rect.origin.y;
CGFloat w = rect.size.width;
CGFloat h = 1;
UIRectFill(CGRectMake(x, y, w, h));
HMLog(@"%@",NSStringFromCGRect(rect));
}
輸出結果:
通過這樣方式,得到的結果,我們可以看出,也已經達到我們的效果了, 中劃線已經非常好的位于中間位置了
總結:
這兩種解決方案都是可以的, 具體用哪一種視情況而定, 不過,我個人是比較喜歡用第一種的, 原因很簡單, CG框架是C語言的,兼容很多種平臺,而UI框架專為iOS而設計的, 至于大家喜歡用哪種,就看使用的情況了;
總體來說:這也就是一個小bug,比較簡單, 思路也是很簡單的, 如有不足之處,望大家斧正!!!