下面是我用来设置滚动视图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)
}
好吧,就把所有的东西扔掉,然后这样做......疯狂的快速,流畅,所有的底层CALayers与图像和可拖动的CALayers用自己的draw()方法渲染,似乎以矢量格式缩放--没有字体,线条或图像的像素化。
override func scrollWheel(with event: NSEvent) {
guard event.modifierFlags.contains(.option) else {
super.scrollWheel(with: event)
return
}
let dy = event.deltaY
if dy != 0.0 {
let magnification = self.scrollView.magnification + dy/30
let point = self.scrollView.contentView.convert(event.locationInWindow, from: nil)
self.scrollView.setMagnification(magnification, centeredAt: point)
}
}
有一个简单的方法来使用通用的 "动画"。
从文档中可以看出。要对放大倍数进行动画处理,请使用对象的动画器。默认值是1.0。(https:/developer.apple.comdocumentationappkitnsscrollview1403497-magnification?语言=objc。)
什么叫'使用对象的动画器'?
而不是:
self.scrollView.setMagnification(magnification, centeredAt: point)
而不是:"调用它的动画器
self.scrollView.animator().setMagnification(magnification, centeredAt: point)