【问题标题】:Modifying the length of an NSScroller修改 NSScroller 的长度
【发布时间】:2011-08-16 08:22:21
【问题描述】:

我在我的 Cocoa 应用程序中使用 NSScrollView,我想自定义水平滚动条的长度。滚动视图的内容分为两个主要区域:左侧的固定宽度区域和右侧的动态宽度区域。左侧区域仅垂直滚动——当用户左右滚动时,它保持固定在视图的左侧。这是正在滚动的视图的屏幕截图:

http://jarodlong.com/dropbox/nsscroller_issue.png

我不希望水平滚动条与左侧的固定区域重叠。它应该被限制在右边的区域。

有没有办法在不继承 NSScrollView 的情况下做到这一点?我真的希望不必子类化,但如果有必要,这样做时我应该注意什么?

我尝试只设置水平滚动条的框架,但我认为 NSScrollView 会不断调整滚动条的大小以适应整个区域。

【问题讨论】:

    标签: objective-c cocoa macos nsscrollview nsscroller


    【解决方案1】:

    我认为在这种情况下我会使用两个单独的滚动视图,一个在另一个里面。

    好的,我和朋友核实了一下,结果发现在 Lion 上,NSScrollview 中仍然有 NSScroller 实例,尽管它们是在 GL 表面上绘制的。未经测试,但这样的事情应该可以解决问题:

    @implementation MyScrollView : NSScrollView
    
    - (void) tile
    {
    [super tile];
    id scroller = [self horizontalScroller];
    NSRect scrollerRect = [scroller frame];
       // adjust scrollerRect as you want to here
    [scroller setFrame:scrollerRect];
    }
    

    【讨论】:

    • 如果我从一开始就考虑这样做,那可能是最好的方法,但所有内容都是一个视图,重构它需要相当多的工作此时进入多个视图。除了滚动条的大小外,一切都完美无缺,所以如果有一种方法可以调整滚动条的大小,这似乎是目前最简单的解决方案。
    • 好吧,回到 Snow Leopard,你可以继承 NSScrollview 并覆盖 -tile,但我不确定新的自动隐藏滚动条仍然是 NSScroller 实例。
    • 实际上效果很好!我不知何故错过了 tile 方法(可能是因为名称并不能很好地说明其用途),但新的 Lion 滚动条似乎仍然是 NSScrollers。
    • 编辑到您的答案中的代码效果很好。非常感谢!
    【解决方案2】:

    我会在您的窗口中添加两个 NSScrollView。左边一个只支持垂直滚动,右边一个支持水平滚动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 2017-02-28
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2015-05-31
      相关资源
      最近更新 更多