如何通过滚动事件于母公司NSScrollView

问题描述 投票:7回答:5

我需要一个更大的滚动窗口内固定大小的NSTextViews。 IB要求textviews是自己NSScrollViews内,即使他们的最小/最大尺寸是固定的,使它们实际上不会滚动。当触控板手势TextView的框架内进行的(不管他们是否具有焦点),它们是由textviews’ scrollviews拍摄,所以什么也没发生。

我该如何告诉textviews’ scrollviews通过滚动事件到窗口的滚动型为主? (也许我应该问我怎么告诉窗口的滚动型主要用于处理这些事件本身,而不是将它们传递到其子scrollviews。)

IB的结构是这样的:

  • 窗口 窗口的内容视图 大的滚动视图窗口(滚动事件所需的目标) 框 在单独的XIB交换内容视图 滚动型对的TextView 的TextView
And, yes, the window does scroll correctly when the textviews do not have focus.
cocoa nsscrollview nsevent
5个回答
11
投票

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

[[self nextResponder] scrollWheel:event];

这将传递事件到下一个响应者在响应链。


7
投票

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

下面是如何将两个NSTextViews单一NSScrollView的例子。

添加相邻两个文本的意见;把一些文字里面,这样你可以看到发生了什么。

选择的意见;选择布局>嵌入对象在>滚动查看。这使他们在一个NSView内的通用NSScrollView

选择文本的意见;选择布局>取消嵌入对象。

关闭弹簧和支柱(自动调整大小)对于每个文本视图,所以当你缩小滚动视图,他们不会进行调整。

就拿文档视图的高度的说明(这里是175)。

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

还原文档视图到其原始大小(我设定的高度回175)。

完成!滚动的作品,你会期望。


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

有没有必要为这些被动scrollviews网点;我给他们的裁判到主滚动型之后他们xibs被指定为内容的NSBox:

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

而已。奇迹般有效。


1
投票

我发现,IB3和Xcode4都打你,如果你想直接做到这一点,但你可以间接地做到这一点。首先,拖动TextView的出滚动视图,并删除了滚动。你会用一个孤立的TextView拉闸。我不知道有什么办法让IB让你把这个到你的窗口,但它会在你的NIB。现在,附加一个IBOutlet到它,并在运行时做了addSubview:并调整其框架将其移动到你希望它以什么滚动视图。

根据我的经验,发钞银行是一个很好的事情,但每一个复杂的NIB我曾经在代码需要一些清理最后的工作。


0
投票

根据@ phaibin的答案,这里是你如何做到这一点的雨燕4.2。

首先,子类NSScrollView并重写scrollWheel

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

然后把ScrollThingy类(或任何你的名字)上是围绕你的NSScrollView包裹NSTextView。父NSScrollView其后将得到滚动事件。

© www.soinside.com 2019 - 2024. All rights reserved.