桌面和屏幕保护程序 -> 屏幕保护程序 -> 启动屏幕保护程序中创建与 slider 完全一样工作的自定义 NSSlider:? 我尝试使用重写的 continueTrack-6ren">
gpt4 book ai didi

objective-c - 在系统偏好设置中热创建自定义 NSSlider,如 "Start screen saver:" slider

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:04 28 4
gpt4 key购买 nike

如何在系统偏好设置 -> 桌面和屏幕保护程序 -> 屏幕保护程序 -> 启动屏幕保护程序中创建与 slider 完全一样工作的自定义 NSSlider:?

我尝试使用重写的 continueTracking: 对 NSSliderCell 进行子类化:但它没有按预期工作。

最佳答案

我玩了一会儿,至少从 NSSliderCell 子类开始了一个不错的开始。

MDSliderCell.h:

#import <Cocoa/Cocoa.h>

@interface MDSliderCell : NSSliderCell {
BOOL tracking;
}

@end

MDSliderCell.m:

#import "MDSliderCell.h"

@implementation MDSliderCell

- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView {
if ([self numberOfTickMarks] > 0) tracking = YES;
return [super startTrackingAt:startPoint inView:controlView];
}

#define MD_SNAPPING 10.0

- (BOOL)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint
inView:(NSView *)controlView {
if (tracking) {
NSUInteger count = [self numberOfTickMarks];
for (NSUInteger i = 0; i < count; i++) {
NSRect tickMarkRect = [self rectOfTickMarkAtIndex:i];
if (ABS(tickMarkRect.origin.x - currentPoint.x) <= MD_SNAPPING) {
[self setAllowsTickMarkValuesOnly:YES];
} else if (ABS(tickMarkRect.origin.x - currentPoint.x) >= MD_SNAPPING &&
ABS(tickMarkRect.origin.x - currentPoint.x) <= MD_SNAPPING *2) {
[self setAllowsTickMarkValuesOnly:NO];
}
}
}
return [super continueTracking:lastPoint at:currentPoint inView:controlView];
}

- (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint
inView:(NSView *)controlView mouseIsUp:(BOOL)flag {
[super stopTracking:lastPoint at:stopPoint inView:controlView mouseIsUp:flag];
}

@end

基本上,在 -continueTracking:at:inView: 期间,它会检查它与刻度线的距离有多近,如果足够近,它会打开仅允许刻度线的选项标记值。这会导致它捕捉到刻度线,然后一旦你离得足够远,你就关闭“仅刻度线”选项,直到你足够接近另一个刻度线。

关于objective-c - 在系统偏好设置中热创建自定义 NSSlider,如 "Start screen saver:" slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843699/

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