限制Cocoa中的滚动弹性(NSScrollView)

时间:2012-04-25 18:15:07

标签: cocoa mouseevent mousewheel appkit nsscrollview

我有一个包含十几个scrollViews的cocoa应用程序。我喜欢弹性,特别是在某些情况下,我实际上会放一些“复活节彩蛋”(有点像书籍应用程序中的苹果标志。你向下滚动,你会看到一个苹果标志。)

我的问题是,我需要将暴露内容的数量限制在实际内容区域之外。特别是当我用魔法鼠标滚动时,弹性会导致整个滚动内容消失!在您释放滚动之前,它会重新移回。

现在,我想将弹性限制在特定的范围内。如何?

1 个答案:

答案 0 :(得分:3)

NSScrollView管理一个视图,其“画布”大于任何时候可显示的画布。所以如果你想要一个不同的行为:

  • 检查(void)setHorizontalScrollElasticity:,但这并不是你想要的。 (你想允许固定的弹性量)
  • 子类NSScrollView以实现您想要的行为。
  • 从头开始创建自己的类(好吧......因为你想要处理事件所以继承自NSResponder的任何东西)。

例如,我曾经写过一个世界地图程序,但需要地图在水平轴上永远循环。我只是用子类NSView手动管理滚动。 (目前无法访问代码)

需要思考的事情:我理解你的理由,但只是想提一下。用户应该期望这种行为。如果它看起来像一个按钮,它应该表现得像。目前,scrollviews具有弹性,因此当它们通过动量滚动(用户不再触摸)时,它一旦到达终点就不会突然停止...这对用户来说是不和谐的。


示例
如果继承NSScrollview,我会尝试覆盖- (void)scrollWheel:(NSEvent *)并检测contentView的边界,并将其限制在某个值。有些东西:

- (void)scrollWheel:(NSEvent *)event
{
    [super scrollWheel:event];
    if (self.contentView.bounds.origin.y > SomeConstant)
         /* cap the value */
}