【问题标题】:Let NSSlider move in other ways?让 NSSlider 以其他方式移动?
【发布时间】:2013-07-05 08:19:20
【问题描述】:

我想弄清楚如何在不拖动的情况下进行滑动动作。 通常,当我想使用滑块更改值时,我会执行“左键单击滑块字段上的任意位置”或连续“左键单击旋钮并拖动它”。 我想要做的是将值更改为“鼠标光标放在”滑块上的任何位置,而无需单击或拖动,这样只有移动鼠标光标才能更改值。

我已经查找并一直在深入研究 NSControl、NSEvent(MouseDown) 以及 NSSlider,我猜 NSControl 中的“mousedown”方法是我想以某种方式修复的方法,但不知道具体该怎么做.

我将不胜感激。 非常感谢您。

【问题讨论】:

    标签: objective-c macos cocoa nsslider nscontrol


    【解决方案1】:

    NSSlider 嵌入NSView

    继承NSView并捕捉鼠标移动事件

    @interface PBView : NSView {
        id delegate;
    }
    
    @property (assign)id delegate;
    @end
    
    @implementation PBView
    @synthesize delegate;
    
    -(void) mouseMoved: (NSEvent *) thisEvent
    {
        NSPoint cursorPoint = [ thisEvent locationInWindow ];
        [delegate sliderValueChanged];
    }
    - (void)createTrackingArea
    {
        NSTrackingAreaOptions focusTrackingAreaOptions = NSTrackingMouseMoved;
        focusTrackingAreaOptions |= NSTrackingActiveInActiveApp;
        focusTrackingAreaOptions |= NSTrackingMouseEnteredAndExited;
        focusTrackingAreaOptions |= NSTrackingAssumeInside;
        focusTrackingAreaOptions |= NSTrackingInVisibleRect;
    
        NSTrackingArea *focusTrackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect
                                                                         options:focusTrackingAreaOptions owner:self userInfo:nil];
        [self addTrackingArea:focusTrackingArea];
    }
    
    
    - (void)awakeFromNib
    {
        [self createTrackingArea];
    }
    @end
    

    现在实施

    -(void)sliderValueChanged
    {
        NSPoint mouseLoc;
        mouseLoc = [NSEvent mouseLocation]; // mouse location
    
        NSRect r= [window frame];// window location
        NSLog(@"%@", NSStringFromPoint(r.origin));
    
        NSLog(@"%@",    NSStringFromPoint(mouseLoc));
        [silder setIntValue:(mouseLoc.x -r.origin.x)];//silder is object of NSSlider
    }
    

    【讨论】:

    • 很棒的例子,非常感谢。我做了完全相同的事情,但是,我不能在不点击的情况下移动滑块。让我理解,您所说的“在 NSView 中嵌入您的 NSSlider”是: 1. 从库右下角选择任何滑块并将其放在窗口上 2. 选择编辑器 -> 嵌入 -> 自定义视图对吗?除了嵌入和编码之外,我还需要做什么特别的事情吗?好吧,我认为的问题是我的 PBView(嵌入在滑块中)没有与任何东西连接(从连接检查器来看),尽管你的是。你能告诉我在哪里/如何连接它吗?
    • 将自定义视图类更改为 PBView (NSView-->PBView)
    • 非常感谢您的快速回复。我已经这样做了,但是没有用。但现在我知道了;在 IB 的应用程序委托对象中,我将“文件的所有者”拖到 PBView 并且它起作用了。我需要研究为什么它会起作用。但是,另一个问题是除非我水平移动鼠标,否则滑块旋钮不会移动。当我上下移动鼠标时,我希望旋钮移动。解决方案是否存在于函数“createTrackingArea”中?很抱歉有问题,但是如果您不介意的话,您能给我建议如何通过使用垂直滑块来更正功能以执行相同的操作吗?
    • 我按照您的建议得到了解决方案。由于滑块值取决于 sliderValueChanged 函数中的“int value”变量,该变量由鼠标位置确定,调整“value”使我能够适当地设置音量。非常感谢巴夫纳先生。你帮了我很多!
    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2023-03-12
    • 2017-12-02
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多