让 NSSlider 以其他方式移动?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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”使我能够适当地设置音量。非常感谢巴夫纳先生。你帮了我很多!

以上是关于让 NSSlider 以其他方式移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的移动平台上以相同的方式显示内容?

数据移动,未能继续以NOLOCK方式扫描!

让物体在开罗移动

如何以编程方式移动windows任务栏(取两个)

如何以编程方式在SVG中移动多边形?

在方法中以编程方式移动控件警告“未找到方法”和“控件可能无法响应”