Ниже приведены функции, которые я использую для установки нового размера представлений прокрутки documentView, однако я не могу понять, как совместить изменение размера кадра с изменением положения прокрутки. Если я применяю анимацию к вещам в том виде, в каком они есть, размер изменяется, и изображение перемещается относительно нижнего левого угла, а затем изображение возвращается на место. Как объединить анимацию таким образом, чтобы изменение размера и положение прокрутки менялись вместе - или любой другой способ добиться плавного увеличения / уменьшения масштаба.
func zoomIn(zoomFactor: CGFloat = zoomFactor){
guard let docView = self.docView, let scrollView = self.scrollView else {
return
}
let visible = scrollView.documentVisibleRect
let newrect = NSInsetRect(visible, NSWidth(visible)*(1 - 1/zoomFactor)/2.0, NSHeight(visible)*(1 - 1/zoomFactor)/2.0);
let frame = docView.frame
self.execZoom(docView: docView,
size:CGSize(width: zoomFactor, height: zoomFactor),
frame:CGRect(x: 0, y: 0, width: frame.size.width * zoomFactor, height: frame.size.height * zoomFactor),
origin:newrect.origin)
}
func zoomOut(zoomFactor: CGFloat = zoomFactor){
guard let docView = self.docView, let scrollView = self.scrollView else {
return
}
let visible = scrollView.documentVisibleRect
let newrect = NSOffsetRect(visible, -NSWidth(visible)*(zoomFactor - 1)/2.0, -NSHeight(visible)*(zoomFactor - 1)/2.0)
let frame = docView.frame
self.execZoom(docView: docView,
size: CGSize(width: 1/zoomFactor, height: 1/zoomFactor),
frame: CGRect(x: 0, y: 0, width: frame.size.width / zoomFactor, height: frame.size.height / zoomFactor),
origin: newrect.origin)
}
func execZoom(docView: NSView, size: CGSize, frame: CGRect, origin: CGPoint){
docView.scaleUnitSquare(to: size)
docView.frame = frame
docView.scroll(origin)
}