2009-10-02 22 views
0

我需要沿着圖像的形狀繪製路徑,使其始終與圖像在圖像上的位置相匹配,而與圖像比例無關。想象一下,就像谷歌地圖的混合視圖,街道名稱和道路疊加在航空照片的頂部。在UIImage上疊加2D路徑而不縮放文物

此外,此路徑將由用戶的手指移動繪製,我需要能夠檢索圖像像素座標上的路徑關鍵點。用戶放大以更精確地設置路徑位置。

我設法以某種方式使其工作使用這種方法:

- 創建一個自定義的UIView稱爲CanvasView,處理觸摸互動,並根據提供縮放,旋轉,平移值無論是UIImageView的或PathsView(參見下文)一個標誌:deliverToImageOrPaths。

- 創建一個保存基本圖像的UIImageView。這是設置爲Canvas的子視圖

- 創建一個名爲PathsView的自定義UIView,用於跟蹤2D路徑幾何圖形並使用自定義drawRect繪製自己。這是設置爲UIImageView的子項。

所以層次:CanvasView - >的UIImageView - > PathsView

在當deliverToImageOrPaths是YES,手指手勢轉換兩個的UIImageView及其子PathsView這種方式。當deliverToImageOrPaths爲NO時,手勢僅影響PathsView更改其幾何。到現在爲止還挺好。

問題:我遇到的問題是縮放基本UIImageView(通過其.transform屬性)時,PathsView與鋸齒工件縮放。 drawRect仍然在PathsView上被調用,但我想它正在使用原始緩衝區大小執行繪圖,然後進行插值。

我該如何解決這個問題?有更好的方法來實現這些功能嗎?

PS:我試着用levelsOfDetailBias 4和levelsOfDetail 4將PathsView圖層類更改爲CATiledLayer。它在某種程度上解決了別名問題,但它的渲染速度緩慢,令人無法接受。

回答

0

如果您在繪製路徑值時保留了路徑值,您可以捕獲基礎圖像的縮放比例,然後重新定位路徑值並將其重繪到PathsView的drawRect方法中。這將涉及一些數學(主要是沿着地圖投影線),但不是縮放位圖和獲取僞影,而是縮放點距離和使用矢量重畫,這將使它在任何分辨率下變得平滑(尤其是如果你用beziers而不是像素或線連接點)。

如果您在用戶繪製路徑並放棄點數據時沿路徑鋪設繪圖,那麼唯一的解決方案就是做位圖反鋸齒,這基本上就是CATiledLayer爲您做的和您所做的發現,可能會很慢。

0

如果您的目標是iPhone OS 3.0+,則可以使用CAShapeLayer作爲您的路徑。將CGPathRef分配給圖層,它將處理所有繪圖和縮放。你只需設置圖層的變換。