热衷于创建自定义 NSSlider,例如“启动屏幕保护程序:”系统偏好设置中的滑块

发布于 2024-11-03 23:40:29 字数 147 浏览 10 评论 0原文

如何创建与系统偏好设置中的滑块完全相同的自定义 NSSlider ->台式机和屏幕保护程序 ->屏幕保护程序 ->启动屏幕保护程序: ?

我尝试使用重写的 continueTracking: 来子类 NSSliderCell:但它无法按预期工作。

How to create custom NSSlider that is working exactly as slider in System Preferences -> Desktop & Screen Saver -> Screen Saver -> Start screen saver: ?

I tried to subclass NSSliderCell with overridden continueTracking: but it don't work as expected.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇俏 2024-11-10 23:40:29

我尝试了一下,至少从 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: 期间,它会检查它与刻度线,如果足够接近,则会打开仅允许刻度线值的选项。这会导致它捕捉到刻度线,然后一旦你距离足够远,你就关闭“仅刻度线”选项,直到你足够接近另一个刻度线。

I played around for a bit and at least got off to a pretty good start with an NSSliderCell subclass.

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

Basically, during the -continueTracking:at:inView:, it checks to see how close it is to a tick mark, and if it's close enough, it turns on the option to only allow tick mark values. That causes it to snap to the tick mark, then once you get far enough away, you turn the "tick mark-only" option off until you get close enough to another tick mark.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文