fix(diary): keep pencil strokes sharp at any zoom level

페이지가 논리 768×1024pt 고정 + 스케일 변환이라 PKCanvasView 래스터가
비정수 축소에선 뭉개지고 확대에선 픽셀이 보였음 → 캔버스(내부 렌더 뷰
포함)의 contentScaleFactor를 기본 1.5배 슈퍼샘플링 + 줌 배율 추종(기기
스케일 ×2.5 상한)으로 조정. 레이아웃 변경과 핀치 종료 시점에 갱신.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
This commit is contained in:
songyc macbook 2026-07-13 15:08:08 +09:00
parent 8d4d20fc76
commit 5916e17b25

View File

@ -288,6 +288,11 @@ private struct DiaryZoomContainer<Content: View>: UIViewRepresentable {
func scrollViewDidZoom(_ scrollView: UIScrollView) {
(scrollView as? DiaryZoomScrollView)?.centerZoomedView()
}
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
// ( )
(scrollView as? DiaryZoomScrollView)?.updateCanvasSharpness()
}
}
}
@ -296,6 +301,7 @@ final class DiaryZoomScrollView: UIScrollView {
var pageSize: CGSize = DiaryPageMetrics.size
weak var zoomedView: UIView?
private var didSetInitialZoom = false
private var lastCanvasScale: CGFloat = 0
override func layoutSubviews() {
super.layoutSubviews()
@ -315,6 +321,7 @@ final class DiaryZoomScrollView: UIScrollView {
didSetInitialZoom = true
}
centerZoomedView()
updateCanvasSharpness()
}
///
@ -325,6 +332,40 @@ final class DiaryZoomScrollView: UIScrollView {
zoomedView.center = CGPoint(x: contentSize.width / 2 + dx,
y: contentSize.height / 2 + dy)
}
/// .
/// 768×1024pt fit/ ,
/// PKCanvasView contentScaleFactor
/// ( ) .
/// 1.5 + ( × 2.5) .
func updateCanvasSharpness() {
guard let zoomedView else { return }
let display = max(traitCollection.displayScale, 1)
let target = display * min(max(zoomScale, 1) * 1.5, 2.5)
guard abs(target - lastCanvasScale) > 0.01 else { return }
lastCanvasScale = target
Self.applyCanvasScale(target, in: zoomedView)
}
/// PKCanvasView + contentsScale
private static func applyCanvasScale(_ scale: CGFloat, in view: UIView) {
if view is PKCanvasView {
setScaleRecursively(scale, view: view)
return
}
for subview in view.subviews {
applyCanvasScale(scale, in: subview)
}
}
private static func setScaleRecursively(_ scale: CGFloat, view: UIView) {
view.contentScaleFactor = scale
view.layer.contentsScale = scale
view.setNeedsDisplay()
for subview in view.subviews {
setScaleRecursively(scale, view: subview)
}
}
}
// MARK: - (/)