【问题标题】:How can I make my NSScroller subclass have a different width?如何使我的 NSScroller 子类具有不同的宽度?
【发布时间】:2010-07-24 14:12:26
【问题描述】:

我正在尝试创建 NSScroller 的自定义子类。我已经创建了该类,并将其设置为 IB 中 NSScrollView 上的垂直滚动条。当我运行我的项目时,会为我的子类调用drawRect: 方法,因此我知道它已正确连接。

现在,如何更改我喜欢的新 NSScroller 的宽度?无论我对它的边界和框架做什么,它总是想在一个 15 像素宽的矩形中绘制(默认 NSScroller 的大小)。

【问题讨论】:

    标签: cocoa


    【解决方案1】:

    在您的 NSScroller 子类中,您必须覆盖 scrollerWidth:

    +(CGFloat)scrollerWidth
    {
        return 30.0;
    }
    

    这是 NSScrollView 在设置组件时用来定义组件框架的值。

    【讨论】:

    • 我试过重写这个方法,但问题是 NSScrollview 总是在 NSScroller 上调用这个类方法,而不是我的自定义子类。 NSScrollView 中有一个私有的 _verticalScrollerClass 变量可以更改,但不支持覆盖私有变量。
    • 嗯...这可能是因为它被 IB 以该(原始)大小存档。您是否尝试过以编程方式设置它以查看是否有帮助?
    • 我有。我读过的所有内容都表明,覆盖私有 ivar 是唯一的方法。我最终只是创建了自己的视图来复制滚动条功能并完全隐藏了默认滚动条。
    【解决方案2】:

    您可以使用类别来覆盖所有 NSScrollers 的滚动条宽度方法。

    例如。在 NSScroller-MyScroller.h 中:

    #import <Cocoa/Cocoa.h>
    
    @interface NSScroller (MyScroller)
    
    + (CGFloat)scrollerWidth;
    + (CGFloat)scrollerWidthForControlSize: (NSControlSize)controlSize;
    
    @end
    

    在 NSScroller-MyScroller.m 中:

    #import "NSScroller-MyScroller.h"
    #define SCROLLER_WIDTH 30.0
    
    @implementation NSScroller (MyScroller)
    
    + (CGFloat)scrollerWidth {
        return SCROLLER_WIDTH;
    }
    
    + (CGFloat)scrollerWidthForControlSize: (NSControlSize)controlSize {
        return SCROLLER_WIDTH;
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2021-07-24
      • 1970-01-01
      • 2013-11-28
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多