cocoa NSScrollView 没有将 scrollWheel 事件传递给下一个响应者
cocoa NSScrollView not pass scrollWheel event to next responder
我的问题是,我不知道为什么 NSScrollView 没有将 scrollWheel 事件传递给下一个响应者。
我必须手动添加代码
class MyScrollView: NSScrollView {
override func scrollWheel(with event: NSEvent) {
super.scrollWheel(with: event)
// do something
// If you don't use these codes, the next responder will not receive the event.
if let responder = self.nextResponder {
responder.scrollWheel(with: event)
}
}
}
现在,我知道如何解决这个问题,但我不知道为什么会出现这个问题。
有没有人有关于这种情况的官方信息?
正如 Marek H 指出的那样,如果一个对象处理事件,那么它通常会使用该事件并且不会将其向上传递到响应者链。在这种情况下,如果 scrollView 滚动,那么它的 superView 绝对不应该对滚动事件做任何事情。
其次,重写 scrollWheel(with) 将关闭响应式滚动。
答案:您真正想要做的是在您的(自定义视图(NSView))class 中覆盖 func wantsForwardedScrollEvents(for axis: NSEvent.GestureAxis) -> Bool
。
https://developer.apple.com/documentation/appkit/nsresponder/1534209-wantsforwardedscrollevents
NSScrollView 将尊重这一点并转发 scrollWheel 事件,当它不以其他方式使用它们来实际滚动或橡皮筋时。此外,它还兼容响应式滚动。
我的问题是,我不知道为什么 NSScrollView 没有将 scrollWheel 事件传递给下一个响应者。
我必须手动添加代码
class MyScrollView: NSScrollView {
override func scrollWheel(with event: NSEvent) {
super.scrollWheel(with: event)
// do something
// If you don't use these codes, the next responder will not receive the event.
if let responder = self.nextResponder {
responder.scrollWheel(with: event)
}
}
}
现在,我知道如何解决这个问题,但我不知道为什么会出现这个问题。
有没有人有关于这种情况的官方信息?
正如 Marek H 指出的那样,如果一个对象处理事件,那么它通常会使用该事件并且不会将其向上传递到响应者链。在这种情况下,如果 scrollView 滚动,那么它的 superView 绝对不应该对滚动事件做任何事情。
其次,重写 scrollWheel(with) 将关闭响应式滚动。
答案:您真正想要做的是在您的(自定义视图(NSView))class 中覆盖 func wantsForwardedScrollEvents(for axis: NSEvent.GestureAxis) -> Bool
。
https://developer.apple.com/documentation/appkit/nsresponder/1534209-wantsforwardedscrollevents
NSScrollView 将尊重这一点并转发 scrollWheel 事件,当它不以其他方式使用它们来实际滚动或橡皮筋时。此外,它还兼容响应式滚动。