gpt4 book ai didi

cocoa - 自定义 NSSliderCell 旋钮在跟踪时不跟随鼠标

转载 作者:行者123 更新时间:2023-12-03 16:29:34 26 4
gpt4 key购买 nike

我实现了一个自定义 NSSliderCell,它使用的旋钮大小与默认旋钮非常不同(这是为了交互式展览 - 我无法使用任何默认的 Mac OS X 控件)。

虽然 slider 出现并且行为正确(旋钮从一端移动到另一端等),但当您仔细观察时,您会看到一个奇怪的行为:移动鼠标,例如 20 像素,将导致旋钮移动 30 像素。这意味着旋钮可能会在鼠标到达 slider 末端之前到达 slider 末端(并且 slider 将具有最大值)。

这看起来很奇怪并且违背了所有人的期望。我想知道我必须改变什么才能确保旋钮跟随鼠标并且不会移动得更快。

最佳答案

好吧,一如既往,解决方案是最简单的。

这是您需要拥有一个非常自定义的 slider 的最简单的代码:

#import "CSSSliderCell.h"
#define KNOB_WIDTH 20
#define KNOB_HEIGHT 126
#define SLIDER_WIDTH 13

@implementation CSSSliderCell

- (void)drawKnob:(NSRect)rect
{
// knobImage is an NSImage
[knobImage drawInRect:rect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

}

- (void)drawBarInside:(NSRect)cellFrame flipped:(BOOL)flipped
{
NSRect slideRect = cellFrame;
NSColor *backColor = [NSColor redColor];
if ([(NSSlider*) [self controlView] isVertical] == YES)
{
slideRect.size.width = SLIDER_WIDTH;
slideRect.origin.x += (cellFrame.size.width - SLIDER_WIDTH) * 0.5;
} else {
slideRect.size.height = SLIDER_WIDTH;
slideRect.origin.y += (cellFrame.size.height - SLIDER_WIDTH) * 0.5;
}

NSBezierPath *bezierPath = [NSBezierPath bezierPathWithRoundedRect:slideRect xRadius:SLIDER_WIDTH * 0.5 yRadius:SLIDER_WIDTH * 0.5];
[backColor setFill];
[bezierPath fill];

}


- (NSRect)knobRectFlipped:(BOOL)flipped{

CGFloat value = ([self doubleValue] - [self minValue])/ ([self maxValue] - [self minValue]);
NSRect defaultRect = [super knobRectFlipped:flipped];
NSRect myRect = NSMakeRect(0, 0, 0, 0);
if ([(NSSlider*) [self controlView] isVertical] == YES)
{
myRect.size.width = KNOB_WIDTH;
myRect.size.height = KNOB_HEIGHT;
if (!flipped) {
myRect.origin.y = value * ([[self controlView] frame].size.height - KNOB_HEIGHT);
} else {
myRect.origin.y = (1.0 - value) * ([[self controlView] frame].size.height - KNOB_HEIGHT);
}
myRect.origin.x = defaultRect.origin.x;

} else {
myRect.size.width = KNOB_HEIGHT;
myRect.size.height = KNOB_WIDTH;
myRect.origin.x = value * ([[self controlView] frame].size.width - KNOB_HEIGHT);
myRect.origin.y = defaultRect.origin.y;

}
return myRect;
}
- (BOOL)_usesCustomTrackImage
{
return YES;
}


@end

这可能会有问题,但到目前为止,在水平和垂直方向上它都运行良好。

关于cocoa - 自定义 NSSliderCell 旋钮在跟踪时不跟随鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7207945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com