遇到的CGContextRef 與 UIBezierPath繪制問題

先說說CGContextRef吧,為什么要先說它呢,因為一開始對它的不理解而踩了不少的坑,這東西叫圖文上下,聽起來很讓人費解的一個東西,用白話說,這是一個畫板。如果你想要繪制,你就必須去拿到這個CGContextRef在他上面去繪制,說了這么費話,下面說說博主的需求,博主想要做的是一個涂鴉(剛開始,博主不知道怎么去形容這個需求,博主就先去了谷歌,然后就有了下面的代碼)。

有問題的代碼
有問題的代碼

下面就是這個圖畫出來的東西


從A點沿紅線畫到B點

博主是從A點沿紅線畫到B點,結果A與B之間多了一條直線,這不是博主想要的,博主可不想要這直線。一開始以為自己方法搞錯了,于是博主把CGContextAddLineToPoint方法改成CGContextAddLines以后變成虛線。


錯誤代碼

當時博主的心情是非常的郁悶的,后來與一位大神討論的時候,發現了問題,原來是那個point的全局變量有關。因為每次繪制完,point這個全局變量都是數組的最后一個值對吧。然后又觸發重繪的時候,此時point是上一次的結束點,而數組的開始又是最一開始touchbegan的點,所以就出現了這樣的問題。把代碼修改如下:


修改后的代碼
修改后的代碼


在drawRect方法里的代碼

先說說為什么這么寫,當初定了一個point全局變量是因為想讓畫的東西連起來,也就是一個點到另外一個點的連線博主可以直接就在這個數據里拿就行了,把第一個點與第二個點給拿出來就行了(有時候靈光一閃很重要)。好了,說了這么多CGContextRef的,下面來說說用UIBezierPath怎樣來實現博主的需求,直接上代碼:


在touchesBegan方法里創建了一個全局的path變量


給path一個touchPoint,讓它進行繪制并進行添加到數組里


遍歷數組進行繪制

好了,上面就是兩個方法的涂鴉,是不是感覺UIBezierPath繪制的代碼更少?更好用點,哈哈。最后,再說一句,如果博主的文章,給了你點啟發,要記得好評哦!!!點這里獲取demo。

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

推薦閱讀更多精彩內容

  • Quartz2D以及drawRect的重繪機制字數1487 閱讀21 評論1 喜歡1一、什么是Quartz2D Q...
    PurpleWind閱讀 788評論 0 3
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,419評論 0 6
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,846評論 25 708
  • 1.iOS中的round、ceil、floor函數略解 round如果參數是小數,則求本身的四舍五入.ceil如果...
    K_Gopher閱讀 1,199評論 1 0
  • 椰子水甘甜,心想的事沒有去做,正好的當下要珍惜。無所事事不正是很好的狀態!躺在陽臺上這美妙的時光,請慢慢來,讓我充...
    52065cb81649閱讀 119評論 0 1