圆形NSSlider带停止(非连续)

时间:2010-04-30 20:10:18

标签: objective-c cocoa

我不确定如何更好地将其作为标题,但我需要制作一个可作为普通音量旋钮使用的NSSlider。此刻,当我按住鼠标并将其移动到控件周围时,它会旋转很多次。我需要它停在“0”位置和“100”位置,当我向另一个方向拖动时,我不能让它从0跳到100。我希望我明白这一点。有谁知道怎么做或有任何建议?

3 个答案:

答案 0 :(得分:2)

一个老问题,但无论如何我们都去了:

(1)将滑块设置为100个刻度

(2)选择“仅停留在刻度线”

(3)在Interface Builder中,将自定义单元格类设置为SBCustomSliderCell

使用以下代码:

@interface SBCustomSliderCell()

@property CGFloat lastSliderValue;

@end

@implementation SBCustomSliderCell

- (void)awakeFromNib
{
    self.lastSliderValue = -1;
}

- (double)closestTickMarkValueToValue:(double)value
{
    double proposedValue = [super closestTickMarkValueToValue:value];

    if (self.lastSliderValue == -1)
    {
        self.lastSliderValue = proposedValue;
        return proposedValue;
    }

    double MAX_JUMP = 50;

    double tickDifference = ABS(self.lastSliderValue - proposedValue);

    BOOL isTurningUp = proposedValue > self.lastSliderValue;

    if (tickDifference > MAX_JUMP)
    {
        proposedValue = isTurningUp ? 0.0 : self.maxValue;
    }

    NSLog(@"value: %.2f gap: %.2f", proposedValue, tickDifference);

    self.lastSliderValue = proposedValue;
    return proposedValue;
}

- (NSRect)rectOfTickMarkAtIndex:(NSInteger)index
{
    return NSZeroRect;
}

@end

答案 1 :(得分:0)

我认为您需要继承NSSliderCell并覆盖startTrackingAt:inView:continueTracking:at:inView:stopTracking:at:inView:mouseIsUp:

continueTracking:at:inView:的文档说:

在trackMouse:inRect:ofView:untilMouseUp:中调用此方法。如果单元格设置为在鼠标按钮关闭或拖动鼠标时不断向其目标发送操作消息,则默认实现返回YES。子类可以覆盖此方法以提供更复杂的跟踪行为。

答案 2 :(得分:0)

以下是如何在Swift中执行此操作

这个答案是基于Mark上面的“SBSLiderCell”答案,但是适用于Swift。

因为它是NSSliderCell的子类,所以一定要在Interface Builder中为单元格而不是NSSlider superview设置自定义类。

将刻度标记的数量设置为所需的粒度(例如:100),然后单击“仅在刻度线上停止”复选框。

Enter the number of Employee: 2
Enter the name of the employee 1: jeff
Enter the name of the employee 2: lita
                                    Sun Mon Tue Wed Thur Fri Sat
Enter hours worked for Employee 1:    4
6
7
5
8
7
9
Enter hours worked for Employee 2:    3
4
......