使用bounds出現的一個小bug解決方案

闡述:

這幾天在忙著一個項目,好幾天都是加班到凌晨,實在是沒有時間來更新博客,今天忙里偷閑來總結一個使用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));

}

輸出結果:


bug情況圖片:

輸出bounds的值為:

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));
}

輸出結果:

方法2效果:

通過這樣方式,得到的結果,我們可以看出,也已經達到我們的效果了, 中劃線已經非常好的位于中間位置了

總結:

這兩種解決方案都是可以的, 具體用哪一種視情況而定, 不過,我個人是比較喜歡用第一種的, 原因很簡單, CG框架是C語言的,兼容很多種平臺,而UI框架專為iOS而設計的, 至于大家喜歡用哪種,就看使用的情況了;
總體來說:這也就是一個小bug,比較簡單, 思路也是很簡單的, 如有不足之處,望大家斧正!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,381評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,245評論 4 61
  • M期的前后總是看起來事事不順。負能量也會蹭蹭往上走。 晚上一點多躺倒在床上,上鋪的室友依然習慣性抖腿,在搖搖晃晃的...
    霽青閱讀 189評論 0 0
  • My code: reference:https://discuss.leetcode.com/topic/593...
    Richardo92閱讀 481評論 0 0