我在Mac应用程序中有一个表单,需要滚动。我在ViewController中嵌入了一个ViewController。我为scrollView分配了一个标识符,该标识符将其链接到自己的NSScrollView文件。约束设置在视图控制器的顶部、右侧和左侧,它还将hight约束设置为ViewController的完全高度。
这是我的代码:
import Cocoa
class ScrollView: NSScrollView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
NSRect documentView.NSMakeSize(0, 0, 1058.width, 1232.height)
}
override func scrollWheel(with event: NSEvent) {
switch event.phase {
case NSEvent.Phase.began:
Swift.print("Began")
// case NSEvent.Phase.changed:
// Swift.print("Changed")
case NSEvent.Phase.ended:
Swift.print("Ended")
default:
break
}
switch event.momentumPhase {
case NSEvent.Phase.began:
Swift.print("Momentum Began")
// case NSEvent.Phase.changed:
// Swift.print("Momentum Changed")
case NSEvent.Phase.ended:
Swift.print("Momentum Ended")
default:
break
}
super.scrollWheel(with: event)
}我似乎根本无法让我的应用程序滚动。我想我没有正确地设置框架。正确设置框架的最佳方法是什么?我对NSScrollView的编码正确吗?
发布于 2018-10-29 23:43:52
我认为你让你的生活变得很艰难,因为你所做的事情并不完全是苹果推荐的。首先,不应该使用子类NSScrollView。相反,您应该先阅读苹果的Cocoa滚动视图编程指南简介,了解如何为NSScrollView正确工作创建正确的视图层次结构。
第二个建议是检查这个好文章如何在操场上设置NSScrollView,这样您就可以使用想要实现的代码了。
第三,使用Autolayout和NSScrollView给很多人带来了很多痛苦。您需要正确地设置AutoLayout,以便一切都能像预期的那样工作。我建议您通过Ken检查这个回答,这清楚地解释了如何设置自动布局约束以使NSScrollView正常工作。
发布于 2018-11-08 04:44:02
我刚刚克服了“驼峰”与NSScrollView在一个NSWindow。为了进行滚动,NSScrollview内部的视图需要大于内容窗口。这很难用动态约束来设置。静态地将内部视图设置为比窗口“工作”更大的宽度/高度,但是静态大小通常不是您想要的。
下面是我的接口生成器视图层次结构和约束,不包括以编程方式添加的框。
在我的应用程序中,用户在mainView中添加"boxes“(自定义可拖视图),而后者位于NSwindow的滚动视图中。
下面是我想要的功能:
我发现诀窍是根据每个可拖框视图的最大角或nswindow的内容帧的高度/宽度来计算我想要的mainView的大小,以较大者为准。
下面是我的代码,包括一些调试打印。
请注意用于计算最大大小的子视图。如果您包含一个动态地附加到窗口右侧/顶部的子视图,那么您的窗口将永远不会缩小。如果在其中添加+20边框,则可能会有无限循环。对我来说没什么问题。
extension MapWindowController: NSWindowDelegate {
func windowDidEndLiveResize(_ notification: Notification) {
if let frame = window?.frame, let content = window?.contentRect(forFrameRect: frame) {
print("window did resize \(frame)")
var maxX: CGFloat = content.width
var maxY: CGFloat = content.height
for view in mainView?.subviews ?? [] {
let frameMaxX = view.frame.maxX + minBorder
let frameMaxY = view.frame.maxY + minBorder
if frameMaxX > maxX {
maxX = frameMaxX
}
if frameMaxY > maxY {
maxY = frameMaxY
}
}
print("view maxX \(maxX) maxY \(maxY)")
print("window width \(content.width) height \(content.height)")
mainView?.setFrameSize(NSSize(width: maxX, height: maxY))
}
}
}https://stackoverflow.com/questions/53052045
复制相似问题