banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[iOS] 在64位模式下,CoreGraph 與 NSString drawInRect 出現衝突

iOS SDK 支援 64 位元後,大部分程式碼可以直接無縫轉換並通過編譯,但是這些程式碼在執行時可能會有所差異,所以開發時需要特別注意,Cocoa-Charts 在開發過程中就發現了這類問題。
問題現象:
CoreGraph 繪圖方法與 NSString 的 drawInRect 方法在 64Bit 下存在著衝突,64Bit 下調用 drawInRect 之後會導致 CGContext 中的 path 被清空從而使 CGContextStrokePath 不進行任何繪圖操作,而 32Bit 下沒有任何問題。

問題程式碼:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 0.5f);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
// 程式碼省略

// 在控件內繪製一條直線
CGContextMoveToPoint(context, 0.f, 0.f);
CGContextAddLineToPoint(context, 100.f, 100.f);

// 在控件內顯示指定的文本

NSString string = @“TEST”;
[string drawInRect(0, 0, 100, 20)
withFont: [UIFont systemFontOfSize:14.f]
lineBreakMode
alignment];

// 程式碼省略

CGContextStrokePath(context);
CGContextFillPath(context);

解決辦法:
將程式碼分割,將使用 CoreGraph 繪圖方法的程式碼段與調用 NSString 的 drawInRect 方法的程式碼段分別書寫。

修改後的程式碼:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 0.5f);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
// 程式碼省略

// 在控件內繪製一條直線
CGContextMoveToPoint(context, 0.f, 0.f);
CGContextAddLineToPoint(context, 100.f, 100.f);

// 程式碼省略

CGContextStrokePath(context);
CGContextFillPath(context);

// 在控件內顯示指定的文本

NSString string = @“TEST”;
[string drawInRect(0, 0, 100, 20)
withFont: [UIFont systemFontOfSize:14.f]
lineBreakMode
alignment];

最後感謝 BUG 的發現者:
Marco Almeida(http://www.marcoios.com/MarcoiOS/index.html)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。