@@ -43,6 +43,7 @@ class LayoutManager: NSLayoutManager {
43
43
44
44
private let defaultBulletColor = UIColor . black
45
45
private var counters = [ Int: Int] ( )
46
+ private var imagecache = [ UIImage : NSCache < NSString , UIImage > ] ( )
46
47
47
48
weak var layoutManagerDelegate : LayoutManagerDelegate ?
48
49
@@ -226,7 +227,7 @@ class LayoutManager: NSLayoutManager {
226
227
listMarkerImage = self . generateBitmap ( string: text, rect: markerRect)
227
228
case let . image( image, size) :
228
229
markerRect = rectForBullet ( markerSize: size, rect: rect, indent: paraStyle. firstLineHeadIndent, yOffset: paraStyle. paragraphSpacingBefore)
229
- listMarkerImage = image . resizeImage ( to : markerRect. size)
230
+ listMarkerImage = resizedImage ( image : image , size : markerRect. size)
230
231
}
231
232
232
233
// let lineSpacing = paraStyle.lineSpacing
@@ -243,6 +244,22 @@ class LayoutManager: NSLayoutManager {
243
244
return image
244
245
}
245
246
247
+ private func resizedImage( image: UIImage , size: CGSize ) -> UIImage {
248
+ let result : UIImage
249
+
250
+ let sizeCache = imagecache [ image, default: . init( ) ]
251
+ imagecache. updateValue ( sizeCache, forKey: image)
252
+
253
+ let key = size. debugDescription as NSString
254
+ if let cachedImage = sizeCache. object ( forKey: key) {
255
+ result = cachedImage
256
+ } else {
257
+ result = image. resizeImage ( to: size)
258
+ sizeCache. setObject ( result, forKey: key)
259
+ }
260
+ return result
261
+ }
262
+
246
263
private func rectForBullet( markerSize: CGSize , rect: CGRect , indent: CGFloat , yOffset: CGFloat ) -> CGRect {
247
264
let topInset = layoutManagerDelegate? . textContainerInset. top ?? 0
248
265
let leftInset = layoutManagerDelegate? . textContainerInset. left ?? 0
@@ -410,7 +427,7 @@ class LayoutManager: NSLayoutManager {
410
427
let attributes = lineNumberAttributes ( lineNumberFormatting: lineNumberFormatting)
411
428
let text = NSAttributedString ( string: " \( lineNumber) " , attributes: attributes)
412
429
let markerSize = text. boundingRect ( with: . zero, options: [ ] , context: nil ) . integral. size
413
- var markerRect = self . rectForLineNumbers ( markerSize: markerSize, rect: rect, width: gutterWidth)
430
+ let markerRect = self . rectForLineNumbers ( markerSize: markerSize, rect: rect, width: gutterWidth)
414
431
let listMarkerImage = self . generateBitmap ( string: text, rect: markerRect)
415
432
listMarkerImage. draw ( at: markerRect. origin)
416
433
}
0 commit comments