2014-12-01 58 views
0

我一直在尋找this thread,因爲我試圖實現同樣的事情。但是,我發現Canvas類是作爲UIImageView的子類實現的。我試圖做同樣的事情,除了在UIView。如何使用UIView而不是UIImageView影響此解決方案的實施?我看到self.image使用了幾次,但我不知道如何改變,因爲我不認爲這在通用UIView中可用。Swift:在UIView中繪製基於觸摸的UIBezierPath

回答

0

在回答這個問題時,首先將self.image繪製到繪圖上下文中,然後將繪圖應用到頂部,最後將圖像更新爲舊圖像,並在頂部繪製新內容。

既然你只是想添加一個UIBezierPath,我只需要創建一個CAShapeLayer,放入你的bezier路徑,並將它放在你的視圖背景層(self.view.layer)之上。 DrawRect不需要做任何事情。

0

是的,您可以將其作爲UIView子類實現。您的模型應該保存觸摸事件的位置(或從這些位置構建的路徑),然後該視圖的drawRect可以呈現這些路徑。或者,您也可以創建與這些路徑關聯的對象CAShapeLayer。兩種方法都很好。

注意,有一些優點,以使快照的方法(保存爲UIImage)對象,你在UIImageView或手動兩種顯示繪製你的UIView子類的drawRect。隨着您的繪圖變得越來越複雜,如果您的drawRect必須重新繪製所有路徑段(因爲與單個屏幕手勢相關聯的觸摸很多,所以它可能會驚人地快速變爲數千個位置),您將開始遇到性能問題。一觸即發。恕我直言,我認爲你引用的其他答案太過分了,每創建一個新快照touchesMoved。當您查看Retina iPad或iPhone 6 plus的全分辨率圖像時,這是在每次觸摸事件時創建的大圖像快照。我個人採用混合方式:我的drawRectCAShapeLayer將呈現與當前手勢相關聯的當前路徑(或touchesBegantouchesEnded之間的touchesMoved事件的集合),但是當手勢完成時,它將創建新的快照。

+0

如果我使用UIImage並製作快照,我可以編輯已繪製的形狀嗎?這聽起來對我來說,如果他們是在一個圖像中,他們不會被編輯,我只能在他們之上畫更多的東西,而不會刪除我已經繪製的任何東西。這是我想要做的一個關鍵功能,所以如果這是不可能的,我必須用UIView來完成。 – NumberOneRobot 2014-12-01 20:10:22

+0

顯然,快照將不可編輯(當然,超出像素編輯)。但是,如果保留用於生成該快照的模型對象(例如路徑),則可以編輯模型,然後在理論上隨時重新生成快照。因此,我建議快照不是模型(正如其他問題的接受答案似乎暗示的那樣),而只是一種渲染優化,可以避免每次更新模型時重新繪製所有舊路徑。 – Rob 2014-12-01 20:36:42

+0

因此,保存一張圖片,也許每次我創建一個新的貝塞爾路徑,然後每次添加一條新路徑時,我都會從圖像和路徑創建一個新圖像?那麼,而不是必須重新渲染具有巨大潛在點數的貝塞爾路徑,而是隻需渲染圖像,它只是指定的像素? – NumberOneRobot 2014-12-01 20:48:10