如何将滚动事件传递给父NSScrollView

Wie*_*nke 7 cocoa nsevent nsscrollview

我需要一个更大的滚动窗口内的固定大小的NSTextViews.IB要求textviews位于他们自己的NSScrollViews中,即使他们的最小/最大大小是固定的,以便它们实际上不会滚动.当在textview框架内制作触控板手势时(无论它们是否具有焦点),它们都会被textview的scrollview捕获,因此没有任何反应.

如何告诉textviews的scrollview将滚动事件传递到窗口的主滚动视图?(或许我应该问我如何告诉窗口的主滚动视图本身处理这些事件,而不是将它们传递给它的子滚动视图.)

IB结构是这样的:

  • 窗口
    • 窗口的内容视图
      • 窗口的大滚动视图(滚动事件的期望目标)
          • 单独的xib中的可交换内容视图
            • 用于textview的scrollview
              • 的TextView
并且,是的,当文本视图没有焦点时,窗口会正确滚动.

pha*_*bin 11

您无需创建插座"svActive"来跟踪您的超级滚动视图.只需在scrollWheel事件中写下这句话:

[[self nextResponder] scrollWheel:event];
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*ley 7

IB不要求你有一个文本视图NSScrollView; 这只是默认设置,因为大多数情况下您都希望视图滚动.选择NSTextView并选择Layout> Unembed Objects.请注意,在此之后,您无法再在IB中移动视图或调整视图大小.这似乎是一个错误.

这是一个如何将两个NSTextViews放在一个单元中的示例NSScrollView.

添加两个文本视图彼此相邻; 在其中加入一些文字,这样你就可以看到发生了什么.

选择视图; 选择"布局">"嵌入对象">"滚动视图".这将它们放在一个通用的NSView内部NSScrollView.

选择文本视图; 选择Layout> Unembed Objects.

关闭每个文本视图的弹簧和支柱(自动调整大小),以便在缩小滚动视图时不调整大小.

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

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

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

完成!滚动按预期工作.


Wie*_*nke 3

这实在是太尴尬了。经过几周的推迟,我第一次尝试让子类 NSScrollView 被动地表现 \xe2\x80\x94 ,结果证明这是理所当然的。

\n\n

这里\xe2\x80\x99是子类:

\n\n

.h 文件:

\n\n
#import <Cocoa/Cocoa.h>\n\n@interface ScrollViewPassive : NSScrollView {\n\n// This property is assigned a ref to windowController\xe2\x80\x99s main scrollview.\nNSScrollView *svActive; \n\n}\n\n@property (nonatomic, retain) NSScrollView *svActive;\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

.m 文件:

\n\n
#import "ScrollViewPassive.h"\n\n@implementation ScrollViewPassive\n\n@synthesize svActive;\n\n// Pass any gesture scrolling up to the main, active scrollview.\n- (void)scrollWheel:(NSEvent *)event {\n    [svActive scrollWheel:event];\n}\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x99s 不需要为这些被动滚动视图创建出口;在将 xib 作为内容分配给 NSBox 后,我立即向他们提供对主滚动视图的引用:

\n\n
    [self.boxDisplayingTextViews setContentView:self.subviewCtllr1.view];\n    // A textview\'s superview\'s superview is its scrollview:    \n    ((ScrollViewPassive *)[[self.subviewCtllr1.textview1 superview] superview]).svActive = self.scrollviewMain;\n
Run Code Online (Sandbox Code Playgroud)\n\n

那\xe2\x80\x99就是它。奇迹般有效。

\n