Позволить NSSlider двигаться другими путями?

Я пытаюсь понять, как сделать слайд без перетаскивания. Обычно, когда я хочу изменить значения с помощью ползунка, я делаю либо «щелкните левой кнопкой мыши в любом месте поля ползунка», либо непрерывно «щелкните левой кнопкой мыши ручку и перетащите ее». Что я хотел бы сделать, так это изменить значения туда, где «курсор мыши помещается» на ползунок без щелчка или перетаскивания, чтобы только перемещение курсора мыши позволяло мне изменять значения.

Я искал и копался в NSControl, NSEvent (MouseDown), а также в NSSlider, и я думаю, что метод «mousedown» в NSControl — это тот, который я хочу как-то исправить, но не знаю, как это сделать.

Буду признателен за ответы. Заранее большое спасибо.


person user2549858    schedule 05.07.2013    source источник


Ответы (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
}
person Parag Bafna    schedule 05.07.2013
comment
Фантастический пример, большое спасибо. Я сделал то же самое, однако я не могу перемещать ползунок без щелчка. Позвольте мне понять, что вы говорите Встроить свой NSSlider в NSView: 1. Выберите любой слайдер из библиотеки внизу справа и поместите его в окно 2. Выберите «Редактор» -> «Встроить» -> «Пользовательский вид», правильно? Есть ли что-то особенное, что мне нужно сделать, кроме встраивания и кодирования? Ну проблема я думаю в том, что мой PBView (встроенный в слайдер) ни с чем не связан (судя по инспектору соединений), а у вас есть. Не подскажете куда/как его подключить? - person user2549858; 08.07.2013
comment
изменить класс Custom View на PBView (NSView-->PBView) - person Parag Bafna; 08.07.2013
comment
Большое спасибо за быстрый ответ. Я уже сделал это, но это не сработало. Но теперь я понял, как; в объектах делегата приложения в IB я перетаскиваю владельца файла в PBView, и это сработало. Мне нужно изучить, почему это сработало. Однако еще одна проблема заключается в том, что ручка ползунка не будет двигаться, пока я не переведу мышь горизонтально. Я хочу, чтобы ручка двигалась, когда я двигаю мышь вверх-вниз. Будет ли решение лежать в функции createTrackingArea? Извините за вопросы, но не могли бы вы дать мне совет, как исправить функцию (ы), чтобы делать то же самое с помощью вертикального ползунка, если вы не возражаете? - person user2549858; 08.07.2013
comment
Я получил решение, следуя вашему совету. Поскольку значение ползунка зависит от переменной значения int в функции sliderValueChanged, которая определяется положением мыши, настройка значения позволяет мне соответствующим образом установить громкость. Большое спасибо, мистер Бафна. Вы мне очень помогли!! - person user2549858; 09.07.2013