下面是我用来设置滚动视图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)
}发布于 2020-06-17 13:20:14
有一个使用泛型'animated‘的简单方法。
文档中的内容:要设置放大动画,请使用对象的动画器。默认值为1.0。(https://developer.apple.com/documentation/appkit/nsscrollview/1403497-magnification?language=objc)
“使用对象的动画制作”是什么意思?
而不是:
self.scrollView.setMagnification(magnification, centeredAt: point)调用它的动画师:
self.scrollView.animator().setMagnification(magnification, centeredAt: point)发布于 2020-05-27 07:14:40
好的,把所有这些都扔掉,然后做这个……令人抓狂的速度,流畅,所有底层的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)
}
}https://stackoverflow.com/questions/62032442
复制相似问题