IOS開發 pdf渲染的小竅門

2021-06-17 16:30:22 字數 2551 閱讀 3114

我們都知道,

在iphone/ipad顯示pdf的基本方法有兩個,乙個是使用uiwebview直接載入pdf檔案,另乙個是使用core graphics進行渲染(姑且稱之為cgpdf方法)

。uiwebview的方法是簡單,只需載入pdf,其他諸如放大翻頁等問題通通交給uiwebview去頭痛吧。但其缺點是效能較慢,功能有限,比如要實現搜尋,新增筆記等功能就比較難。而使用cgpdf方法,功能就沒有限制(雖然pdf解析方面,蘋果提供的文件實在有限),

使用core graphics進行渲染,效能上也比uiwebview要提高許多,只不過翻頁,放大縮小等功能都需要自己實現

。有關pdf放大縮小,翻頁等功能可以使用uiscrollview實現,不在本文討論的範圍之內。筆者在專案中使用了cgpdf的過程中,曾遇到兩個小問題,因此,在這裡總結一下:

先看看我程式中的渲染**,可以放在- (void)drawrect:(cgrect)rect 或者 -(void)drawlayer:(calayer*)layer incontext:(cgcontextref)context 中:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26 -(

void

)drawrect

:(cgrect

)rect

簡單地說,這段**就是使用core graphics進行pdf的渲染,可是我的pdf放大後為什麼不清晰呢?先看看放大pdf後可以使其清晰的部分**吧:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17 -(

id)initwithpdfpage

:(pdfpage

*)page

return self;

}+(class

)layerclass

其秘訣就在catiledlayer,簡單地說就是catiledlayer將不同等級的tiles(拼貼)快取起來,而cgcontextdrawpdfpage則根據最合適的放大等級將pdf渲染出來。

根據文件catiledlayer可以更高效,高質量地渲染pdf文件,但我則遇到了第二個問題。

簡而言之就是pdf頁面一塊一塊地慢慢渲染出來,效果非常不好。這是怎麼回事?經過一番研究發現是catiledlayer的動畫效果在作怪。每個tile的渲染據說都有0.25s的動畫時間,其結果就是pdf文件一塊一塊地出現了。要怎樣解決這個問題呢?最為直接的方法就是把0.25s的動畫時間直接設定為0。下面是**(採用繼承catiledlayer的方法):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

@inte***ce fastcatiledlayer 

: catiledlayer

@end

@implementation fastcatiledlayer

+(cftimeinterval

)fadeduration 

+(class

)layerclass 

-(id)initwithpdfpage

:(pdfpage

*)page 

return self;

}@end

注:pdfpage是我自己的乙個類。

from:

求職的小竅門

大學畢業季,回味之前幾年時光匆匆流逝,自己宛如一張白紙。就業 擇業 失業,接踵而來。就業 如汪洋大海,我猶如未起航的小船,停靠在溫暖的港灣。擇業 如汪洋大海中漂泊小船的風帆,迎風飄揚。失業 波濤洶湧的浪花拍打在猶弱的小船上,慢慢的吞噬。簡歷 面試 入職三部曲 簡歷 一般前程無憂 智聯招聘 如何吸引h...

啤酒調味的小竅門

由於啤酒富含營養,具有健脾開胃之功效,所以喜歡喝啤酒的人越來越多。啤酒除用於飲用外,對菜餚的調味也是發揮了一技之長呢。具體方法如下 炒肉片或肉絲,用澱粉加啤酒調糊掛漿,炒出後格外鮮嫩,味尤佳。烹製凍肉 排骨等菜餚,先用少量啤酒,醃漬10分鐘左右,清水沖洗後烹製,可除腥味和異味。烹製含脂肪較多的肉類 ...

前端學習的小竅門

1.data callback else json 第乙個是url,第二個是post時傳入的值,function中的data並不是傳入值,而是傳出值,function是對傳出值進行處理的函式,callback同樣是對傳出值處理的函式。因為js是非同步處理的,不能像同步時一樣可以return結果,只能...