8

我需要在更大的滚动窗口内固定大小的 NSTextViews。IB 要求 textviews 位于它们自己的 NSScrollViews 中,即使它们的最小/最大尺寸是固定的,因此它们实际上不会滚动。当在 textview 框架内进行触控板手势时(无论它们是否有焦点),它们会被 textview 的滚动视图捕获,因此不会发生任何事情。

如何告诉文本视图的滚动视图将滚动事件传递到窗口的主滚动视图?(或者我应该问我如何告诉窗口的主滚动视图自己处理这些事件,而不是将它们传递给它的子滚动视图。)

IB结构是这样的:

  • 窗户
    • 窗口的内容视图
      • 窗口的大滚动视图(滚动事件的所需目标)
        • 盒子
          • 单独的 xib 中的可交换内容视图
            • 文本视图的滚动视图
              • 文本视图
而且,是的,当文本视图没有焦点 时,窗口确实可以正确滚动。

4

5 回答 5

11

你不需要创建一个出口“svActive”来跟踪你的超级滚动视图。只需在 scrollWheel 事件中写下这句话:

[[self nextResponder] scrollWheel:event];

这会将事件传递给响应者链中的下一个响应者。

于 2011-10-17T02:53:14.453 回答
7

IB 不要求您在NSScrollView;中有一个文本视图。这只是默认设置,因为大多数时候您会希望视图滚动。选择NSTextView并选择布局 > 取消嵌入对象。请注意,在此之后,您不能再在 IB 中移动或调整视图大小。这似乎是一个错误。

这是一个如何将两个NSTextViews放在一个NSScrollView.

添加两个相邻的文本视图;在其中添加一些文本,以便您查看正在发生的事情。

选择视图;选择“布局”>“将对象嵌入到”>“滚动视图”。这将它们放在一个泛型NSViewNSScrollView

选择文本视图;选择布局 > 取消嵌入对象。

关闭每个文本视图的弹簧和支柱(自动调整大小),因此当您缩小滚动视图时它们不会调整大小。

记下文档视图的高度(这里是 175)。

使滚动视图更小。这也会调整文档视图 ( NSView) 的大小。

将文档视图恢复到其原始大小(我将高度设置回 175)。

完毕!滚动按您的预期工作。

于 2011-06-10T02:40:49.620 回答
3

这真的很尴尬。在推迟了数周之后,我第一次尝试让子类 NSScrollView 被动地表现——结果证明这是一个明智的选择。

这是子类:

h 文件:

#import <Cocoa/Cocoa.h>

@interface ScrollViewPassive : NSScrollView {

// This property is assigned a ref to windowController’s main scrollview.
NSScrollView *svActive; 

}

@property (nonatomic, retain) NSScrollView *svActive;

@end

.m 文件:

#import "ScrollViewPassive.h"

@implementation ScrollViewPassive

@synthesize svActive;

// Pass any gesture scrolling up to the main, active scrollview.
- (void)scrollWheel:(NSEvent *)event {
    [svActive scrollWheel:event];
}

@end

没有必要为这些被动滚动视图创建出口;在他们的 xib 被分配为 NSBox 的内容后,我立即将他们的 refs 提供给主滚动视图:

    [self.boxDisplayingTextViews setContentView:self.subviewCtllr1.view];
    // A textview's superview's superview is its scrollview:    
    ((ScrollViewPassive *)[[self.subviewCtllr1.textview1 superview] superview]).svActive = self.scrollviewMain;

就是这样。奇迹般有效。

于 2011-06-25T17:39:03.027 回答
1

我发现如果您尝试直接执行此操作,IB3 和 Xcode4 都会与您发生冲突,但您可以间接执行此操作。首先,将textview拖出scrollview并删除scrollview。你最终会得到一个孤立的文本视图。我不知道有什么方法可以让 IB 允许你把它放到你的窗口中,但它会在你的 NIB 中。现在,将一个 IBOutlet 附加到它,并在运行时执行 aaddSubview:并调整其框架以将其移动到您希望它所在的任何滚动视图中。

根据我的经验,NIB 是一件好事,但是我曾经使用过的每个复杂的 NIB 都需要在代码中进行一些最终的重新排列。

于 2011-06-10T02:39:25.487 回答
1

根据@phaibin 的回答,这就是你在Swift 4.2中的做法。

首先,子类NSScrollView和覆盖scrollWheel

class ScrollThingy: NSScrollView{
  override func scrollWheel(with event: NSEvent) {
    self.nextResponder?.scrollWheel(with: event)
  }
}

然后将ScrollThingy类(或任何你命名的类)放在NSScrollView包裹在你的NSTextView. 此后,父NSScrollView级将获得滚动事件。

于 2019-02-05T21:27:45.837 回答