首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSScrollView不滚动

NSScrollView不滚动
EN

Stack Overflow用户
提问于 2018-10-29 18:53:32
回答 2查看 1.7K关注 0票数 1

我在Mac应用程序中有一个表单,需要滚动。我在ViewController中嵌入了一个ViewController。我为scrollView分配了一个标识符,该标识符将其链接到自己的NSScrollView文件。约束设置在视图控制器的顶部、右侧和左侧,它还将hight约束设置为ViewController的完全高度。

这是我的代码:

代码语言:javascript
运行
复制
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的编码正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-29 23:43:52

我认为你让你的生活变得很艰难,因为你所做的事情并不完全是苹果推荐的。首先,不应该使用子类NSScrollView。相反,您应该先阅读苹果的Cocoa滚动视图编程指南简介,了解如何为NSScrollView正确工作创建正确的视图层次结构。

第二个建议是检查这个好文章如何在操场上设置NSScrollView,这样您就可以使用想要实现的代码了。

第三,使用Autolayout和NSScrollView给很多人带来了很多痛苦。您需要正确地设置AutoLayout,以便一切都能像预期的那样工作。我建议您通过Ken检查这个回答,这清楚地解释了如何设置自动布局约束以使NSScrollView正常工作。

票数 4
EN

Stack Overflow用户

发布于 2018-11-08 04:44:02

我刚刚克服了“驼峰”与NSScrollView在一个NSWindow。为了进行滚动,NSScrollview内部的视图需要大于内容窗口。这很难用动态约束来设置。静态地将内部视图设置为比窗口“工作”更大的宽度/高度,但是静态大小通常不是您想要的。

下面是我的接口生成器视图层次结构和约束,不包括以编程方式添加的框。

在我的应用程序中,用户在mainView中添加"boxes“(自定义可拖视图),而后者位于NSwindow的滚动视图中。

下面是我想要的功能:

  1. 如果展开NSWindow,则希望滚动视图中的mainView展开以填充整个窗口。如果所有的框都是可见的,则不需要滚动。
  2. 如果我缩小NSWindow,我希望滚动视图中的mainView只需要缩小到包含所有的mainView子视图(“not”),而不是更多(我添加了一个20的minBorder )。如果一个盒子的位置比nswindow的宽度/高度更右/更高,这就会导致滚动。

我发现诀窍是根据每个可拖框视图的最大角或nswindow的内容帧的高度/宽度来计算我想要的mainView的大小,以较大者为准。

下面是我的代码,包括一些调试打印。

请注意用于计算最大大小的子视图。如果您包含一个动态地附加到窗口右侧/顶部的子视图,那么您的窗口将永远不会缩小。如果在其中添加+20边框,则可能会有无限循环。对我来说没什么问题。

代码语言:javascript
运行
复制
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))
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53052045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档